这个作业属于哪个课程 | 软件工程 (福州大学至诚学院 - 计算机工程系) |
---|---|
这个作业要求在哪里 | 第一次个人编程作业 |
这个作业的目标 | 汉字编程 |
作业正文 | 我的GitHub仓库地址 |
其他参考文献 | 汉字输出问题 |
记录
- 代码行数:114
- 需求分析时间:15min+
- 编码时间:8h+
问题和注意点
- ~~只能输入一位数(零十)~已解决
- 用
value.substr(i, 2)
取一个汉字
- 用
没判断变量名是否正确已解决if (!mp.count(var)) continue;
如果是不存在的变量名,我就假装没看到跳过。
没考虑负数情况已解决用已解决mp[var]
判断var是否存在,没考虑到值为0的情况- 改成
mp.count(var)
- 改成
- 输出大于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 >> 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 << "请输入正确的格式
";
}
}
return 0;
}
测试样例
输入样例1:
整数 气温 等于 十
气温 减少 三
气温 增加 二
看看 气温
如果 气温 大于 八 则 看看 “你好,世界” 否则 看看 “冻死我了”
输出:
输入样例2:
整数 作业 等于 零
看看 作业
如果 作业 小于 一 则 看看 “哈哈哈哈哈” 否则 看看 “作业太多了”
作业 增加 一零零
看看 作业
如果 作业 大于 一 则 看看 “作业太多了” 否则 看看 “哈哈哈哈哈”
作业 减少 五六七
看看 作业
如果 作业 小于 负一零零 则 看看 “哈哈哈哈哈” 否则 看看 “作业太多了”
输出:
输入样例3:
整数 小杨年龄 等于 八
整数 小杨零花钱 等于 二
小杨年龄 增加 一
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱
小杨年龄 减少 三
如果 小杨年龄 小于 八 则 小杨零花钱 减少 二 否则 无
看看 小杨零花钱
看看 小杨年龄
如果 小杨年龄 大于 八 则 小杨零花钱 增加 一 否则 无
看看 小杨零花钱
输出: