寒假作业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("非法输入\n");//异常处理
	}
}

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("非法输入\n");//异常处理
	}
}

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("非法输入\n");//异常处理
	}
}

以下是完整代码

#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("非法输入\n");
			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("非法输入\n");//异常处理
	}
}

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("非法输入\n");//异常处理
	}
}

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("非法输入\n");//异常处理
	}
}

这次也算是用上了刚刚学的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("非法输入\n");
			continue;
		}
	}
	ifs.close();
	return 0;
}

测试文本如下

运行结果

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

@echo off
cd C:\Users\11765\Source\Repos\计算器C++版本\Debug
echo 开始运行
PAUSE
计算器C++版本.exe
echo 运行结束
pause

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

参考文献

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

posted @ 2020-02-05 15:13  Horizonxr  阅读(414)  评论(0编辑  收藏  举报