汉字编程 —— 第一次个人编程作业

这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系)
这个作业要求在哪里 第一次个人编程作业
这个作业的目标 汉字编程
作业正文 我的GitHub仓库地址
其他参考文献 汉字输出问题

记录

  • 代码行数:114
  • 需求分析时间:15min+
  • 编码时间:8h+

问题和注意点

  1. ~~只能输入一位数(零十)~已解决
    • value.substr(i, 2)取一个汉字
  2. 没判断变量名是否正确已解决
    • if (!mp.count(var)) continue;如果是不存在的变量名,我就假装没看到跳过。
  3. 没考虑负数情况已解决
  4. mp[var]判断var是否存在,没考虑到值为0的情况已解决
    • 改成mp.count(var)
  5. 输出大于10的数的表示方式
    • 18用一八表示
    • 2020用二零二零表示
  6. 忽略了一些不重要的字眼,如“整数”、“等于”、“则”、“否则”
  7. 开头不一定要定义变量,也可以先看看 “字符串”

不会的知识

ASCII码中,一个字母占1Byte,而一个汉字占2Byte我不知如何从汉字字符串中取一个汉字,所以每次只能输入一位数
改进:

  • value.substr(i, 2)取一个汉字,因为一个汉字占2Byte
  • 若使用C,则可以printf("%c%c", value[i],value[i+1])输出一个汉字。

思路

编程语言:C/C++
定义变量时,发现“整数”和“等于”之后都没用到,所以只保留变量名var和数字值value。
将汉字数字值转化成整型,存储到map容器中。
while (cin >> word)可以一直读入一个词语,根据这个词的值分别进行以下处理:
如果word == "整数",则加入到map容器中,并赋值。
如果word == "看看",则输出。若值为负数,则输出“负”。用num[]对应sum的每一位数字。
如果word == "如果"
根据观察,则后面共五个词语,若s1 == "看看",输出去掉头尾双引号的子串;否则,进行相应的加减操作。
如果mp.count(word),word是已存在的变量,进行加减操作。

看看 “字符串”的处理

如果该变量不存在,则判断头尾是否有双引号。若有,则输出去除双引号的字符串;若无,则输出无此变量并跳过。

map<string, int> mp; 

if (!mp.count(var)) {
	if (var[0] == '"' && var[var.size()-1] == '"') 
		cout << var.substr(1,var.size()-2) << endl;
	else if (var.substr(0,2) == "“" && var.substr(var.size()-2,2) == "”") 
		cout << var.substr(2,var.size()-4) << endl; 
	else cout << "无此变量:" << var << endl; 
	continue; // 跳过计算步骤 
}

代码

Github代码地址,目前第8版本。

#include <bits/stdc++.h> // 万能头文件 
using namespace std;
map<string, int> mp; 
string num[11] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
int toint(string value) { // toint函数将 汉字 转成 整数
	int len = value.size(), ret = 0; 
	for (int i = 0; i < len; i+=2) {
		if (value.substr(i, 2) == "零") ret = ret*10 + 0; 
		if (value.substr(i, 2) == "一") ret = ret*10 + 1; 
		if (value.substr(i, 2) == "二") ret = ret*10 + 2; 
		if (value.substr(i, 2) == "三") ret = ret*10 + 3; 
		if (value.substr(i, 2) == "四") ret = ret*10 + 4; 
		if (value.substr(i, 2) == "五") ret = ret*10 + 5;  
		if (value.substr(i, 2) == "六") ret = ret*10 + 6; 
		if (value.substr(i, 2) == "七") ret = ret*10 + 7; 
		if (value.substr(i, 2) == "八") ret = ret*10 + 8;  
		if (value.substr(i, 2) == "九") ret = ret*10 + 9; 
		if (value.substr(i, 2) == "十") ret = ret*10 + 10;  
	}
	return ret;
}
void int_to_string(string var) { // int 转成 汉字 
	int temp = abs(mp[var]);
	if (mp[var] < 0) cout << "负"; 
	if (temp <= 10) {
		cout << num[temp] << endl;	
	} else { // 大于10的情况 
		int sum = 0, cnt = 0;
		while (temp) { // 逆置temp,用sum保存 
			sum = sum * 10 + temp % 10;
			temp /= 10;
			++cnt;
		} 
		while (cnt--) { // 输出每一位数 
			cout << num[sum%10];
			sum /= 10;
		}
		cout << endl;
	}
}
void add_or_sub(string var, string oper, string value) { // 加减法 
	if (oper == "减少") {
		mp[var] -= toint(value); 
	} else if (oper == "增加") {
		mp[var] += toint(value); 
	} 
}
int main() {
	string var, value, word, oper, cmp, other;
	while (cin >> word) { // 输入一个单词,判断是否等于“整数”或“看看”或“如果”或变量名 
		if (word == "整数") { // 1. 整数 
			cin >> var >> other >> value; // 保留var和value 
			mp[var] = toint(value);
		} else if (word == "看看") { // 2.看看 
			cin >> var;
			if (!mp.count(var)) {
				if (var[0] == '"' && var[var.size()-1] == '"') 
					cout << var.substr(1,var.size()-2) << endl;
				else if (var.substr(0,2) == "“" && var.substr(var.size()-2,2) == "”") 
					cout << var.substr(2,var.size()-4) << endl; 
				else cout << "无此变量:" << var << endl; 
				continue; // 跳过计算步骤 
			}
			int_to_string(var);
		} else if (word == "如果") { // 3. 如果 
			string digit, then, s1, s2, s3, s4, s5;
			cin >> var >> cmp >> digit;
			cin >> then >> s1 >> s2 >> s3 >> s4 >> s5;
			if (!mp.count(var)) {
				cout << "无此变量:" << var << endl; 
				continue;
			}
			if (s1 == "看看") { // 3.1 看看 
				int len1, len2, start;
				if (s2[0] == '"' && s2[s2.size()-1] == '"') {
					len1 = s2.size()-2; // 减去头尾两个英文双引号的长度 
					len2 = s5.size()-2;
					start = 1; 
				} else if (s2.substr(0,2) == "“" && s2.substr(s2.size()-2,2) == "”") {
					len1 = s2.size()-4; // 减去头尾两个中文双引号的长度 
					len2 = s5.size()-4;
					start = 2; 
				}
				if (cmp == "大于") {
					if (mp[var] > toint(digit)) cout << s2.substr(start, len1) << endl;
					else cout << s5.substr(start, len2) << endl; // 输出去掉头尾的子串 
				} else if (cmp == "小于") {
					if (mp[var] < toint(digit)) cout << s2.substr(start, len1) << endl;
					else cout << s5.substr(start, len2) << endl;
				} 
			} else { // 3.2  
				if (!mp.count(s1)) {
					cout << "无此变量:" << s1 << endl; 
					continue;
				}
				if (cmp == "大于") {
					if (mp[var] > toint(digit)) {
						add_or_sub(s1, s2, s3); // 变量名,操作,值 
					} else; 
				} else if (cmp == "小于") {
					if (mp[var] < toint(digit)) {
						add_or_sub(s1, s2, s3); 
					} else;
				} 
			}		 
		} else if (mp.count(word)) { // 4.已存在的变量 
			cin >> oper >> value;
			add_or_sub(word, oper, value);
		} else { // 5. 其他 
			cout << "请输入正确的格式\n";
		}
	}
	return 0;
} 

测试样例

输入样例1:

整数 气温 等于 十
气温 减少 三
气温 增加 二
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”

输出:
输出1

输入样例2:

整数 作业 等于 零
看看 作业
如果 作业 小于 一 则 看看 “哈哈哈哈哈” 否则 看看 “作业太多了”
作业 增加 一零零
看看 作业
如果 作业 大于 一 则 看看 “作业太多了” 否则 看看 “哈哈哈哈哈”
作业 减少 五六七
看看 作业
如果 作业 小于 负一零零 则 看看 “哈哈哈哈哈” 否则 看看 “作业太多了”

输出:
输出2

输入样例3:

整数 小杨年龄 等于 八
整数 小杨零花钱 等于 二
小杨年龄 增加 一
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱
小杨年龄 减少 三
如果 小杨年龄 小于 八 则 小杨零花钱 减少 二 否则 无
看看 小杨零花钱
看看 小杨年龄
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱

输出:
输出3

posted @ 2020-02-05 17:46  oeong  阅读(829)  评论(1编辑  收藏  举报