作业描述 | 作业详情 |
---|---|
这个作业属于哪个课程 | 2020年面向对象程序设计 |
这个作业要求在哪 | 面向对象程序设计寒假作业3 |
这个作业的目的 | 1.继续完成编程题,优化架构 2.发布博客 |
作业正文 | 面向对象程序设计寒假作业3 |
面向对象程序设计寒假作业3
编程题(请使用C语言或者C++完成以下题目):
继续完成作业二的编程题。
优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
编程题要求:
读题,提取出题目的要求。
分解需求,把需求分解为几个你觉得不太相关的模块。
思考每个模块怎么写,可以从简单的模块开始写。
对于不会的问题进行查阅资料。
对于每一个模块设计测试用例。
详细记录下以上每一步,并写在博客中。
不要求完全做出来,但要求记录详细。
建议博客长度不少于1000字(不包含代码)。
解释
单元测试:对每一个函数进行测试,这代表了你需要把代码分到不同的文件,使用不同的主函数切换测试/运行。
编译脚本:运行该脚本后无需任何输入就能自动编译全部代码,并输出编译结束的代码。
测试脚本:运行该脚本后可以自动的编译并运行所有测试样例,并输出测试结果。
解题
说在前头:
由于我第二次作业上有很多点没有做好,没有去深究,导致第三次作业还有用到第二次作业的知识时给卡壳,所以还是有些简单的问题需要去解决的。
而这几天家里网络有问题,我花了很长时间尝试下载Git和GitHub desktop都无果,所以打算到学校或者有适合的地方再下载,这次我就没有上传到仓库去。
正文开始!
单元测试
还是老思路,其实我是分了几个阶段来修改代码,由于我的第一个代码实在是没什么功能,所以能修改的空间实在是太大了哈哈哈。
数字转换成汉字部分
本来的代码就纯手打实现0到10的转换。。。emmmm实在不忍直视吼
然后这次也是查了网络上的资料,总结折腾出了一个可以计算到十万以内
如下:
#include
#define ZERO_TRUE 0 //上一个有0
#define ZERO_FALSE 1
void panduan (int ); //判断数字位数 ,调用相应函数
int shuzi (int ); //打印数字专用
void wan (int );
void qian (int );
void bai (int ,int );
void shi (int ,int );
void ge (int ,int );
int main()
{printf("数字转汉字\n");
freopen("shuzizhuanhanzi.txt","r",stdin);
int shu;
for(int p=0;p<6;p++){
scanf("%d",&shu);
panduan(shu);
if(shu==0){
printf("零");
}
printf("\n");
}
}
void panduan(int shu)
{
if(shu>9999){wan(shu);}
else if(shu>999){qian(shu);} //直接调用预设无0
else if(shu>99){bai(shu,ZERO_FALSE);}
else if(shu>9){shi(shu,ZERO_FALSE);}
else if(shu>-1){ge(shu,ZERO_FALSE);}
}
void wan(int shu)
{
shuzi(shu/10000);
printf("万");
qian(shu-10000*(shu/10000));
}
void qian(int shu)
{
if(shu/1000==0){bai(shu-1000*(shu/1000),ZERO_TRUE);} //告诉百位千位是0
else
{
shuzi(shu/1000);
printf("千");
bai(shu-1000*(shu/1000),ZERO_FALSE);
}
}
void bai(int shu,int zero)
{
if(shu/100==0){shi(shu-100*(shu/100),ZERO_TRUE);}
else
{
if(ZERO_TRUE==zero) printf("零");
shuzi(shu/100);
printf("百");
shi(shu-100*(shu/100),ZERO_FALSE);
}
}
void shi(int shu,int zero)
{
if(shu/10==0){ge(shu-10*(shu/10),ZERO_TRUE);}
else
{
if(ZERO_TRUE==zero) printf("零");
shuzi(shu/10);
printf("十");
ge(shu-10*(shu/10),ZERO_FALSE);
}
}
void ge(int shu,int zero)
{
if(shu==0){;} //如果是0 只输出
else
{
if(ZERO_TRUE==zero)printf("零");
shuzi(shu);
}
}
int shuzi(int shu)
{
switch(shu)
{
case 1:{printf("一");break;}
case 2:{printf("二");break;}
case 3:{printf("三");break;}
case 4:{printf("四");break;}
case 5:{printf("五");break;}
case 6:{printf("六");break;}
case 7:{printf("七");break;}
case 8:{printf("八");break;}
case 9:{printf("九");break;}
}
}
功能虽说跟之前比起来强大倒是强大了,但是行数也是增加了非常的多
汉字转数字
这个依旧是从傻fufu的手打转成了可以计算一百以内的数了。在这里感谢一下俺的某位同鞋和我所要加'\0'的事,我问她之前还一直执着于自己的方法不能自拔导致了尽快做出作业的机会。
这里是分了两个函数
#include
#include
#include
int change1(char a[])
{
int change2(char a[]);
if(strcmp(a,"零")==0)return 0;
else if(strcmp(a,"一")==0)return 1;
else if(strcmp(a,"二")==0)return 2;
else if(strcmp(a,"三")==0)return 3;
else if(strcmp(a,"四")==0)return 4;
else if(strcmp(a,"五")==0)return 5;
else if(strcmp(a,"六")==0)return 6;
else if(strcmp(a,"七")==0)return 7;
else if(strcmp(a,"八")==0)return 8;
else if(strcmp(a,"九")==0)return 9;
else if(strcmp(a,"十")==0)return 10;
else if(strcmp(a,"二十")==0)return 20;
else if(strcmp(a,"三十")==0)return 30;
else if(strcmp(a,"四十")==0)return 40;
else if(strcmp(a,"五十")==0)return 50;
else if(strcmp(a,"六十")==0)return 60;
else if(strcmp(a,"七十")==0)return 70;
else if(strcmp(a,"八十")==0)return 80;
else if(strcmp(a,"九十")==0)return 90;
else if(strcmp(a,"一百")==0)return 100;
else
{int shuz;
shuz=change2(a);
return shuz;
}
}
int change2(char a[])
{
int shuzi;
char st1[3],st2[3],st3[3];
for(int i=0;i<3;i++){
st1[i]=a[i];
st2[i]=a[i+2];
st3[i]=a[i+4];
}
st1[2]='\0';
st2[2]='\0';
st3[2]='\0';
if(strcmp("十",st1)==0){
shuzi=10+change1(st2);
}
else shuzi=change1(st1)*10+change1(st3);
return shuzi;
}
int main(){using namespace std;
char str4[10];
printf("汉字转数字\n");
freopen("hanzizhuanshuzi.txt","r",stdin);
for(int p=0;p<5;p++){
cin>>str4;
int shu;
shu=change1(str4);
printf("%d",shu);
printf("\n");}
return 0;
}
全部的代码
测试脚本
赶脚刚学习C++,关于类的强大功能都还没有优秀的应用,就迷之头文件输入输出用了C++的。。。所以这其实就是充斥着C++输入输出味儿的C
#include
#include
#include
#define ZERO_TRUE 0
#define ZERO_FALSE 1
void panduan(int ); //判断数字位数 ,调用相应函数
int shuzi(int ); //打印数字专用
void wan(int );
void qian(int );
void bai(int ,int );
void shi(int ,int );
void ge (int ,int );
int change2(char a[]);
void panduan(int shu)
{
if(shu>9999){wan(shu);}
else if(shu>999){qian(shu);} //直接调用预设无0
else if(shu>99){bai(shu,ZERO_FALSE);}
else if(shu>9){shi(shu,ZERO_FALSE);}
else if(shu>-1){ge(shu,ZERO_FALSE);}
}
void wan(int shu)
{using namespace std;
shuzi(shu/10000);
cout<<"万";
qian(shu-10000*(shu/10000));
}
void qian(int shu)
{
if(shu/1000==0){bai(shu-1000*(shu/1000),ZERO_TRUE);} //告诉百位千位是0
else
{using namespace std;
shuzi(shu/1000);
cout<<"千";
bai(shu-1000*(shu/1000),ZERO_FALSE);
}
}
void bai(int shu,int zero)
{using namespace std;
if(shu/100==0){shi(shu-100*(shu/100),ZERO_TRUE);}
else
{
if(ZERO_TRUE==zero) cout<<"零";
shuzi(shu/100);
cout<<"百";
shi(shu-100*(shu/100),ZERO_FALSE);
}
}
void shi(int shu,int zero)
{using namespace std;
if(shu/10==0){ge(shu-10*(shu/10),ZERO_TRUE);}
else
{
if(ZERO_TRUE==zero) cout<<"零";
shuzi(shu/10);
cout<<"十";
ge(shu-10*(shu/10),ZERO_FALSE);
}
}
void ge(int shu,int zero)
{using namespace std;
if(shu==0){;} //如果是0 只输出
else
{
if(ZERO_TRUE==zero)cout<<"零";
shuzi(shu);
}
}
int shuzi(int shu)
{using namespace std;
switch(shu)
{
case 1:{cout<<"一";break;}
case 2:{cout<<"二";break;}
case 3:{cout<<"三";break;}
case 4:{cout<<"四";break;}
case 5:{cout<<"五";break;}
case 6:{cout<<"六";break;}
case 7:{cout<<"七";break;}
case 8:{cout<<"八";break;}
case 9:{cout<<"九";break;}
}
}
int change1(char a[])
{
int change2(char a[]);
if(strcmp(a,"零")==0)return 0;
else if(strcmp(a,"一")==0)return 1;
else if(strcmp(a,"二")==0)return 2;
else if(strcmp(a,"三")==0)return 3;
else if(strcmp(a,"四")==0)return 4;
else if(strcmp(a,"五")==0)return 5;
else if(strcmp(a,"六")==0)return 6;
else if(strcmp(a,"七")==0)return 7;
else if(strcmp(a,"八")==0)return 8;
else if(strcmp(a,"九")==0)return 9;
else if(strcmp(a,"十")==0)return 10;
else if(strcmp(a,"二十")==0)return 20;
else if(strcmp(a,"三十")==0)return 30;
else if(strcmp(a,"四十")==0)return 40;
else if(strcmp(a,"五十")==0)return 50;
else if(strcmp(a,"六十")==0)return 60;
else if(strcmp(a,"七十")==0)return 70;
else if(strcmp(a,"八十")==0)return 80;
else if(strcmp(a,"九十")==0)return 90;
else if(strcmp(a,"一百")==0)return 100;
else
{int shuz;
shuz=change2(a);
return shuz;
}
}
int change2(char a[])
{
int shuzi;
char st1[3],st2[3],st3[3];
for(int i=0;i<3;i++){
st1[i]=a[i];
st2[i]=a[i+2];
st3[i]=a[i+4];
}
st1[2]='\0';
st2[2]='\0';
st3[2]='\0';
if(strcmp("十",st1)==0){
shuzi=10+change1(st2);
}
else shuzi=change1(st1)*10+change1(st3);
return shuzi;
}
int main(){using namespace std;
char str1[10],str2[10],str3[10],str4[10],str5[10],str6[10],str7[10],str8[10];
int shu;
cin>>str1>>str2>>str3>>str4;
if(strcmp(str1,"整数")!=0||strcmp(str3,"等于")!=0)
cout <<"错误"<< endl;
shu=change1(str4);
while(1){
cin>>str5;
if(strcmp(str5,"看看")==0)break;
if(strcmp(str5,str2)!=0){cout<<"错误"<>str6>>str7;
if(strcmp(str6,"增加")==0)
shu=shu+change1(str7);
else if(strcmp(str6,"减少")==0)
shu=shu-change1(str7);
else {
cout <<"错误"<< endl; break;}
}
cin>>str8;
if(strcmp(str7,"看看")==0&&strcmp(str8,"钱包"==0)){
if(shu==0){
cout<<"零";
}
else panduan(shu);}
else cout<<"错误";
return 0;
}
#include
#include
#include
#define ZERO_TRUE 0
#define ZERO_FALSE 1
void panduan(int ); //判断数字位数 ,调用相应函数
int shuzi(int ); //打印数字专用
void wan(int );
void qian(int );
void bai(int ,int );
void shi(int ,int );
void ge (int ,int );
int change2(char a[]);
void panduan(int shu)
{
if(shu>9999){wan(shu);}
else if(shu>999){qian(shu);} //直接调用预设无0
else if(shu>99){bai(shu,ZERO_FALSE);}
else if(shu>9){shi(shu,ZERO_FALSE);}
else if(shu>-1){ge(shu,ZERO_FALSE);}
}
void wan(int shu)
{using namespace std;
shuzi(shu/10000);
cout<<"万";
qian(shu-10000*(shu/10000));
}
void qian(int shu)
{
if(shu/1000==0){bai(shu-1000*(shu/1000),ZERO_TRUE);} //告诉百位千位是0
else
{using namespace std;
shuzi(shu/1000);
cout<<"千";
bai(shu-1000*(shu/1000),ZERO_FALSE);
}
}
void bai(int shu,int zero)
{using namespace std;
if(shu/100==0){shi(shu-100*(shu/100),ZERO_TRUE);}
else
{
if(ZERO_TRUE==zero) cout<<"零";
shuzi(shu/100);
cout<<"百";
shi(shu-100*(shu/100),ZERO_FALSE);
}
}
void shi(int shu,int zero)
{using namespace std;
if(shu/10==0){ge(shu-10*(shu/10),ZERO_TRUE);}
else
{
if(ZERO_TRUE==zero) cout<<"零";
shuzi(shu/10);
cout<<"十";
ge(shu-10*(shu/10),ZERO_FALSE);
}
}
void ge(int shu,int zero)
{using namespace std;
if(shu==0){;} //如果是0 只输出
else
{
if(ZERO_TRUE==zero)cout<<"零";
shuzi(shu);
}
}
int shuzi(int shu)
{using namespace std;
switch(shu)
{
case 1:{cout<<"一";break;}
case 2:{cout<<"二";break;}
case 3:{cout<<"三";break;}
case 4:{cout<<"四";break;}
case 5:{cout<<"五";break;}
case 6:{cout<<"六";break;}
case 7:{cout<<"七";break;}
case 8:{cout<<"八";break;}
case 9:{cout<<"九";break;}
}
}
int change1(char a[])
{
int change2(char a[]);
if(strcmp(a,"零")==0)return 0;
else if(strcmp(a,"一")==0)return 1;
else if(strcmp(a,"二")==0)return 2;
else if(strcmp(a,"三")==0)return 3;
else if(strcmp(a,"四")==0)return 4;
else if(strcmp(a,"五")==0)return 5;
else if(strcmp(a,"六")==0)return 6;
else if(strcmp(a,"七")==0)return 7;
else if(strcmp(a,"八")==0)return 8;
else if(strcmp(a,"九")==0)return 9;
else if(strcmp(a,"十")==0)return 10;
else if(strcmp(a,"二十")==0)return 20;
else if(strcmp(a,"三十")==0)return 30;
else if(strcmp(a,"四十")==0)return 40;
else if(strcmp(a,"五十")==0)return 50;
else if(strcmp(a,"六十")==0)return 60;
else if(strcmp(a,"七十")==0)return 70;
else if(strcmp(a,"八十")==0)return 80;
else if(strcmp(a,"九十")==0)return 90;
else if(strcmp(a,"一百")==0)return 100;
else
{int shuz;
shuz=change2(a);
return shuz;
}
}
int change2(char a[])
{
int shuzi;
char st1[3],st2[3],st3[3];
for(int i=0;i<3;i++){
st1[i]=a[i];
st2[i]=a[i+2];
st3[i]=a[i+4];
}
st1[2]='\0';
st2[2]='\0';
st3[2]='\0';
if(strcmp("十",st1)==0){
shuzi=10+change1(st2);
}
else shuzi=change1(st1)*10+change1(st3);
return shuzi;
}
int main(){using namespace std;
char str1[10],str2[10],str3[10],str4[10],str5[10],str6[10],str7[10],str8[10];
int shu;
cin>>str1>>str2>>str3>>str4;
if(strcmp(str1,"整数")!=0||strcmp(str3,"等于")!=0)
cout <<"错误"<< endl;
shu=change1(str4);
while(1){
cin>>str5;
if(strcmp(str5,"看看")==0)break;
if(strcmp(str5,str2)!=0){cout<<"错误"<>str6>>str7;
if(strcmp(str6,"增加")==0)
shu=shu+change1(str7);
else if(strcmp(str6,"减少")==0)
shu=shu-change1(str7);
}
cin>>str8;
if(shu==0){
cout<<"零";
}
else panduan(shu);
return 0;
}
编译脚本
编译脚本阶段倾情演绎了什么叫“第二次少折腾的时间第三次来偿还”
这个就是我第二次作业没有用心琢磨的一点,我用所学的一点浅薄的知识写了个普通的脚本
然后...虽然显示了 编译成功 但当然还是不出所料的有大问题。
就是出现 No such file or directory
当时的我还不知道 路径 这种问题,我就又换了很多种写法,各种的无脑尝试,顺便发现自己隐藏了文件名,这里就不一一说明
然后我就去百度了,百度告诉我要下载WINGW,好吧那我就去下载去了,然后不知道是我的问题还是电脑的问题,下载了又显示没有数据。
最后,我还是去问了同学,她告诉我Dev里就自带了路径,不用再去下载。好吧。后来我发现群里在做第二次作业的时候有人提到了,这个怪我。
我就去高级设置里打算改路径,第一次改成了用户变量,折回来尝试又不行。
我就又去问了那个神奇的同学,她告诉我该改的是系统变量
诶嘿,我发现是OK了,,吧,我是真没想到我就折腾这个,就从早上折腾到下午两点。。。果然第二次作业少做的时间就由第三次作业来偿还。
小场面小场面