面向对象程序设计寒假作业3
这个作业属于哪个课程 | 2020面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业3 |
这个作业的目标 | 1. 继续完成编程题 2. 发布博客。 |
作业正文 | 作业链接 |
一.编程题(请使用C语言或者C++完成以下题目):
继续完成作业二的编程题。
优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
编程题要求:
读题,提取出题目的要求。
分解需求,把需求分解为几个你觉得不太相关的模块。
思考每个模块怎么写,可以从简单的模块开始写。
对于不会的问题进行查阅资料。
对于每一个模块设计测试用例。
详细记录下以上每一步,并写在博客中。
不要求完全做出来,但要求记录详细。
建议博客长度不少于1000字(不包含代码)。
1. 优化代码:
1. 我对之前的代码进行了优化,将各个函数的功能区分开,进行修改时比较容易。将输入的范围扩大到099。通过change函数将汉字传入,将汉字按两个字节划分,通过cmp函数转化成数字,通过单个数字之间联系处理,再按照数字的不同进行判断。其中较难的部分是对1019部分的读入,我是将他们默认成只能识别十一、十二......
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int cmp(char* a,char* str,int pos){
for(int i=0;i<strlen(str);i++)
if(a[pos+i]!=str[i]) return 0;
return 1;
}
int change(char* a){//将汉字转化成数字进行运算
int num=0,i,j;
for(i=0;i<strlen(a);i+=2){
for(j=0;j<11;j++){
if(cmp(a,str[j],i)) break;
}
if(j==10&&i==0) num=1;
int t=1;
if(j==10) t=10,j=0;
num=num*t+j;
}
return num;
}
2. 另一个转化部分是将数字转化成汉字的changge1函数
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
void change1(int n,char* cnum){
char a[20];
if(n<=10) strcpy(cnum,str[n]);
else{
t=n/10,n=n%10;
if(t==1){//考虑“十”和“一十”的差别
strcpy(cnum,str[10]);
if(n!=0) strcat(cnum,str[n]);//考虑末尾是零的情况
}
else{
strcpy(cnum,str[t]);
strcat(cnum,str[10]);
if(n!=0) strcat(cnum,str[n]);
}
}
}
3. 然后是运算函数,add函数和red函数,进行加减。
//加法运算
int add(int n,char* num){
return n+=change(num);
}
//减法运算
int red(int n,char* num){
return n-=change(num);
}
4. 最后是输入和输出函数,输入函数没有太大的变化,输出函数增加一个参数,来判断是正常的输出汉字还是报错,同时将报错分成三种情况,用switch进行输出。
//输入函数
int in(void){
scanf("%s",name1);
if(!strcmp(name1,"看看")) return 0;//输入结束标志
if(strcmp(name1,name)) return 1;//判断运算对象是不是定义的变量,否则不进行还回主函数
scanf("%s %s",fu,num);
if(!strcmp(fu,"增加")) n=add(n,num);//判断运算符号
else n=red(n,num);
return 1;
}
//输出函数
void out(int tu,int n){
if(tu==1){
if(n<0){
printf("负");
n*=-1;
}
change1(n,cnum);
printf("%s",cnum);}
else{
switch(n){
case 1:printf("询问对象错误!!!");break;
case 2:printf("所求范围不在-99~99!!!");break;
case 3:printf("只能求算整数类型!!!");break;
}
}
}
2. 增加负数
在原有的基础上,增加了判断负数的功能,同时也将数的范围扩大到-99~99之间。增加这个功能对代码的改变并不复杂,只要在识别输入的change函数增加if判断,在输出的out函数增加if判断即可。
char is_fu[4]="负";
int change(char* a){
int num=0,i,j,flag=2;
for(i=0;i<2;i++)
if(a[i]!=is_fu[i]) flag=0;
for(i=flag;i<strlen(a);i+=2){
for(j=0;j<11;j++){
if(cmp(a,str[j],i)) break;
}
if(j==10&&i==flag) num=1;
int t=1;
if(j==10) t=10,j=0;
num=num*t+j;
}
if(flag) num*=-1;
return num;
}
void out(int tu,int n){
if(tu==1){
if(n<0){
printf("负");
n*=-1;
}
change1(n,cnum);
printf("%s",cnum);}
else{
switch(n){
case 1:printf("询问对象错误!!!");break;
case 2:printf("所求范围不在-99~99!!!");break;
case 3:printf("只能求算整数类型!!!");break;
}
}
}
单元测试
对change函数进行测试是个样例
对changge1函数和out函数的测试
下面是完整的代码
#include<stdio.h>
#include<string.h>
int n,t;
char type[20],name[20],name1[20],fu[20],num[20],cnum[20];
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"},is_fu[4]="负";
//遍历二维数组str,将汉字转成数字
int cmp(char* a,char* str,int pos){
for(int i=0;i<strlen(str);i++)
if(a[pos+i]!=str[i]) return 0;
return 1;
}
//将汉字转化成数字进行运算
int change(char* a){
int num=0,i,j,flag=2;
for(i=0;i<2;i++)
if(a[i]!=is_fu[i]) flag=0;
for(i=flag;i<strlen(a);i+=2){
for(j=0;j<11;j++){
if(cmp(a,str[j],i)) break;
}
if(j==10&&i==0) num=1;
int t=1;
if(j==10) t=10,j=0;
num=num*t+j;
}
if(flag) num*=-1;
return num;
}
//加法运算
int add(int n,char* num){
return n+=change(num);
}
//减法运算
int red(int n,char* num){
return n-=change(num);
}
//将汉字转化成数字
void change1(int n,char* cnum){
char a[20];
if(n<=10) strcpy(cnum,str[n]);
else{
t=n/10,n=n%10;
if(t==1){//考虑“十”和“一十”的差别
strcpy(cnum,str[10]);
if(n!=0) strcat(cnum,str[n]);//考虑末尾是零的情况
}
else{
strcpy(cnum,str[t]);
strcat(cnum,str[10]);
if(n!=0) strcat(cnum,str[n]);
}
}
}
//输入函数
int in(void){
scanf("%s",name1);
if(!strcmp(name1,"看看")) return 0;//输入结束标志
if(strcmp(name1,name)) return 1;//判断运算对象是不是定义的变量,否则不进行还回主函数
scanf("%s %s",fu,num);
if(!strcmp(fu,"增加")) n=add(n,num);//判断运算符号
else n=red(n,num);
return 1;
}
//输出函数
void out(int tu,int n){
if(tu==1){
if(n<0){
printf("负");
n*=-1;
}
change1(n,cnum);
printf("%s",cnum);}
else{
switch(n){
case 1:printf("询问对象错误!!!");break;
case 2:printf("所求范围不在-99~99!!!");break;
case 3:printf("只能求算整数类型!!!");break;
}
}
}
int main(int argc,char *argv[]){
freopen(argv[1],"r",stdin);
scanf("%s %s %s %s",type,name,fu,num);
n=change(num);
if(!strcmp(type,"整数")){//判断类型是否为“整数”
while(1){
if(!in()) break;
}
scanf("%s",name1);
if(strcmp(name1,name)) out(0,1); // 判断最后询问对象是否是该变量或数字不在0~99的范围内 ,否则报错
else if(n<-99||n>99) out(0,2);
else out(1,n);
}
else out(0,3);
return 0;
}
一些样例