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

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

记录

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

存在的问题和注意点

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

不会的知识

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:

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

输出:
汉字编程 —— 第一次个人编程作业_第1张图片

输入样例2:

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

输出:
汉字编程 —— 第一次个人编程作业_第2张图片

输入样例3:

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

输出:
汉字编程 —— 第一次个人编程作业_第3张图片

你可能感兴趣的:(汉字编程 —— 第一次个人编程作业)