这个作业属于哪个课程 2020面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业3
这个作业的目标 1.优化代码2.增加更多的功能
作业正文 第三次作业
其他参考文献 gcc,gcc编译命令
仓库地址
这次作业的主要内容:
继续完成作业二的编程题。
优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
这次我主要进行的优化是将数字与汉字互相转化的过程;
原来的代码用到了在<math.h>这个头文件,后来仔细想一想根本不需要,
因为我的数字范围比较小所以不需要用到数学函数
我原来的代码是:
int run2(char f[][3],int i,int dight,int dight2)
{
	int sum2=0,ii=0,k=0;
	if(strcmp(f[0],"十")==0&&dight==2)
		sum2=10;
	else{
	if(strcmp(f[dight2-1],"十")==0)
		strcpy(f[dight2-1],"零");
	if(strcmp(f[0],"十")==0) 
		{strcpy(f[0],"一");} 
	for(i=0,ii=0;i<dight2;i++)
	{if(strcmp(f[i],"百")!=0&&strcmp(f[i],"十")!=0)
			strcpy(f[ii++],f[i]);}
	for(i=0,k=ii-1;i<ii;i++,k--)
	{sum2=sum2+zh1(f,i)*pow(10,k);}
	}
	return sum2;
}

后来我改进为不需要去除汉字中的十;假如是三十一,那么我们就拆成三,十,一,用三乘以十再加一即可
一百以后的数字也可以这样算
改进后的代码:

int run2(char f[][3],int i,int dight,int dight2)
{
	int sum2=0,a=0;
	if(strcmp(f[0],"负")==0)
	  	{
		  sum2=run4(f,i);
	return -sum2;} 
	if(i==1) sum2=zh1(f,a);
	else if(i==2){
		if(strcmp(f[0],"十")==0) sum2=zh1(f,a)+zh1(f,a+1);
		else if(strcmp(f[1],"十")==0) sum2=zh1(f,0)*10;
	}
	else if(i==3) sum2=zh1(f,a)*zh1(f,a+1)+zh1(f,a+2);
	return sum2;
}

这样看起来更加简便并且不那么复杂;
还有的就是添加计算负数的功能
我添加了一个函数用来计算负数;

int run4(char f[][3],int m){
	int sum2=0,a=1;
	if(m==2) sum2=zh1(f,1);
	else if(m==3){
		if(strcmp(f[1],"十")==0) sum2=zh1(f,1)+zh1(f,2);
		else if(strcmp(f[2],"十")==0) sum2=zh1(f,1)*10;
	}
	else if(m==4) sum2=zh1(f,1)*zh1(f,2)+zh1(f,3);
	return sum2;
}

完整的代码:

#include<stdio.h>
#include<string.h>
#include<math.h> 
struct hanzi{
	char name[20];
	char operate[20];
	char num[20];
}; //定义结构体,储存汉字变量名。 
int zh1(char f[][3],int i);//将汉字转化为数字。
void zh2(int n);//将数字转化为汉字。
void run(); 
int run2(char f[][3],int i,int dight,int dight2);
int run3(char e[][3],int i,int dight,int dight2,int sum2,char op[]);
void printf_(int sum2);
int run4(char f[][3],int m);//负数的转化。 
int main()
{
	run();
	return 0;
}
void run()
{
	hanzi a;
	char u[10],op[20],o[20];
	int q=0,sum1=0,sum2=0;
	int i=0,j=0,ii,m=0;
	scanf("%s %s %s %s",u,a.name,a.operate,a.num);
	char e[100][3],f[10][3],g[100][3];
	int dight=strlen(a.num);
	int dight2=dight/2;
	int k=0;
	for(i=0;i<dight2;i++)
	{
		for(int j=0;j<2;j++,k++)
			f[i][j]=a.num[k];
		f[i][2]='\0';
	}
	sum2=run2(f,i,dight,dight2);
	while(scanf("%s",&o),strcmp(o,"看看")!=0)
		{
			scanf("%s %s",&op,a.num);
			 	dight=strlen(a.num);
	 			dight2=dight/2;
				k=0;
				for(i=0;i<dight2;i++)
				{
					for(int j=0;j<2;j++,k++)
						e[i][j]=a.num[k];
					    e[i][2]='\0';
			    }
			    sum2=run3(e,i,dight,dight2,sum2,op);
     }
    printf_(sum2);}
int run3(char e[][3],int i,int dight,int dight2,int sum2,char op[])
{
	int sum1=0,k=0,a=0;
	if(strcmp(e[0],"负")==0)
	  {
	  	sum1=run4(e,i);
	 	sum1=-sum1;
	  }
	else 
	{
	if(i==1)
	 sum1=zh1(e,0);
	else if(i==2){
		if(strcmp(e[0],"十")==0) sum1=zh1(e,0)+zh1(e,1);
		else if(strcmp(e[1],"十")==0) sum1=zh1(e,0)*10;
	}
	else if(i==3) sum1=zh1(e,0)*zh1(e,1)+zh1(e,2);
	}
	if(strcmp(op,"增加")==0) sum2+=sum1;
	if(strcmp(op,"减少")==0) sum2-=sum1;
	if(strcmp(op,"乘以")==0) sum2*=sum1;
	if(strcmp(op,"除以")==0) sum2/=sum1;
	return sum2;
}
int run2(char f[][3],int i,int dight,int dight2)
{
	int sum2=0,a=0;
	if(strcmp(f[0],"负")==0)
	  	{
		  sum2=run4(f,i);
	return -sum2;} 
	if(i==1) sum2=zh1(f,a);
	else if(i==2){
		if(strcmp(f[0],"十")==0) sum2=zh1(f,a)+zh1(f,a+1);
		else if(strcmp(f[1],"十")==0) sum2=zh1(f,0)*10;
	}
	else if(i==3) sum2=zh1(f,a)*zh1(f,a+1)+zh1(f,a+2);
	return sum2;
}
void printf_(int sum2)
{
	if(sum2<0)
		{
			printf("负");
			sum2=-sum2;
		}
	if(sum2<=10) zh2(sum2);
	else if(sum2>10){
	 	int b,c;
	 	b=sum2/10,c=sum2%10;
	 	if(c==0) 
		 {
		 	zh2(b);printf("十");
		 }
		 else if(b==1) {printf("十");zh2(c);}
		else if(b!=1){
			zh2(b);
			printf("十");
			zh2(c); 
		}
	 } 
} 
int zh1(char f[][3],int i)
{
	if(strcmp(f[i],"一")==0) return 1;
	if(strcmp(f[i],"二")==0) return 2;
	if(strcmp(f[i],"三")==0) return 3;
	if(strcmp(f[i],"四")==0) return 4;
	if(strcmp(f[i],"五")==0) return 5;
	if(strcmp(f[i],"六")==0) return 6;
	if(strcmp(f[i],"七")==0) return 7;
	if(strcmp(f[i],"八")==0) return 8;
	if(strcmp(f[i],"九")==0) return 9;
	if(strcmp(f[i],"零")==0) return 0; 
	if(strcmp(f[i],"十")==0) return 10;
}
void zh2(int n)
{
	if(n==0) printf("零"); 
	if(n==1) printf("一");
	if(n==2) printf("二");
	if(n==3) printf("三");
	if(n==4) printf("四");
	if(n==5) printf("五");
	if(n==6) printf("六");
	if(n==7) printf("七");
	if(n==8) printf("八");
	if(n==9) printf("九"); 
	if(n==10) printf("十"); 
}
int run4(char f[][3],int m){
	int sum2=0,a=1;
	if(m==2) sum2=zh1(f,1);
	else if(m==3){
		if(strcmp(f[1],"十")==0) sum2=zh1(f,1)+zh1(f,2);
		else if(strcmp(f[2],"十")==0) sum2=zh1(f,1)*10;
	}
	else if(m==4) sum2=zh1(f,1)*zh1(f,2)+zh1(f,3);
	return sum2;
}

运行结果:

还有是编译脚本之前我用的是cl /EHsc这个语句
我想了想还是用gcc来编译
当然刚开始的时候我也遇到了问题
gcc不是内部或外部命令
我就上网查了一下,网上说要在环境变量中的path中储存gcc的位置,这样编译的时候才能找到gcc
所以我改进了编译脚本:


接下来是单元测试:


这就是第三次作业的内容了
经过这三次寒假作业,我学到了很多东西
命令行,编译脚本,批处理,文件的运用,GitHub的运用
接下来要加油了。