这个作业属于哪个课程 | 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的运用
接下来要加油了。