面向对象程序设计寒假作业3
这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 寒假作业三 |
作业正文 | 寒假作业3 |
这个作业的目标 | 1.继续完成作业二的编程题,优化代码 2. 思考一个代码的延展性 |
编程题
- 继续完成作业二的编程题。
- 优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
- 思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
优化代码
- 将之前的代码做了一些优化,把错误分析单独独立为一个函数模块,并且完善了错误分析,从数据类型,数据范围,运算操作和初始化四个角度报错。用error函数,按照不同的参数输出不同的错误提示。
void error(int n) { if(n==1) printf("只支持整数数据\n"); if(n==2) printf("运算操作错误,仅支持增加或减少\n"); if(n==3) printf("数据超出范围,仅支持0-99内数据\n"); if(n==4) printf("未初始化\n"); }
- 我新加入了负数的计算,使程序范围由0-99变为-99-99.通过读入数据时判断第一个汉字是否为“负”,因为我们平常习惯说到负数时,第一个字一定是“负”。然后开一个字符数组minus存储符号,如果有“负”则执行函数exchange1。
int main() { char minus[5]; //freopen("homework.txt","r",stdin);// char var[10],name[100],op[100],num[10]; //变量类型,变量名,运算// scanf("%s %s %s %s",var,name,op,num); if(strcmp(var,"整数")!=0){ error(1); } if(strlen(num)>=4){ char str[15]; str[0]=num[2];str[1]=num[3]; if(strcmp(str,"百")==0) error(3); } int sum; if(strcmp(op,"等于")==0){ //初始化// minus[0]=num[0];minus[1]=num[1]; if(strcmp(minus,"负")==0) sum=exchange1(num); else sum=exchange(num); } else error(4); operation(name,op,num,sum); return 0; }
- exchange1函数内,将除去符号位的其余汉字存入unsign数组,执行exchange函数得到一个整数,exchange1函数返回为这个正数的相反数。
int exchange1(char a[]){ char unsign[15]; int result,i; for(i=2;i<strlen(a);i++){ unsign[i-2]=a[i]; } result=exchange(unsign); return -result; }
- 到这里汉字转数字结束,计算时对负数不需要特别的判断,数字转汉字时,先判断数字是正还是负,若为负数执行inexchange1函数,先转为正数,之后在每个输出结果前加“负”即可。
void inexchange1(int sum){ sum=-sum; int unit=sum%10,tens=sum/10; if(sum<=10)//0-10// printf("负%s\n",str[sum]); else if(sum>=11&&sum<=20||sum%10==0){ if(sum%10==0) printf("负%s十\n",str[tens]); else printf("负十%s\n",str[unit]); } else{ printf("负 %s十%s\n",str[tens],str[unit]); } }
下面是完整代码
#include<stdio.h> #include<string.h> char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"}; int exchange(char a[]); void inexchange(int sum); void operation(char name[],char op[],char num[],int sum); void error(int n); int exchange1(char a[]);//负数转换// void inexchange1(int sum); int main() { char minus[5]; //freopen("homework.txt","r",stdin);// char var[10],name[100],op[100],num[10]; //变量类型,变量名,运算// scanf("%s %s %s %s",var,name,op,num); if(strcmp(var,"整数")!=0){ error(1); } if(strlen(num)>=4){ char str[15]; str[0]=num[2];str[1]=num[3]; if(strcmp(str,"百")==0) error(3); } int sum; if(strcmp(op,"等于")==0){ //初始化// minus[0]=num[0];minus[1]=num[1]; if(strcmp(minus,"负")==0) sum=exchange1(num); else sum=exchange(num); } else error(4); operation(name,op,num,sum); return 0; } void operation(char name[],char op[],char num[],int sum){ //运算// int a; char minus[5]; while((scanf("%s",name))!=EOF) { if(strcmp(name,"看看")!=0){ scanf("%s %s",op,num); minus[0]=num[0];minus[1]=num[1]; if(strcmp(minus,"负")==0) a=exchange1(num); else a=exchange(num); if(strcmp(op,"增加")==0) sum+=a; else if(strcmp(op,"减少")==0) sum-=a; else error(2); } else { scanf("%s",op);//注意此时name存储的是操作,op存储的是变量名字// if(sum>0) inexchange(sum); else inexchange1(sum); } } } int exchange(char a[]){ //汉字转数字// int i,j,n,sum; char tens[10],unit[10]; if(strlen(a)==2) { //1-10// for(i=0;i<=10;i++){ if((strcmp(a,str[i])==0)) return i; } } if(strlen(a)==4){ //11-20,10的倍数// tens[0]=a[0];tens[1]=a[1]; unit[0]=a[2];unit[1]=a[3]; if(strcmp(tens,"十")==0){ for(i=0;i<=10;i++){ if(strcmp(unit,str[i])==0) return 10+i; } } if(strcmp(unit,"十")==0){ for(i=0;i<=10;i++){ if(strcmp(tens,str[i])==0) return i*10; } } } else { //几十几// tens[0]=a[0];tens[1]=a[1]; unit[0]=a[4];unit[1]=a[5]; for(i=0;i<=10;i++){ if(strcmp(tens,str[i])==0) sum=i*10; } for(i=0;i<=10;i++){ if(strcmp(unit,str[i])==0) sum+=i; } return sum; } } void inexchange(int sum){ //数字转文本// int unit=sum%10,tens=sum/10; if(sum<=10)//0-10// printf("%s\n",str[sum]); else if(sum>=11&&sum<=20||sum%10==0){ if(sum%10==0) printf("%s十\n",str[tens]); else printf("十%s\n",str[unit]); } else{ printf("%s十%s\n",str[tens],str[unit]); } } int exchange1(char a[]){ char unsign[15]; int result,i; for(i=2;i<strlen(a);i++){ unsign[i-2]=a[i]; } result=exchange(unsign); return -result; } void inexchange1(int sum){ sum=-sum; int unit=sum%10,tens=sum/10; if(sum<=10)//0-10// printf("负%s\n",str[sum]); else if(sum>=11&&sum<=20||sum%10==0){ if(sum%10==0) printf("负%s十\n",str[tens]); else printf("负十%s\n",str[unit]); } else{ printf("负 %s十%s\n",str[tens],str[unit]); } } void error(int n) { if(n==1) printf("只支持整数数据\n"); if(n==2) printf("运算操作错误,仅支持增加或减少\n"); if(n==3) printf("数据超出范围,仅支持0-99内数据\n"); if(n==4) printf("未初始化\n"); }
一些样例
单元测试
对新增的exchange1做了测试
#include<stdio.h> #include<string.h> char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"}; char exe[6][10]={"负十七","负八十","负十五","负三十五","负二十五","负五十"}; int main() { char tens[4],unit[4]; int sum,i,j,result,k,b; for(i=0;i<6;i++) { if(strlen(exe[i])==6){ tens[0]=exe[i][2];tens[1]=exe[i][3]; unit[0]=exe[i][4];unit[1]=exe[i][5]; if(strcmp(tens,"十")==0){ for(j=0;j<=10;j++){ if(strcmp(unit,str[j])==0) { b=10+j; } } } if(strcmp(unit,"十")==0){ for(j=0;j<=10;j++){ if(strcmp(tens,str[j])==0){ b=j*10; } } } } else{ tens[0]=exe[i][2];tens[1]=exe[i][3]; unit[0]=exe[i][6];unit[1]=exe[i][7]; for(j=0;j<=10;j++){ if(strcmp(tens,str[j])==0) { b=j*10; } } for(j=0;j<=10;j++){ if(strcmp(unit,str[j])==0) { b+=j; } } } printf("%s %d\n",exe[i],-b); } return 0; }
思考
- 可以扩大数据范围,增加百,千等判断,在原有代码基础上类似的判断各种情况如几百,几千,几百几十,几千几百等。
- 增加循环语句,可以增减关键词如“次”,几次就是循环几遍,遇到关键词“次”就进行循环操作
- 增加运算操作,可以增加乘除,取模,甚至是次方,提前规定一个统一的表达方法,判断关键词,遇到什么关键词就执行什么运算操作。
来源:https://www.cnblogs.com/fzu-nothing/p/12312281.html