这个作业属于哪个课程 | 软件工程 (福州大学至诚学院 - 计算机工程系) |
---|---|
这个作业要求在哪里 | 第一次个人编程作业 |
这个作业的目标 | 汉字编程 |
作业正文 | 见下文 |
其他参考文献 | 汉字输出问题 |
记录
- 代码行数:95
- 需求分析时间:15min
- 编码时间:2h+
存在的问题和注意点
只能输入一位数(零~十)已解决- 用
value.substr(i, 2)
取一个汉字
- 用
没判断变量名是否正确已解决if (!mp[var]) continue;
如果是不存在的变量名,我就假装没看到跳过。
没考虑负数情况已解决- 输出大于10的数的表示方式
- 18用一八表示
- 2020用二零二零表示
- 忽略了一些不重要的字眼,如“整数”、“等于”、“则”、“否则”
不会的知识
ASCII码中,一个字母占1Byte,而一个汉字占2Byte,我不知如何从汉字字符串中取一个汉字,所以每次只能输入一位数。
改进:
- 用
value.substr(i, 2)
取一个汉字,因为一个汉字占2Byte。 - 若使用C,则可以
printf("%c%c", value[i],value[i+1])
输出一个汉字。
思路
编程语言:C/C++
第一行输入 定义变量时,发现“整数”和“等于”之后都没用到,所以只保留变量名var和数字值value。
将汉字数字值转化成整型,存储到map容器中。
用while (cin >> some)
可以一直读入一个词语,根据这个词的值分别进行以下处理:
如果some == "整数"
,则加入到map容器中,并赋值。
如果some == "看看"
,则输出。若sum为负数,则输出“负”。用num[]对应ssum的每一位数字。
如果some == "如果"
,
根据观察,则后面共五个词语,若s1 == "看看"
,输出去掉头尾双引号的子串;否则,进行相应的加减操作。
如果mp[some]
,some是已存在的变量,进行加减操作。
代码
Github代码地址,目前第4版本。
#include // 万能头文件
using namespace std;
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;
}
int main() {
map mp;
string var, value, some, oper, cmp, other;
string num[12] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"};
for (int i = 0; i < 2; ++i) cin >> var; // 输入两遍,保留第二个变量名
for (int i = 0; i < 2; ++i) cin >> value; // 输入两遍,保留第二个数字值
mp[var] = toint(value); // 将value转换成整数, 并存入mp[var]中
while (cin >> some) { // 输入一个词语,判断是否等于“整数”或“看看”或“如果”或变量名
if (some == "整数") {
cin >> var >> other >> value; // 保留var和value
mp[var] = toint(value);
} else if (some == "看看") {
cin >> var;
if (!mp[var]) continue; // 如果变量名不存在,则跳过
int temp = abs(mp[var]);
if (mp[var] < 0) cout << "负";
if (temp <= 10) {
cout << num[temp] << endl;
} else { // 大于10的情况
int ssum = 0, cnt = 0;
while (temp) { // 逆置sum,用ssum保存
ssum = ssum * 10 + temp % 10;
temp /= 10;
++cnt;
}
while (cnt--) { // 输出每一位数
cout << num[ssum%10];
ssum /= 10;
}
cout << endl;
}
} else if (some == "如果") {
string digit, then, s1, s2, s3, s4, s5;
cin >> var >> cmp >> digit;
cin >> then >> s1 >> s2 >> s3 >> s4 >> s5;
if (s1 == "看看") {
int len1 = s2.size()-2; // 减去头尾两个双引号的长度
int len2 = s5.size()-2;
if (cmp == "大于") {
if (mp[var] > toint(digit)) cout << s2.substr(1, len1) << endl;
else cout << s5.substr(1, len2) << endl; // 输出去掉头尾的子串
} else if (cmp == "小于") {
if (mp[var] < toint(digit)) cout << s2.substr(1, len1) << endl;
else cout << s5.substr(1, len2) << endl;
}
} else {
if (cmp == "大于") {
if (mp[var] > toint(digit)) {
if (s2 == "减少") {
mp[s1] -= toint(s3);
} else if (s2 == "增加") {
mp[s1] += toint(s3);
}
} else;
} else if (cmp == "小于") {
if (mp[var] < toint(digit)) {
if (s2 == "减少") {
mp[s1] -= toint(s3);
} else if (s2 == "增加") {
mp[s1] += toint(s3);
}
} else;
}
}
} else if (mp[some]) { // 如果是已存在的变量
cin >> oper >> value;
if (oper == "减少") {
mp[some] -= toint(value);
} else if (oper == "增加") {
mp[some] += toint(value);
}
}
}
return 0;
}
测试样例
输入样例1:
整数 气温 等于 十
气温 减少 三
气温 增加 二
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
输入样例2:
整数 作业 等于 零
看看 作业
如果 作业 小于 一 则 看看 “哈哈哈哈哈” 否则 看看 “作业太多了”
作业 增加 一零零
看看 作业
如果 作业 大于 一 则 看看 “作业太多了” 否则 看看 “哈哈哈哈哈”
作业 减少 五六七
看看 作业
如果 作业 小于 负一零零 则 看看 “哈哈哈哈哈” 否则 看看 “作业太多了”
输入样例3:
整数 小杨年龄 等于 八
整数 小杨零花钱 等于 二
小杨年龄 增加 一
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱
小杨年龄 减少 三
如果 小杨年龄 小于 八 则 小杨零花钱 减少 二 否则 无
看看 小杨零花钱
看看 小杨年龄
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱