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


    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系)
    这个作业要求在哪里 第一次个人编程作业
    这个作业的目标 汉字编程
    作业正文 我的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 << "请输入正确的格式
    ";
    		}
    	}
    	return 0;
    } 
    

    测试样例

    输入样例1:

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

    输出:
    输出1

    输入样例2:

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

    输出:
    输出2

    输入样例3:

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

    输出:
    输出3

  • 相关阅读:
    组件之间通信(父传子)
    flex布局
    ffmpeg解析TS流(转)
    swift之?和!的含义(转)
    Swift之画圆角添加多个枚举值方法
    swift之singleton
    swift之闭包
    Swift之fallthrough
    Selector
    Settings Bundle
  • 原文地址:https://www.cnblogs.com/oeong/p/12264710.html
Copyright © 2020-2023  润新知