这个作业属于哪个课程 | 2020面向对象程序设计张栋班 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业2 |
这个作业的目标 | 一、新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。二、1、继续完成作业一的编程题 2、优化架构,一般要求每个函数长度不超过15行。3、优化规范,尤其是命名规范。4、制作一个编译脚本,运行该脚本可以编译你的代码。5、进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。6、在作业一编程题的基础上添加以下功能: 通过命令行读取一个文件,然后运行这个文件。 |
作业正文 | 实践题 编程题 |
其他参考文献 | GitHub guide GitHub Desktop的简易使用方法 C语言命名规则 Windows批处理(cmd/bat)常用命令教程 freopen()函数的使用 int main(int argc,char** argv) 详解 解读.gitignore文件 |
实践题
根据GitHub guide 中建立仓库的办法(链接讲解十分详细,我就是跟着它一步步来的,此处不赘述)
仓库建立好后,按GitHub Desktop的简易使用方法获得下载链接
打开应用程序,登录。发现之前创建好的仓库不见了。于是我慌张地到处找,最后了解到在(file>clone repository)
点击“clone”
之后将要传的文件,复制到文件夹即可
关于.gitignore文件,我查询了资料如:
gitignore 文件的作用:
就是git软件要忽略的文件列表,如果要忽略某些文件,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
还有
文件配置语法
但是学完以后自己还是搞不定。。。。
然后我发现
在repository>repository settings中写入文件名,好像也可以达到效果(大概?)
编程题的优化
对于编程题的优化有以下几个方面:
1、增加对关键词不止钱包的处理
2、尝试将能输入,输出的数的取值范围从零到十扩大到零到九十九。
3、运用函数分模块解决问题(设想有以下几种函数:将汉字转化为数字函 数,计算加法,减法函数,将数字转化为汉字函数)
4、解决多次输入“增加”的问题
5、优化程序使之能在输入错误时反应错误为何。
6、优化命名规范
对于问题一
不可以运用之前对于整句话输入的判断,即
if(strcmp(d,"整数 钱包 等于 零")==0)
而是要将第一句话分为四部分输入,即
scanf("%s",a);
if(strcmp(a,"整数")!=0){
printf("输入字符:%s 错误",a);
exit(0);
}
else{
scanf("%s %s %s",b,c,d);
if(strcmp(c,"等于")!=0){
printf("输入字符:%s 错误",c);
exit(0);}
}
sum=trans(d);
while(scanf("%s",b)!=EOF){
if(strcmp(b,"看看")!=0){
scanf("%s %s",e,f);
sum=sum+cal(e,f);
}
输入:整数 氧气 等于 三十九
氧气 减少 十九
看看 氧气
输出:二十
对于问题二
因为输入的数字从零到九十九。
先可将数字分为三类。
第一类:包含三个汉字的数(六十六,五十七)
第二类:只包含一个汉字的数(零,九, 十)
第三类: 包含两个汉字的数(十八,八十)
第三类再分为以“十”开头的与以“十”结尾的
想法1:建立一个二维数组,存放0-99的数字。但是太麻烦
想法2:建立一个数组存放零-十的汉字
将每一个汉字单独进行转化,相关代码如下:
char array[11][3]={"零","一","二","三","四","五","六","七","八","九","十"};
int trans(char n[]){
int i,a; char x[5],y[5];
if(strlen(n)==2){
for(i=0;i<=10;i++){
if(strcmp(n,array[i])==0)
return i;}}
else if(strlen(n)==4){
x[0]=n[0]; x[1]=n[1]; x[2]='\0';
y[0]=n[2]; y[1]=n[3]; y[2]='\0';
if(strcmp(x,array[10])==0) {
for(i=0;i<10;i++){
if(strcmp(y,array[i])==0)
return i+10;}
}
else{
for(i=0;i<=10;i++){
if(strcmp(x,array[i])==0)
return i*10;}}
}
else{x[0]=n[0]; x[1]=n[1]; x[2]='\0';
y[0]=n[4]; y[1]=n[5]; y[2]='\0';
for(i=0;i<10;i++){
if(strcmp(x,array[i])==0)
a=i;}
for(i=0;i<=10;i++){
if(strcmp(y,array[i])==0)
return a*10+i;
}
}}
又由于该函数中有重复部分,故编写新函数
int search(char x[]){
int i;
for(i=0;i<10;i++){
if(strcmp(x,array[i])==0)
return i;
}
if(i==10){
printf("输入数字错误");
exit(0);}
}
对于问题三
运用如下几个函数(函数间还有相互调用)
函数1——将汉字数字相互转化的函数(见上方)
函数2——将转化后的数字经行加减运算
int cal(char n[],char m[]){
int m1;
m1=trans(m);
if(strcmp(n,"增加")==0)
return m1;
else
return (-1)*m1;
}
函数3——将计算结果用汉字输出
void pri(int n){
int i;
if(n<=10) printf("%s",array[n]);
else if(n>10&&n<=19) printf("十%s",array[n%10]);
else if(n>=20&&n%10==0)printf("%s十",array[n/10]);
else printf("%s十%s",array[n/10],array[n%10]);
}
函数4——完成检索任务,辅助汉字数字相互转化函数(代码见上方)
对于问题四
运用以下语句:
while(scanf("%s",b)!=EOF)
if(strcmp(b,"看看")!=0) //当输入的字符不为“看看”时,之后即进行加减计算
对于问题五
目前能判断如下几处
1、在输入时进行一次判断
if(strcmp(a,"整数")!=0){
printf("输入字符:%s 错误",a);
exit(0); //不一致就直接结束程序,并提示哪里出错
}
if(strcmp(c,"等于")!=0){
printf("输入字符:%s 错误",c);
exit(0);
}
输入:帧数 氧气 等于 三十
输出:输入字符:帧数 错误
输入:整数 氧气 等 三十
输出:输入字符:等 错误
2、对输入的数字错误的判断
if(strcmp(z,"十")!=0){
printf("输入数字:%s 错误",z);
exit(0); }
if(sum<100&&sum>=0) pri(sum);
else if(sum>=100) printf("数字太大算不来");
else printf("欠债");}
完整代码:
#include
#include
#include
int CalculateNumber(char n[],char m[]);
int Transform(char n[]);
int Search(char x[]);
void PrintCharacter(int n);
char array[11][3]={"零","一","二","三","四","五","六","七","八","九","十"};
int main(){
int sum;
char a[50],b[50],c[50],d[50],e[50],f[50],g[50];
scanf("%s",a);
if(strcmp(a,"整数")!=0){
printf("输入字符:%s 错误",a);
exit(0);
}
else{
scanf("%s %s %s",b,c,d);
if(strcmp(c,"等于")!=0){
printf("输入字符:%s 错误",c);
exit(0);
}}
sum=Transform(d);
while(scanf("%s",b)!=EOF){
if(strcmp(b,"看看")!=0){
scanf("%s %s",e,f);
sum=sum+CalculateNumber(e,f);
// printf("%d",sum);
}
else{
scanf("%s",g);
if(sum<100&&sum>=0) PrintCharacter(sum);
else if(sum>=100) printf("数字太大算不来");
else printf("欠债");}
}
return 0;
}
void PrintCharacter(int n){
int i;
if(n<=10) printf("%s",array[n]);
else if(n>10&&n<=19) printf("十%s",array[n%10]);
else if(n>=20&&n%10==0) printf("%s十",array[n/10]);
else printf("%s十%s",array[n/10],array[n%10]);
}
int CalculateNumber(char n[],char m[]){
int m1;
m1=Transform(m);
if(strcmp(n,"增加")==0)
return m1;
else
return (-1)*m1;
}
int Transform(char n[]){
int i,a; char x[5],y[5],z[5];
x[0]=n[0]; x[1]=n[1]; x[2]='\0';
y[0]=n[4]; y[1]=n[5]; y[2]='\0';
z[0]=n[2]; z[1]=n[3]; z[2]='\0';
if(strlen(n)==2) return Search(n);
else if(strlen(n)==4){
if(strcmp(x,array[10])==0) return Search(z)+10;
else if(strcmp(z,array[10])==0) return Search(x)*10;
else {
printf("输入数字:%s 错误",n);
exit(0);
}}
else if(strlen(n)==6){
if(strcmp(z,"十")!=0||strcmp(x,"十")==0||strcmp(y,"十")==0){
printf("输入数字:%s 错误",n);
exit(0);}
return Search(x)*10+Search(y);}
else {
printf("输入数字:%s 错误",n);
exit(0);
}}
int Search(char x[]){
int i;
for(i=0;i<=10;i++){
if(strcmp(x,array[i])==0)
return i;
}
if(i==11){
printf("输入数字错误");
exit(0);}
}
制作编译脚本
配置好环境变量(环境变量在控制面板>系统和安全>系统>高级系统设置>环境变量)
在桌面新建文本文档,粘贴代码:
@echo off
echo 请输入文件所在磁盘
set /p a=
echo 正在转移到该磁盘
cd "%a%"
echo 请输入文件所在路径
set /p b=
echo 转移到文件路径
cd "%b%"
echo 请输入文件名
set /p c=
echo 编译开始
gcc "%c%" -o 作业二改版.exe
if exist "作业二改版.exe" echo 编译成功
if not exist "作业二改版.exe" echo 编译失败
Pause
将文本文档后缀改为.bat或.cmd
打开文件
依次输入:
C:
C:\Users\luckykk\Desktop
作业二改版.cpp
即可编译成功。
遇见的问题
1、出现中文乱码,如图
查询资料发现保存文本文档时要修改编码为UTF-8。但是我一开始就是保存为UTF-8!
于是我尝试反向操作把编码改为ANSI,居然就可以了!
2、报错:no such file or directory
开始以为不可以把文件存在d盘,经过多次尝试后发现是查找只能在同一个盘中进行(应该)
所以文件可以存在d盘如图:
3、执行完操作后,窗口直接关闭,手速不够,根本来不及截图啊!
解决方法:在代码最后加入“pause”
制作测试脚本
在文本文档中输入代码:
@echo off
cd c:
echo 开始测试
作业二测试.exe
echo 测试结束
Pause
本次测试在函数中比较重要的将正确的汉字转化为数字的函数。
代码如下:
#include
#include
int search(char x[]);
char array[11][3]={"零","一","二","三","四","五","六","七","八","九","十"};
int main(){
char n[50]; int i,a;
for(a=0;a<10;a++){
scanf("%s",n);
char x[5],y[5],z[5];
x[0]=n[0]; x[1]=n[1]; x[2]='\0';
y[0]=n[4]; y[1]=n[5]; y[2]='\0';
z[0]=n[2]; z[1]=n[3]; z[2]='\0';
if(strlen(n)==2) printf("%d 通过\n",search(n));
else if(strlen(n)==4){
if(strcmp(x,array[10])==0) printf("%d 通过\n",search(z)+10);
else if(strcmp(z,array[10])==0) printf("%d 通过\n",search(x)*10);
else {
printf("输入数字:%s 错误\n",n);
continue;
}}
else if(strlen(n)==6){
if(strcmp(z,"十")!=0||strcmp(x,"十")==0||strcmp(y,"十")==0){
printf("输入数字:%s 错误\n",n);
continue;
}
printf("%d 通过\n",search(x)*10+search(y));}
else {
printf("输入数字:%s 错误\n",n);
continue; }
}}
int search(char x[]){
int i;
for(i=0;i<=10;i++){
if(strcmp(x,array[i])==0)
return i;
}
if(i==11)
printf("输入数字错误\n");
}
测试输入:
六
十六
六十
六十六
六十十
十六六
十十六
一百
零
零七
测试输出:
6 通过
16 通过
60 通过
66 通过
输入数字:六十十 错误
输入数字:十六六 错误
输入数字:十十六 错误
输入数字:一百 错误
0 通过
输入数字:零七 错误
运用命令行读取运行文件
一开始毫无头绪,问了同学才知道需要用到freopen
然后我就在main函数中加了一句freopen(gets(h),"r",stdin);
喜滋滋开始运行,得到结果如下:
后来发现好像有点不对,我输入的是“作业二改版.exe”和“test.txt”,而依题意应该输入“作业二改版 test.txt”,但是这样输入又没有输出。
于是,我就翻开了大佬们的作业
发现了int main( int argc , char *argv[] , char *envp[] )
这样的东西,于是我又跑去百度。查过的资料见上方参考资料。
但是自己还是能力有限,看的不是很懂,也没有写出来,哭。