面向对象程序设计寒假作业3
面向对象程序设计第二次作业
这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象设计寒假作业3 |
这个作业的目标 | 继续完成作业二的编程题,优化架构,思考代码的拓展性,可以参考现有的编程语言,把这些适当的内容加入。 |
GITHUB仓库 | JudgementZero |
编程题要求:
优化架构,思考代码的拓展性,比如需要增加其他功能,
如选择,循环语句,参考现有的编程语言扩大数字范围,
支持负数。
在还未着手写相应拓展代码时想应拓展数字范围支持上
百上千上万,以及负数拓展,原函数拓展性属实差劲通
逐步判断输入汉字处理,以及对不同的数字得分类处理
每拓展范围便要求添加大量对拓展范围数字的处理,如
和对拓展范围内的汉字数字输入后逐个字进行转换属实
使得整体编写效率低下,全局变量定义过多导致难以调
试,最终也仅做到拓展到上百,以及负九十九内的负数
还是在大量删改添加的情况下也仅能拓展小范围。
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<cstdlib> using namespace std; int sum_Person = 0; struct Person_info { int money; char Person_name[20]; }person[100]; int Money_changer(int num) { if (num == -29)return 0; if (num == -46)return 1; if (num == -74)return 2; if (num == -56)return 3; if (num == -53)return 4; if (num == -50)return 5; if (num == -63)return 6; if (num == -58)return 7; if (num == -80)return 8; if (num == -66)return 9; if (num == -54)return 10; if (num == -72)return -1; return 100; } void Csum_Nfun(char money[20])//将汉字初始钱数进行分类; { int length = strlen(money); if (length == 8)//字节数为8比如一百零一,一百二十,负二十九; { if (Money_changer((int)money[0]) != -1) { if (!Money_changer((int)money[5]))person[sum_Person].money = Money_changer((int)money[0]) * 100 + Money_changer((int)money[6]);//即输入一百零几此类; else person[sum_Person].money = Money_changer((int)money[0]) * 100 + Money_changer((int)money[4]) * 10; } else person[sum_Person].money = (-1) * (Money_changer((int)money[2]) * 10 + Money_changer((int)money[6])); } else if (length == 2)//字节数为2,比如零,六; { if (!strcmp(money, "零"))person[sum_Person].money = 0; else person[sum_Person].money = Money_changer((int)money[0]); } else if (length == 4)//比较复杂含有小负数,十九类数字,二十类数字 { if (Money_changer((int)money[0]) == -1)person[sum_Person].money = (-1) * (Money_changer((int)money[2])); else if (Money_changer((int)money[0]) == 10)person[sum_Person].money = 10 + Money_changer((int)money[2]); else person[sum_Person].money = Money_changer((int)money[0]) * 10; } else if (length == 6)//有三十八,负十九,负二十 { if (Money_changer((int)money[0]) == -1 && Money_changer((int)money[4]) == 10)person[sum_Person].money = (-1) * (10 * Money_changer((int)money[2])); if (Money_changer((int)money[0]) == -1 && Money_changer((int)money[4]) != 10)person[sum_Person].money = (-1) * (10 + Money_changer((int)money[4])); if (Money_changer((int)money[0]) != -1)person[sum_Person].money = Money_changer((int)money[0]) * 10 + Money_changer((int)money[4]); } else if (length == 10)person[sum_Person].money = Money_changer((int)money[0]) * 100 + Money_changer((int)money[4]) * 10 + Money_changer((int)money[8]);//负一百二十三为例 } int Calculate(char money[20])//将汉字初始钱数进行分类; { int sum = 0; int length = strlen(money); if (length == 8)//字节数为8比如一百零一,一百二十,负二十九; { if (Money_changer((int)money[0]) != -1) { if (!Money_changer((int)money[5]))sum += Money_changer((int)money[0]) * 100 + Money_changer((int)money[6]);//即输入一百零几此类; else sum += Money_changer((int)money[0]) * 100 + Money_changer((int)money[4]) * 10; } else sum += (-1) * (Money_changer((int)money[2]) * 10 + Money_changer((int)money[6])); } else if (length == 2)//字节数为2,比如零,六; { if (!strcmp(money, "零"))sum += 0; else sum += Money_changer((int)money[0]); } else if (length == 4)//比较复杂含有小负数,十九类数字,二十类数字 { if (Money_changer((int)money[0]) == -1)sum += (-1) * (Money_changer((int)money[2])); else if (Money_changer((int)money[0]) == 10)sum += 10 + Money_changer((int)money[2]); else sum += Money_changer((int)money[0]) * 10; } else if (length == 6)//有三十八,负十九,负二十 { if (Money_changer((int)money[0]) == -1 && Money_changer((int)money[4]) == 10)sum += (-1) * (10 * Money_changer((int)money[2])); if (Money_changer((int)money[0]) == -1 && Money_changer((int)money[4]) != 10)sum += (-1) * (10 + Money_changer((int)money[4])); if (Money_changer((int)money[0]) != -1)sum += Money_changer((int)money[0]) * 10 + Money_changer((int)money[4]); } else if (length == 10)sum += Money_changer((int)money[0]) * 100 + Money_changer((int)money[4]) * 10 + Money_changer((int)money[6]);//负一百二十三为例 return sum; } void Sum_oringinal(void) { char sum_tool[20], dengyu[20], money[20]; cin >> person[sum_Person].Person_name >> sum_tool >> dengyu >> money;//输入初始值钱包钱数; Csum_Nfun(money); } int how(char how_number[20]) { if (!strcmp(how_number, "减少"))return 0; else if (!strcmp(how_number, "增加"))return 1; } void Sum_Package(int number) { if (number == 0)cout << "零"; else if (number == 1)cout << "一"; else if (number == 2)cout << "二"; else if (number == 3)cout << "三"; else if (number == 4)cout << "四"; else if (number == 5)cout << "五"; else if (number == 6)cout << "六"; else if (number == 7)cout << "七"; else if (number == 8)cout << "八"; else if (number == 9)cout << "九"; else if (number == 10)cout << "十"; } void Hundred_Package(int number)//处理100到999的数字 { Sum_Package((number / 100)); cout << "百"; if (number % 10 == 0 && number % 100 != 0)//处理一百一十类的 { Sum_Package(((number / 10) % 10)); cout << "十"; } else if (number < ((number / 100) * 100 + 10) && number % 100 != 0) { cout << "零"; Sum_Package((number % 10)); } else if (number > ((number / 100) * 100 + 10) && number <= ((number / 100) * 100 + 99)) { Sum_Package((number / 10 % 10)); cout << "十"; Sum_Package((number % 10)); } } void Negative_Package(int number)//处理负一到负九十九 { int numberchange; numberchange = abs(number); cout << "负"; if (number < 0 && number >= -10)Sum_Package(numberchange); else { Sum_Package((numberchange / 10 % 10)); cout << "十"; Sum_Package((numberchange % 10)); } } void Ten_Package(int number) { if (number <= 10)Sum_Package(number); else if (number > 10 && number < 20) { cout << "十"; Sum_Package((number % 10)); } else { Sum_Package((number / 10 % 10)); cout << "十"; if (number % 10 != 0)Sum_Package((number % 10)); } } void Sum_display(void) { if (person[sum_Person].money < 100 && person[sum_Person].money >= 0)Ten_Package(person[sum_Person].money); else if (person[sum_Person].money < 0 && person[sum_Person].money >= -99)Negative_Package(person[sum_Person].money); else if (person[sum_Person].money >= 100)Hundred_Package(person[sum_Person].money); else cout << "不在现有计算能力之内"; } int main() { char tool[20], how_number[20], sum_change[20]; int operation;//作为是否退出的关键;; while (1) { Sum_oringinal(); while (1) { cin >> tool >> how_number; if (!strcmp(tool, "看看")) { Sum_display(); break; } cin >> sum_change; if (!how(how_number))person[sum_Person].money -= Calculate(sum_change); else person[sum_Person].money += Calculate(sum_change); } cout << endl; cout << "是否选择退出,请准确输入“退出输入1”“停留输入0”:"<<endl; (void)scanf("%d", &operation); if (operation == 1)break; else sum_Person++; } //system("pause"); return 0; }
从以上代码可以看出原函数拓展性着实存在问题需要添
加处理函数或者本人本体思路存在偏差需要添加,上述
上述代码仅能解决输入负九十九到九百九十九以内的数
以及处理输出负九十九到九百九十九以内的数,初步解
决循环,支持输入完一组数据(指输入看看后输出计算
结果后再次输入另一组数据,将整数关键字可替换成人
名,本以为可以支持输入相应的数值进行查询已经输入
的数据人名及其钱数,结果所写的函数并不显示已输入
的人名,仅能显示钱数还是阿拉伯数字,就删除此功能
就像代码中的函数一样,Money_changer采用汉字数字
ASCII码存在差异,来转换汉字,也正因为如此使得 函
数拓展性受限制,需要一个个比较,在主函数调用 Sum
_oringinal函数输入第一行数据后利用 Csum_Nfun函
数对输入的初始钱数进行分类后转换, 由于设计上的
错误导致需要添加Calculate函数来对 后续输入的钱数
进行转换,处理完毕后输入关键字看看调用Sum_displa
y后针对结果又有不同的Package函数进行加工包装输出
利用how函数处理减去和增加的转换;
实现效果如下:
代码支持循环由于限定person结构体的数量故不能做到
输入大于一百组数据。
关于脚本部分编译脚本内容如下:
@echo off title 编译脚本 gcc Function.cpp echo 编译结束 pause
运行脚本能实现自动编译,不懂题目要求中的关于输出编译
后的代码是指什么,百度玩的结果就跟搜索的内容偏差挺大
认为是准备一个存有代码的txt后使用type a.txt显示文本
中的代码内容不过这就与题目的要求关系不大。
运行结果便是编译成功。
对于测试单元函数仅需测试how,Money_changer,Csum_N
fun以及Calculate函数剩余函数均可以通过输出结果观察函
数运行效果;
各测试函数内容如下:
#include<iostream> #include<cstring> using namespace std; int how(char how_number[20]) { if (!strcmp(how_number, "减少"))return 0; else if(!strcmp(how_number, "增加"))return 1; return 2; } int main() { char Plus[20],Minus[20]; strcpy(Plus,"增加"); strcpy(Minus,"减少"); if(!(how(Plus)-1))cout << "测试正常"<<endl; if(!(how(Minus)-0))cout << "测试正常"; cout <<endl; return 0; }
Csum_Nfun和Calculate函数功能实际一致仅由于涉及不当
而分家增加函数不必要的长度
#include<iostream> #include<cstring> using namespace std; int main() { if(!(strlen("一")-2))cout << "测试正常" << endl; if(!(strlen("二十")-4))cout << "测试正常" << endl; if(!(strlen("十九")-4))cout << "测试正常" << endl; if(!(strlen("三十九")-6))cout << "测试正常" << endl; if(!(strlen("一百零四")-8))cout << "测试正常" << endl; if(!(strlen("一百二十")-8))cout << "测试正常" << endl; if(!(strlen("一百二十九")-10))cout << "测试正常" << endl; if(!(strlen("负一")-4))cout << "测试正常" << endl; if(!(strlen("负十九")-6))cout << "测试正常" << endl; if(!(strlen("负二十")-6))cout << "测试正常" << endl; if(!(strlen("负九十九")-8))cout << "测试正常"; cout << endl; return 0; }
#include<iostream> using namespace std; int Money_changer(int num) { if (num == -29)return 0; if (num == -46)return 1; if (num == -74)return 2; if (num == -56)return 3; if (num == -53)return 4; if (num == -50)return 5; if (num == -63)return 6; if (num == -58)return 7; if (num == -80)return 8; if (num == -66)return 9; if (num == -54)return 10; if (num == -72)return -1; return 100; } int main() { if(!(Money_changer(-29)-0))cout << "测试正常" << endl; if(!(Money_changer(-46)-1))cout << "测试正常" << endl; if(!(Money_changer(-74)-2))cout << "测试正常" << endl; if(!(Money_changer(-56)-3))cout << "测试正常" << endl; if(!(Money_changer(-53)-4))cout << "测试正常" << endl; if(!(Money_changer(-50)-5))cout << "测试正常" << endl; if(!(Money_changer(-63)-6))cout << "测试正常" << endl; if(!(Money_changer(-58)-7))cout << "测试正常" << endl; if(!(Money_changer(-80)-8))cout << "测试正常" << endl; if(!(Money_changer(-66)-9))cout << "测试正常" << endl; if(!(Money_changer(-54)-10))cout << "测试正常" << endl; if(!(Money_changer(-72)+1))cout << "测试正常"; system("pause"); return 0; }
测试脚本内容如下:
@echo off title 测试脚本 echo 开始Csum_Nfun和Calculate函数测试 gcc Csum_Nfun和Calculate测试函数.cpp call a.exe echo 开始how函数测试 gcc how测试函数.cpp call a.exe echo Money_changer函数开始 gcc Money_changer测试函数.cpp call a.exe pause
运行结果如下:
来源:https://www.cnblogs.com/pekkasuper/p/12307019.html