这个作业属于哪个课程 | <2020面向对象程序设计张栋班> |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业2 |
这个作业的目标 | 1.建立GitHub仓库,并把编程题代码与脚本上传到仓库里 2.优化上次编程题,并编写测试脚本,添加功能让它能够读取TXT文档 |
作业正文 | .... |
其他参考文献 | main函数参数解析, Windows(bat)常用命令教程 |
实践题
作业要求:
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
请使用.gitignore文件忽略不要上传的文件。用法自行百度。
作业过程
编程题
作业要求:
1.继续完成作业一的编程题。
2.优化架构,一般要求每个函数长度不超过15行。
3.优化规范,尤其是命名规范。
4.制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
5.进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
6.在作业一编程题的基础上添加以下功能:
7.通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
作业过程
1.继续完善编程题功能
前一次作业中,由于时间以及能力问题,有一些问题没有解决:1.输入增加或减少的数量不能超过10。2.上次不会用函数,导致代码长度特别长且繁琐。3.编程习惯不好,各部分没有分层,导致代码很不好看。
因此我把我的代码功能大概分成了三个部分,分别由三个函数实现。
第一个函数int f1(char b[])
int f1(char b[])/*个位数汉字转数字*/
{
int t;
if(strcmp(b,"零")==0)
t=0;
else if(strcmp(b,"一")==0)
t=1;
else if(strcmp(b,"二")==0)
t=2;
else if(strcmp(b,"三")==0)
t=3;
else if(strcmp(b,"四")==0)
t=4;
else if(strcmp(b,"五")==0)
t=5;
else if(strcmp(b,"六")==0)
t=6;
else if(strcmp(b,"七")==0)
t=7;
else if(strcmp(b,"八")==0)
t=8;
else if(strcmp(b,"九")==0)
t=9;
else if(strcmp(b,"十")==0)
t=10;
return t;
}
这个函数实现了个位数字汉字转阿拉伯数字用于增加或者减少计算,以及作为下一个函数f2两位数的汉字转阿拉伯数字的基础
int f2(char d[])/*零到九十九汉字转数字*/
{
char a[100];
int l;
if(strlen(d)==2)
l=f1(d);
else if(strlen(d)==4)
{
a[0]=d[0];
a[1]=d[1];
a[2]='\0';
if(strcmp(a,"十")!=0)
{
l=f1(a)*10;
}
else
{
a[0]=d[2];
a[1]=d[3];
a[2]='\0';
{
l=f1(a)+10;
}
}
}
else
{
a[0]=d[0];
a[1]=d[1];
a[2]='\0';
{
l=f1(a)*10;
}
a[0]=d[4];
a[1]=d[5];
a[2]='\0';
{
l=l+f1(a);
}
}
return l;
}
这个功能是这次作业新加入的,我发现一个汉字占两个字节的空间,并以此为依据,将输入分为三种情况:1.输入只有一个汉字2.输入为两个汉字3.输入为三个汉字。其中输入为一个汉字的情况就是阿拉伯数字0到10的情况,输入为两个汉字要细分为两种情况考虑一种是整十的数,一种是十到二十的数,其他情况就是输入为三个汉字的情况
第三个函数f3的功能是把数字转化成汉字
void f3(int t)/*数字转汉字*/
{if(t==0)
printf("零");
if(t==1)
printf("一");
if(t==2)
printf("二");
if(t==3)
printf("三");
if(t==4)
printf("四");
if(t==5)
printf("五");
if(t==6)
printf("六");
if(t==7)
printf("七");
if(t==8)
printf("八");
if(t==9)
printf("九");
}
由于零到九十九的表达都只用到零到十这十一个汉字,因此只要把零到十进行转化就行,总代吗如下
#include
#include
#include
int f1(char b[])/*个位数汉字转数字*/
{
int t;
if(strcmp(b,"零")==0)
t=0;
else if(strcmp(b,"一")==0)
t=1;
else if(strcmp(b,"二")==0)
t=2;
else if(strcmp(b,"三")==0)
t=3;
else if(strcmp(b,"四")==0)
t=4;
else if(strcmp(b,"五")==0)
t=5;
else if(strcmp(b,"六")==0)
t=6;
else if(strcmp(b,"七")==0)
t=7;
else if(strcmp(b,"八")==0)
t=8;
else if(strcmp(b,"九")==0)
t=9;
else if(strcmp(b,"十")==0)
t=10;
return t;
}
int f2(char d[])/*零到九十九汉字转数字*/
{
char a[100];
int l;
if(strlen(d)==2)
l=f1(d);
else if(strlen(d)==4)
{
a[0]=d[0];
a[1]=d[1];
a[2]='\0';
if(strcmp(a,"十")!=0)
{
l=f1(a)*10;
}
else
{
a[0]=d[2];
a[1]=d[3];
a[2]='\0';
{
l=f1(a)+10;
}
}
}
else
{
a[0]=d[0];
a[1]=d[1];
a[2]='\0';
{
l=f1(a)*10;
}
a[0]=d[4];
a[1]=d[5];
a[2]='\0';
{
l=l+f1(a);
}
}
return l;
}
void f3(int t)/*数字转汉字*/
{if(t==0)
printf("零");
if(t==1)
printf("一");
if(t==2)
printf("二");
if(t==3)
printf("三");
if(t==4)
printf("四");
if(t==5)
printf("五");
if(t==6)
printf("六");
if(t==7)
printf("七");
if(t==8)
printf("八");
if(t==9)
printf("九");
}
int main(int argc,char *argv[])
{
char a[20],b[5],c[5],d[5],e[5],f[5];
int t,t1,t2,n,i,l;
if(argc!=1)
{
freopen(argv[1],"r",stdin);
}
scanf("%s%s%s%s",e,a,f,b);
t=f2(b);
for(i=0;;i++)
{
scanf("%s",b);
if(strcmp(b,"看看")==0)
{
scanf("%s",c);
break;
}
else
{
scanf("%s",c);
if(strcmp(c,"增加")==0)
{
scanf("%s",d);
t=t+f2(d);
}
else
{
scanf("%s",d);
t=t-f2(d);
}
}
}
if(t/10==0)
f3(t);
else
{
t2=t%10;
t1=t/10;
if(t1==1)
{
printf("十");
f3(t2);
}
else if(t2==0)
{
f3(t1);
printf("十");
}
else
{
f3(t1);
printf("十");
f3(t2);
}
}
return 0;
}
至于编译脚本,对于我来说,我还得先解决一下上次作业中我编译C语言程序的时候无法找到stdio.h的情况,我重新检查了下我的环境变量配置,已经确定我的include与lib还有vc里的bin都有设置进去,我觉得可能是我当时下载vs2019的时候没有下载好,导致头文件丢失,所以我最后放弃了使用vs里边cl.exe这个编译器,我就想试试以前使用的Dev c++里面的编译器,我就照猫画虎,把Dev c++里面的include与lib还有bin设置进去,再进行编译,而这个编译器编译成功并不会显示任何东西,我以为编译失败了,退出后发现文件夹中居然出现了我要的可执行文件,这说明编译成功了。。。。然后我就用Windows的批处理写了一个编译的脚本,期初一直不知道怎么写,看了下同学们的作业,大概知道怎么回事,也写了一个
运行后可以生成exe文件
然后进行单元测试,我写了个测试脚本测试了f1跟f2那两个有返回值的函数,随便选取几个数进行测试
这是脚本内容
里面测试脚本.cpp内容
#include
#include
#include
int f1(char b[])/*个位数汉字转数字*/
{int t;
if(strcmp(b,"零")==0)
t=0;
else if(strcmp(b,"一")==0)
t=1;
else if(strcmp(b,"二")==0)
t=2;
else if(strcmp(b,"三")==0)
t=3;
else if(strcmp(b,"四")==0)
t=4;
else if(strcmp(b,"五")==0)
t=5;
else if(strcmp(b,"六")==0)
t=6;
else if(strcmp(b,"七")==0)
t=7;
else if(strcmp(b,"八")==0)
t=8;
else if(strcmp(b,"九")==0)
t=9;
else if(strcmp(b,"十")==0)
t=10;
return t;
}
int f2(char d[])/*零到九十九汉字转数字*/
{
char a[100];
int l;
if(strlen(d)==2)
l=f1(d);
else if(strlen(d)==4)
{
a[0]=d[0];
a[1]=d[1];
a[2]='\0';
if(strcmp(a,"十")!=0){
l=f1(a)*10;
}else
{
a[0]=d[2];
a[1]=d[3];
a[2]='\0';
{
l=f1(a)+10;
}
}
}
else
{a[0]=d[0];a[1]=d[1];a[2]='\0';
{l=f1(a)*10;
}
a[0]=d[4];a[1]=d[5];a[2]='\0';
{
l=l+f1(a);
}}
return l;
}
int main()
{
char b[10],a[10];
int i,n=10,c[10]={0,5,10,11,15,20,27,35,90,99};
freopen("C:\\Users\\86151\\Desktop\\编程作业\\test2.txt","r",stdin);
for(i=1;i
然后就是添加功能让这个程序可以读取TXT文档中的内容,参考了其他同学的作业,知道要学习freopen的用法,百度看,用法要么写的零零星星,要么太多专有名词根本看不懂,然后去找了其他同学的参考文献,总算知道怎么一回事了,
只要在main函数里加int argc,char *argv[]这两个变量就可以用freopen了,然后写了两个测试用的txt
然后用cmd进行测试