zoukankan      html  css  js  c++  java
  • 寒假作业2:编程题

    这个作业属于哪个课程 2020年面向对象程序设计
    这个作业要求在哪里 面向对象程序设计寒假作业2
    这个作业的目标 1.继续完成作业一的编程题。
    2.优化架构,一般要求每个函数长度不超过15行。
    3.优化规范,尤其是命名规范。
    4.制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
    作业正文 如下所示
    其他参考文献 在链接中体现

    编程题

    这回编程对上一次进行了大幅度的优化绝对不是因为上一次写的太烂回炉重造了呜呜呜
    在学习C++的过程中发现好像用C++编写这道题目还是蛮香的??于是直接改造原代码写了一个C++版本的代码
    对比于C,C++对于string的处理多了很多好用的函数,而且从安全性上也比C有提高
    还是跟上次一样,对函数进行声明,对基本汉字进行了定义

    int find (string& zhao);
    void find (int num);
    //find函数重载
    
    void dingyi (int& money, string& wen);//初始化钱包
    void jianfa (int& money, string& wen);//减法操作
    void jiafa(int& money, string& wen);//加法操作
    //功能函数
    
    const char shu[11][3] = { "零","一", "二","三","四","五","六","七","八","九","十" };
    //对基本的汉字进行定义
    

    这边应用了函数重载来提高函数的使用效率,并且尽可能的使用C++中的引用来减少内存的占用
    上一次C语言版本把一大堆的代码都放在了while中,这样显得长长的一大堆看着很乱,也不利于后期的修改,于是全部改成函数
    首先是用于检索汉字对应数字及输出数字对应汉字的函数

    int find(string &zhao) {
    	int len = zhao.length();
    	int sum = 0;
    	int i, flag = 0;
    	//三个汉字
    	if (len == 6) {
    		for (i = 0; i < 11; i++) {
    			if (zhao.compare(0, 2, shu[i]) == 0) {
    				sum += 10 * i;
    				flag = 1;
    				break;
    			}
    			if (flag == 0 && i == 10) return -1;
    		}
    		flag = 0;
    		for (i = 0; i < 11; i++) {
    			if (zhao.compare(4, 2, shu[i]) == 0) {
    				sum += i;
    				flag = 1;
    				break;
    			}
    			if (flag == 0 && i == 10) return -1;
    		}
    		return sum;
    	}
    	//两个汉字
    	else if (len == 4) {
    		sum = 1;
    		for (i = 0; i < 11; i++) {
    			if (zhao.compare(0, 2, shu[i]) == 0) {
    				flag = 1;
    				break;
    			}
    		}
    		if (i == 10) {
    			for (i = 0; i < 11; i++) {
    				if (zhao.compare(2, 2, shu[i]) == 0) {
    					flag = 1;
    					break;
    				}
    			}
    			sum = 10 + i;
    			return sum;
    		}
    		else if (i < 10 && i>0) {
    			sum = i * 10;
    			return sum;
    		}
    		else if (flag == 0 && i == 10) return -1;
    	}
    	//一个汉字
    	else if (len == 2) {
    		for (i = 0; i < 11; i++) {
    			if (zhao.compare(0, 2, shu[i]) == 0) {
    				sum += i;
    				flag = 1;
    				break;
    			}
    			if (flag == 0 && i == 10) return -1;
    		}
    		return sum;
    	}
    	else return -1;//如果异常则抛出-1
    }
    
    void find(int num) {
    	if (num <= 10 && num >= 0) {
    		cout << shu[num] << endl;
    	}
    	else if (num % 10 == 0) {
    		cout << shu[num / 10] << "十" << endl;
    	}
    	else if (num % 10 == 1) {
    		cout << "十" << shu[num % 10] << endl;
    	}
    	else if (num > 10 && num < 100) {
    		cout << shu[num / 10] << "十" << shu[num % 10] << endl;
    	}
    }
    

    这回的代码解决了上一次只能处理十以下数字的问题,并且对一些特殊的数字进行特殊处理
    如十一,四十之类的,不会输出一十一,四十零,并且分别对一个字,两个字,三个字分开处理
    这边因为需要讨论的情况不是特别的多,于是选择分开进行处理
    然后是钱包的初始化,钱包的加减法

    void dingyi(int& money,string &wen) {
    	//printf("1");
    	int len = wen.length();
    	string temp = wen.substr(15, len);
    	if (find(temp) != -1) {
    		money = find(temp);
    	}
    	else {
    		printf("非法输入
    ");//异常处理
    	}
    }
    
    void jianfa(int& money, string &wen) {
    	//printf("4");
    	int len = wen.length();
    	string temp = wen.substr(10, len);
    	if (find(temp) != -1) {
    		money -= find(temp);
    	}
    	else {
    		printf("非法输入
    ");//异常处理
    	}
    }
    
    void jiafa(int& money, string& wen) {
    	//printf("3");
    	int len = wen.length();
    	string temp = wen.substr(10, len);
    	if (find(temp) != -1) {
    		money += find(temp);
    	}
    	else {
    		printf("非法输入
    ");//异常处理
    	}
    }
    

    以下是完整代码

    #include <iostream>
    #include <string>
    using namespace std;
    
    int find (string& zhao);
    void find (int num);
    //find函数重载
    
    void dingyi (int& money, string& wen);//初始化钱包
    void jianfa (int& money, string& wen);//减法操作
    void jiafa(int& money, string& wen);//加法操作
    //功能函数
    
    const char shu[11][3] = { "零","一", "二","三","四","五","六","七","八","九","十" };
    //对基本的汉字进行定义
    
    int main() {
    	int money = 0;
    	string kankan = "看看 钱包";
    	string yuan = "整数 钱包 等于";
    	string jia = "钱包 增加";
    	string jian = "钱包 减少";
    	while (1) {
    		string a,temp;
    		getline(cin, a);
    		//定义钱包初始数额
    		if (a.compare(0, 13, yuan, 0, 13) == 0) {
    			dingyi(money, a);
    		}
    		//看看钱包的余额
    		else if (a.compare(0,9,kankan,0,9) == 0) {
    			find(money);
    			break;
    		}
    		//对余额进行加法操作
    		else if (a.compare(0,9,jia,0,9) == 0) {
    			jiafa(money, a);
    			continue;
    		}
    		//对余额进行减法操作
    		else if (a.compare(0,9,jian,0,9) == 0) {
    			jianfa(money, a);
    			continue;
    		}
    		//异常处理
    		else {
    			printf("非法输入
    ");
    			continue;
    		}
    	}
    	return 0;
    }
    
    int find(string &zhao) {
    	int len = zhao.length();
    	int sum = 0;
    	int i, flag = 0;
    	//三个汉字
    	if (len == 6) {
    		for (i = 0; i < 11; i++) {
    			if (zhao.compare(0, 2, shu[i]) == 0) {
    				sum += 10 * i;
    				flag = 1;
    				break;
    			}
    			if (flag == 0 && i == 10) return -1;
    		}
    		flag = 0;
    		for (i = 0; i < 11; i++) {
    			if (zhao.compare(4, 2, shu[i]) == 0) {
    				sum += i;
    				flag = 1;
    				break;
    			}
    			if (flag == 0 && i == 10) return -1;
    		}
    		return sum;
    	}
    	//两个汉字
    	else if (len == 4) {
    		sum = 1;
    		for (i = 0; i < 11; i++) {
    			if (zhao.compare(0, 2, shu[i]) == 0) {
    				flag = 1;
    				break;
    			}
    		}
    		if (i == 10) {
    			for (i = 0; i < 11; i++) {
    				if (zhao.compare(2, 2, shu[i]) == 0) {
    					flag = 1;
    					break;
    				}
    			}
    			sum = 10 + i;
    			return sum;
    		}
    		else if (i < 10 && i>0) {
    			sum = i * 10;
    			return sum;
    		}
    		else if (flag == 0 && i == 10) return -1;
    	}
    	//一个汉字
    	else if (len == 2) {
    		for (i = 0; i < 11; i++) {
    			if (zhao.compare(0, 2, shu[i]) == 0) {
    				sum += i;
    				flag = 1;
    				break;
    			}
    			if (flag == 0 && i == 10) return -1;
    		}
    		return sum;
    	}
    	else return -1;//如果异常则抛出-1
    }
    
    void find(int num) {
    	if (num <= 10 && num >= 0) {
    		cout << shu[num] << endl;
    	}
    	else if (num % 10 == 0) {
    		cout << shu[num / 10] << "十" << endl;
    	}
    	else if (num % 10 == 1) {
    		cout << "十" << shu[num % 10] << endl;
    	}
    	else if (num > 10 && num < 100) {
    		cout << shu[num / 10] << "十" << shu[num % 10] << endl;
    	}
    }
    
    void dingyi(int& money,string &wen) {
    	//printf("1");
    	int len = wen.length();
    	string temp = wen.substr(15, len);
    	if (find(temp) != -1) {
    		money = find(temp);
    	}
    	else {
    		printf("非法输入
    ");//异常处理
    	}
    }
    
    void jianfa(int& money, string &wen) {
    	//printf("4");
    	int len = wen.length();
    	string temp = wen.substr(10, len);
    	if (find(temp) != -1) {
    		money -= find(temp);
    	}
    	else {
    		printf("非法输入
    ");//异常处理
    	}
    }
    
    void jiafa(int& money, string& wen) {
    	//printf("3");
    	int len = wen.length();
    	string temp = wen.substr(10, len);
    	if (find(temp) != -1) {
    		money += find(temp);
    	}
    	else {
    		printf("非法输入
    ");//异常处理
    	}
    }
    

    这次也算是用上了刚刚学的C++,在使用过程中确实有不少头疼的地方,比如自学了一大堆C++关于字符串处理的函数,以及C++字符串的读入与输出
    C++的cin如果用于读入字符串是以空格回车等为分隔的,这一点我开头没有注意到,在调试过程中才发现。
    至于读入文件的功能,可以利用fstream中包含的函数和方法进行操作
    在头文件中先进行包含

    #include  <fstream>
    

    这是修改后的主函数部分

    int main() {
    	int money = 0;
    	string kankan = "看看 钱包";
    	string yuan = "整数 钱包 等于";
    	string jia = "钱包 增加";
    	string jian = "钱包 减少";
    	string a, temp;
    	ifstream ifs;
    	ifs.open("test01.txt", ios::in);
    	while (getline(ifs,a)) {
    		//定义钱包初始数额
    		if (a.compare(0, 13, yuan, 0, 13) == 0) {
    			dingyi(money, a);
    		}
    		//看看钱包的余额
    		else if (a.compare(0,9,kankan,0,9) == 0) {
    			find(money);
    			break;
    		}
    		//对余额进行加法操作
    		else if (a.compare(0,9,jia,0,9) == 0) {
    			jiafa(money, a);
    			continue;
    		}
    		//对余额进行减法操作
    		else if (a.compare(0,9,jian,0,9) == 0) {
    			jianfa(money, a);
    			continue;
    		}
    		//异常处理
    		else {
    			printf("非法输入
    ");
    			continue;
    		}
    	}
    	ifs.close();
    	return 0;
    }
    

    测试文本如下

    运行结果

    简易(lou)版测试脚本如下

    @echo off
    cd C:Users11765SourceRepos计算器C++版本Debug
    echo 开始运行
    PAUSE
    计算器C++版本.exe
    echo 运行结束
    pause
    

    文件需要保存成ANSI格式,不然不知道为什么会乱码的样子

    参考文献

    https://www.jb51.net/article/151923.htm
    https://www.bilibili.com/video/av41559729?p=144

  • 相关阅读:
    [Zjoi2014]力(FFT,卷积)
    LOJ 6240. 仙人掌
    Web 服务编程技巧和诀窍: 将 <xsd:any/> 元素用于自定义序列化(转)
    Ant工具使用说明(转)
    Web 服务编程技巧与窍门: 用 SAAJ 和 JAXRPC 构建 SOAP 响应信封(转)
    Axis2 quick start 中文版
    使用SOAP开发java web服务Axis开发方案(转)
    k 动画脚本很有算法 同时可以借鉴这里的画圆
    ui 界面美观化 (多维子材质脚本)
    系类函数介绍 之中可能没有一些预订变量 应用时要自己加上。
  • 原文地址:https://www.cnblogs.com/Horizonxr/p/12263378.html
Copyright © 2011-2022 走看看