面向对象程序设计第三次作业
这个作业属于哪个课程 | 2020春福大面向对象程序设计 |
---|---|
这个作业要求在哪里 | 寒假作业3 |
这个作业的目标 | 继续完成作业二的编程题。优化架构,思考代码的拓展性 |
作业正文 | 第三次作业 |
编程题
- 继续完成作业二的编程题。
- 优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
- 思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
仓库地址:https://github.com/fzu-CCchaos/oop-homework-CCchaos
关于两位数输入的功能的添加:
因为一开始写的代码只支持个位数的输入,所以这次为了扩展数字范围,我尝试一下支持两位数的输入。(好像大佬们很早就实现了)
思考过程:
要实现二位数的输入,首先要知道怎么把二位数中的每个字分离出来。于是先根据想象做了一个简单的实验:
#include<stdio.h>
int main()
{char a[10],b[10];
scanf("%s",a);
printf("%c",a[2]);
printf("%c",a[3]);
return 0;
}
发现如果只写一行printf("%c",a[2]);
那么就什么都不会输出,如果写了连续两个字符元素,就会输出对应的汉字。例如上面的程序,输入“五十五”就会输出“十”。
所以,可以产生一个比较粗略的思路:可以新建几个字符型数组,用来分别存输入汉字的单个字符。同时要考虑的特殊情况有例如“十六”这样的输入,如果是例如“七十”这样的输入,在第三个汉字的判断时通过if else的方法就可以找出来。注意:在新建的字符数组赋值后,要再添加一个’\0’,不然会出现错误。
实现方法:在原先的change函数中,添加了不满足0到10的任意数的情况,并将该情况的返回值设定为change2的返回值。change2是用来将输入的两位数的汉字转化成数字的。change2的写法如下:
int change2(char shu[])
{
char x[10],y[10],z[10];
int m=0;
x[0]=shu[0];x[1]=shu[1];x[2]='\0';
if(strcmp(x,"十")==0)
{y[0]=shu[2];y[1]=shu[3];y[2]='\0';
if(strcmp(y,"一")==0) m=11;
if(strcmp(y,"二")==0) m=12;
if(strcmp(y,"三")==0) m=13;
if(strcmp(y,"四")==0) m=14;
if(strcmp(y,"五")==0) m=15;
if(strcmp(y,"六")==0) m=16;
if(strcmp(y,"七")==0) m=17;
if(strcmp(y,"八")==0) m=18;
if(strcmp(y,"九")==0) m=19;
}
else
{
if(strcmp(x,"二")==0) m+=20;
if(strcmp(x,"三")==0) m+=30;
if(strcmp(x,"四")==0) m+=40;
if(strcmp(x,"五")==0) m+=50;
if(strcmp(x,"六")==0) m+=60;
if(strcmp(x,"七")==0) m+=70;
if(strcmp(x,"八")==0) m+=80;
if(strcmp(x,"九")==0) m+=90;
z[0]=shu[4];z[1]=shu[5];z[2]='\0';
if(strcmp(z,"一")==0) m+=1;
else if(strcmp(z,"二")==0) m+=2;
else if(strcmp(z,"三")==0) m+=3;
else if(strcmp(z,"四")==0) m+=4;
else if(strcmp(z,"五")==0) m+=5;
else if(strcmp(z,"六")==0) m+=6;
else if(strcmp(z,"七")==0) m+=7;
else if(strcmp(z,"八")==0) m+=8;
else if(strcmp(z,"九")==0) m+=9;
else m+=0;
}
return m;
}
change2和change函数共同进行对输入的汉字的转换功能。所以测试是一起进行的。测试代码如下:
#include<stdio.h>
#include<string.h>
int change2(char shu[])
{
char x[10],y[10],z[10];
int m=0;
x[0]=shu[0];x[1]=shu[1];x[2]='\0';
if(strcmp(x,"十")==0)
{y[0]=shu[2];y[1]=shu[3];y[2]='\0';
if(strcmp(y,"一")==0) m=11;
if(strcmp(y,"二")==0) m=12;
if(strcmp(y,"三")==0) m=13;
if(strcmp(y,"四")==0) m=14;
if(strcmp(y,"五")==0) m=15;
if(strcmp(y,"六")==0) m=16;
if(strcmp(y,"七")==0) m=17;
if(strcmp(y,"八")==0) m=18;
if(strcmp(y,"九")==0) m=19;
}
else
{
if(strcmp(x,"二")==0) m+=20;
if(strcmp(x,"三")==0) m+=30;
if(strcmp(x,"四")==0) m+=40;
if(strcmp(x,"五")==0) m+=50;
if(strcmp(x,"六")==0) m+=60;
if(strcmp(x,"七")==0) m+=70;
if(strcmp(x,"八")==0) m+=80;
if(strcmp(x,"九")==0) m+=90;
z[0]=shu[4];z[1]=shu[5];z[2]='\0';
if(strcmp(z,"一")==0) m+=1;
else if(strcmp(z,"二")==0) m+=2;
else if(strcmp(z,"三")==0) m+=3;
else if(strcmp(z,"四")==0) m+=4;
else if(strcmp(z,"五")==0) m+=5;
else if(strcmp(z,"六")==0) m+=6;
else if(strcmp(z,"七")==0) m+=7;
else if(strcmp(z,"八")==0) m+=8;
else if(strcmp(z,"九")==0) m+=9;
else m+=0;
}
return m;
}
int change(char shu[])
{
if(strcmp(shu,"一")==0) return 1;
else if(strcmp(shu,"二")==0) return 2;
else if(strcmp(shu,"三")==0) return 3;
else if(strcmp(shu,"四")==0) return 4;
else if(strcmp(shu,"五")==0) return 5;
else if(strcmp(shu,"六")==0) return 6;
else if(strcmp(shu,"七")==0) return 7;
else if(strcmp(shu,"八")==0) return 8;
else if(strcmp(shu,"九")==0) return 9;
else if(strcmp(shu,"零")==0) return 0;
else if(strcmp(shu,"十")==0) return 10;
else return change2(shu);
}
int main()
{
char a[5][20]={"二十","五十六","十七","二十三","九十九"};
int b,i;
printf("这是两位数转换的测试:\n");
for(i=0;i<5;i++)
{printf("输入 %s ",a[i]);
b=change(a[i]);
if(b>=0&&b<100)
printf("%d pass\n",b);
else
printf("error");
}
}
运行结果如图所示
关于除法和乘法功能的添加
思路就是分别写两个函数,用来进行乘法和除法的运算,在主函数里的修改只要增加判断时的两个特例,所以实现方法并不复杂。函数如下:
int cheng(int num,int x)
{int ch;
ch=num*x;
return ch;
}
int chu(int num,int x)
{int chu;
chu=num/x;
return chu;
}
关于负数输出功能的添加
由于在输入中输入负数的可能性较小,在经过运算后得到一个负数结果的可能性还是比较大的,所以在输出函数中可以多做一个判断,如果最后结果num<0,就在输出结果前添加一个负号,再将num变为正数,其余的输出就和正数的输出一样了。实现方法是在print函数的最前面加上下列语句:
if(num<0)
{printf("负");
num=-num;
}
直播中提到这道题可以通过确定从字符数组的哪里开始读取,从而可以一次性地读入一整行的字符然后进行操作。这样对字符串的控制会更加快捷。
可以改进的地方
- 支持更高位数字的输入输出,例如千或万的数值
- 支持多次查看钱包余额,而不是输入一次“看看”就停止
收获
- 一个函数不要包含太多功能,不然改起函数来同样很麻烦