2020面向对象寒假作业(三)
这个作业属于哪里 | 2020面向对象程序设计 |
---|---|
这个作业在哪里 | 2020面向对象寒假作业三 |
这个作业目标 | 1.继续完成编程题 2.发布博客 |
作业正文 | 2020面向对象寒假作业(三) |
参考文献 | - |
1.代码优化
(1)num中文转数字计算函数
原函数
int num(char d[]) { if(!strcmp(d,"零")) return 0; else if(!strcmp(d,"一")) return 1; else if(!strcmp(d,"二")) return 2; else if(!strcmp(d,"三")) return 3; else if(!strcmp(d,"四")) return 4; else if(!strcmp(d,"五")) return 5; else if(!strcmp(d,"六")) return 6; else if(!strcmp(d,"七")) return 7; else if(!strcmp(d,"八")) return 8; else if(!strcmp(d,"九")) return 9; else if(!strcmp(d,"十")) return 10; else return -1; }
优化函数
int num(char d[]) { char nums[11][4]={"零","一","二","三","四","五","六","七","八","九","十"}; char b[0]; int n,i,j,sum=0,judge=0; n=strlen(d); for(i=0;i<=n-2;i=i+2) { strncpy(b,d+i,2); if(!strcmp(b,"负")) judge=1; for(j=0;j<11;j++) { if(!strcmp(b,nums[j])) { if(i==0&&j==10) sum+=j; else if(i!=0&&j==10) sum=sum*10; else if(j!=10) sum+=j; } } } if(judge==0) return sum; else return sum*(-1); }
优化思考
【1】.使用strlen,strncpy,strcmp函数分别进行得到总字符数,复制指定字符到另一个数组,判断这个字符数组与相应字符是否相等。
【2】.把原函数选择模式改写成循环模式,大量减少代码,并得到与对应字符对应的数字j,方便后续计算总数sum。
【3】.通过对负数的判断和循环,将原函数零到十的范围改写成负一百到一百
(2).sum数字转化成中文函数
原函数
void sum(int n) { char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"}; if(n<10) printf("%s",nums[n]); else { int m=n%10; n=n/10; if(!strcmp(nums[n],"一")) printf("十%s",nums[m]); else printf("%s十%s",nums[n],nums[m]); } }
优化函数
void sum(int n) { char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"}; if(n<0) { printf("欠债:"); n=fabs(n); } if(n<10) printf("%s",nums[n]); else if(n<100) { int m=n%10; n=n/10; if(!strcmp(nums[n],"一")) printf("十%s",nums[m]); else printf("%s十%s",nums[n],nums[m]); } else { int m=n%10,k=n/100; n=n%100/10; if(!strcmp(nums[n],"零")) printf("%s百零%s",nums[k],nums[m]); else if(!strcmp(nums[m],"零")) printf("%s百%s十",nums[k],nums[n]); else printf("%s百%s十%s",nums[k],nums[n],nums[m]); } }
优化思路
【1】.增加一个选择分支,转化超过一百的总数
【2】.通过增加一个分支,将原函数总数范围从零到一百改为负一千到一千
【3】.对于负的总数,声明为负债:总数
(3).judge中文转化成符号函数
原函数
int judge(int n ,char c[],char d[]) { if(!strcmp(c,"增加")) return n+num(d); else if(!strcmp(c,"减少")) return n-num(d); else error(4); }
优化函数
int judge(int n ,char c[],char d[]) { if(!strcmp(c,"增加")) return n+num(d); else if(!strcmp(c,"减少")) return n-num(d); else if(!strcmp(c,"乘以")) return n*num(d); else if(!strcmp(c,"除以")) return n/num(d); }
优化思路
【1】.增加两个选择分支,支持乘除运算
【2】.定义为int函数,不会有小数
2.原代码函数
calculate循环计算函数:通过循环重复运算,无需变化
void calculate(int coin) { char b[10],c[10],d[10]; while(2) { scanf("%s",b); if(!strcmp(b,"看看")) { sum(coin); break; } scanf("%s%s",c,d); coin = judge(coin,c,d); } }
3.编译脚本
脚本展示
结果展示
4.单元测试
单元测试代码
#include<stdio.h> #include<string.h> int num(char d[]) { char nums[11][4]={"零","一","二","三","四","五","六","七","八","九","十"}; char b[0]; int n,i,j,sum=0,judge=0,judge1=0; n=strlen(d); for(i=0;i<=n-2;i=i+2) { strncpy(b,d+i,2); if(!strcmp(b,"负")) { judge=1;continue; } for(j=0;j<11;j++) { if(!strcmp(b,nums[j])) { if(i==0&&j==10) sum+=j; else if(i!=0&&j==10) sum=sum*10; else if(j!=10) sum+=j; judge1=1; } } if(judge1==0) return -1; } if(judge==0) return sum; else return sum*(-1); } int judge(char c[]) { if(!strcmp(c,"增加")) return 1; else if(!strcmp(c,"减少")) return 2; else if(!strcmp(c,"乘以")) return 3; else if(!strcmp(c,"除以")) return 4; else return -1; } int main() { int a,i; char d[13][10]={"九十九","二十三","负三","三","四","二十三","六","七","八","九","十","增加","减少"}; for(i=0;i<13;i++) { if(i<11) { a=num(d[i]); if(a!=-1) printf("pass\n"); else printf("error\n"); } else { a=judge(d[i]); if(a!=-1) printf("pass\n"); else printf("error\n"); } } }
测试脚本
结果展示
5.测试脚本
测试文本代码
测试结果
测试脚本
6.完整代码
#include<stdio.h> #include<string.h> #include<math.h> int num(char d[]) { char nums[11][4]={"零","一","二","三","四","五","六","七","八","九","十"}; char b[0]; int n,i,j,sum=0,judge=0; n=strlen(d); for(i=0;i<=n-2;i=i+2) { strncpy(b,d+i,2); if(!strcmp(b,"负")) judge=1; for(j=0;j<11;j++) { if(!strcmp(b,nums[j])) { if(i==0&&j==10) sum+=j; else if(i!=0&&j==10) sum=sum*10; else if(j!=10) sum+=j; } } } if(judge==0) return sum; else return sum*(-1); } int judge(int n ,char c[],char d[]) { if(!strcmp(c,"增加")) return n+num(d); else if(!strcmp(c,"减少")) return n-num(d); else if(!strcmp(c,"乘以")) return n*num(d); else if(!strcmp(c,"除以")) return n/num(d); } void sum(int n) { char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"}; if(n<0) { printf("欠债:"); n=fabs(n); } if(n<10) printf("%s",nums[n]); else if(n<100) { int m=n%10; n=n/10; if(!strcmp(nums[n],"一")) printf("十%s",nums[m]); else printf("%s十%s",nums[n],nums[m]); } else { int m=n%10,k=n/100; n=n%100/10; if(!strcmp(nums[n],"零")) printf("%s百零%s",nums[k],nums[m]); else if(!strcmp(nums[m],"零")) printf("%s百%s十",nums[k],nums[n]); else printf("%s百%s十%s",nums[k],nums[n],nums[m]); } printf("\n"); } void calculate(int coin) { char b[10],c[10],d[10]; while(2) { scanf("%s",b); if(!strcmp(b,"看看")) { sum(coin); break; } scanf("%s%s",c,d); coin = judge(coin,c,d); } } int main() { char file[100]; printf("请输入文件地址\n"); scanf("%s",file); freopen(file,"r",stdin); char a[10], b[10], c[10], d[10]; int coin; scanf("%s%s%s%s",a,b,c,d); getchar(); if(!strcmp(a,"整数")) { coin += num(d); } calculate(coin); }
总结:寒假结束了,回顾整个寒假,虽然都是待在家里(虽然以前我也是在家里),但这个寒假我学习了Python、flask、HTML、css、c++。即使都学习得不是很深入,但仍然带给我快乐,看着自己十几篇的博客(断更了...)和简单的网页,知识带给我创造的快乐。谢谢大家,暑假再见。
来源:https://www.cnblogs.com/trainking-star/p/12312635.html