面向对象程序设计寒假作业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;	
}

一些样例




3. 思考

1. 对于扩大数字的范围,可以增加对像“十”、“百”、“千”等字识别在进行处理,再对一些特例进行判断,实现的难度应该不会很大。

2. 对于增加运算方法,可以增加对乘除的识别,再增加乘除的函数即可。

posted @ 2020-02-14 17:33  Linyib  阅读(257)  评论(0编辑  收藏  举报