这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2020OOP |
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10231 |
这个作业的目标 | 1.建立GitHub仓库并上传文件 2.继续完成编程题并制作脚本
|
作业正文 | 1.实践题 2.编程题 |
参考文献 | https://jingyan.baidu.com/article/64d05a021b96aade55f73b2e.html https://www.cnblogs.com/dawnminghuang/p/4401669.html https://blog.csdn.net/u014470361/article/details/87209079 https://blog.csdn.net/zanfeng/article/details/81144059 https://jingyan.baidu.com/article/37bce2bea1457d1002f3a2af.html https://blog.csdn.net/yang889999888/article/details/72934787 |
一、实践题
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
(1)创建一个仓库
(2)使用gitignore文件忽略不要上传的文件
从网上了解到需要创建一个.gitignore文件,但是不确定具体要忽略什么,选了zip。步骤是:在homework的文件夹中创建文本,然后输入要忽略的内容,然后重命名将后缀改为.gitignore。
(3)上传文件
然后填写summary并点击push origin即可上传,本次作业的代码及脚本均已上传。
二、编程题
1.完善编程题
2.优化架构
3.优化规范:(参考资料:http://m.biancheng.net/view/158.html)
(1)空行:在定义变量、函数定义结束,即两个相对独立的程序块、变量说明后空行。
(2)空格:关键字之后、“,”之后,及一些运算符(如赋值运算符、关系运算符、算术运算符、逻辑运算符、位运算符)前后应加空格;
函数名之后、“(”、“)”、“,”、“;”之前,及单目运算符前后不应加空格。
(3)缩进:一段代码的内部代码需要缩进,通过Tab键实现。
(4)对齐:括号要分别占一行并对齐。
(5)代码行:一行代码只做一件事。
(6)注释:对重要的代码行或段落进行提示。
主函数(主要是初始变量的定义及赋初始值):
int main() { for (i=0; ; i++)//输入变量及其初始值 { scanf("%s",a); if(strcmp(a,"整数")) { printf("输入有误,请重新输入\n"); continue; } else { scanf("%s%s",b,c); if(strcmp(c,"等于")) { printf("输入有误,请重新输入\n"); continue; } else { scanf("%s",d); sum=tran(d); if(flag==1) continue; else break; } } } for (j=1; flag2; j++) //输入运算过程及结束 { for (i=1; ; i++) { scanf("%s%s",e,f); if (strcmp(e,b) == 0) { scanf("%s",g); k = tran(g); if (flag ==1) continue; if (strcmp(f,"增加")==0) sum += k; else if (strcmp(f,"减少")==0) { if (sum < k) printf("%s不能为负值,请重新输入\n",b); else sum -= k; } else { printf("输入有误,请重新输入1\n"); continue; } } else if (strcmp(e,"看看")==0 && strcmp(f,b)==0) { flag2=0; break; } else { printf("输入有误,请重新输入2\n"); continue; } } } put(sum); return 0; }
将中文转换为阿拉伯数字的函数:
int tran(char s[20]) { int num=0; flag=0; if(strcmp(s,"零")==0) num=0; else if(strcmp(s,"一")==0) num=1; else if(strcmp(s,"二")==0) num=2; else if(strcmp(s,"三")==0) num=3; else if(strcmp(s,"四")==0) num=4; else if(strcmp(s,"五")==0) num=5; else if(strcmp(s,"六")==0) num=6; else if(strcmp(s,"七")==0) num=7; else if(strcmp(s,"八")==0) num=8; else if(strcmp(s,"九")==0) num=9; else if(strcmp(s,"十")==0) num=10; else { flag=1; printf("输入有误,请重新输入\n"); } return num; }
输出函数:(其中包含两位数、三位数的情况):
void put(int w) { int p,q; p=w/100; q=w%10; if(w<=10) //个位数 tran2(w); else if(w>10&&w<20) //小于20的十位数 { printf("十"); tran2(w%10); } else if(w>=20&&w<100)//大于20的十位数 { tran2(w/10); printf("十"); if(w%10!=0) tran2(w%10); } else if(w>=100)//百位数 { tran2(w/100); printf("百"); if(w%100>0) { if(w%100>=10&&w%100<=20) printf("一"); else if(w%100<10&&w%100>0) printf("零"); put(w%100); } } }
将数字转换为中文的函数:
void tran2(int m) { switch (m) { case 0: printf("零");break; 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; case 10: printf("十"); } }
完整代码如下:
#include#include<string.h> char a[20],b[20],c[20],d[20],e[20],f[20],g[20],h[20]; int sum=0, flag=1, flag2=1, i, j, k; int tran(char s[20]);//中文转换为数字 void put(int w);//输出 void tran2(int m);//数字转换为中文 int main() { for (i=0; ; i++)//输入变量及其初始值 { scanf("%s",a); if(strcmp(a,"整数")) { printf("输入有误,请重新输入\n"); continue; } else { scanf("%s%s",b,c); if(strcmp(c,"等于")) { printf("输入有误,请重新输入\n"); continue; } else { scanf("%s",d); sum=tran(d); if(flag==1) continue; else break; } } } for (j=1; flag2; j++) //输入运算过程及结束 { for (i=1; ; i++) { scanf("%s%s",e,f); if (strcmp(e,b) == 0) { scanf("%s",g); k = tran(g); if (flag ==1) continue; if (strcmp(f,"增加")==0) sum += k; else if (strcmp(f,"减少")==0) { if (sum < k) printf("%s不能为负值,请重新输入\n",b); else sum -= k; } else { printf("输入有误,请重新输入1\n"); continue; } } else if (strcmp(e,"看看")==0 && strcmp(f,b)==0) { flag2=0; break; } else { printf("输入有误,请重新输入2\n"); continue; } } } put(sum); return 0; } int tran(char s[20]) { int num=0; flag=0; if(strcmp(s,"零")==0) num=0; else if(strcmp(s,"一")==0) num=1; else if(strcmp(s,"二")==0) num=2; else if(strcmp(s,"三")==0) num=3; else if(strcmp(s,"四")==0) num=4; else if(strcmp(s,"五")==0) num=5; else if(strcmp(s,"六")==0) num=6; else if(strcmp(s,"七")==0) num=7; else if(strcmp(s,"八")==0) num=8; else if(strcmp(s,"九")==0) num=9; else if(strcmp(s,"十")==0) num=10; else { flag=1; printf("输入有误,请重新输入\n"); } return num; } void put(int w) { int p,q; p=w/100; q=w%10; if(w<=10) //个位数 tran2(w); else if(w>10&&w<20) //小于20的十位数 { printf("十"); tran2(w%10); } else if(w>=20&&w<100)//大于20的十位数 { tran2(w/10); printf("十"); if(w%10!=0) tran2(w%10); } else if(w>=100)//百位数 { tran2(w/100); printf("百"); if(w%100>0) { if(w%100>=10&&w%100<=20) printf("一"); else if(w%100<10&&w%100>0) printf("零"); put(w%100); } } } void tran2(int m) { switch (m) { case 0: printf("零");break; 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; case 10: printf("十"); } }
4.制作编译脚本
一开始我没有看懂这是什么意思,觉得可能是要做一个能编译脚本, 然后在网上搜索之后发现好像是要能够生成exe文件就行了,并且查阅了资料。在初步学习了一些Windows批处理之后,我尝试写出的语句如下,其中保存的时候要将编码由 UTF-8 改为ANSI,不然会出现中文乱码:
随后将记事本的后缀改为.bat,并运行,结果却是“ 'gcc' 不是内部或外部命令,也不是可运行的程序或批处理文件。”于是我继续上网搜索,发现是要将gcc所在的位置加在前面,于是我修改了一下:
然后再运行,结果如下:
5.单元测试
首先,制作一个测试脚本,通过它可以进行测试:
(*)主函数:因为主函数主要负责输入及判断语法及运算,所以可以通过整体的运行来判断,因此我觉得不需要测试。
(1)将中文转为阿拉伯数字的函数:
测试代码如下:
#include#include<string.h> int flag=1; int main() { int i,num; int tran(char s[20]); char a[11][4]; strcpy(a[0],"零"); strcpy(a[1],"一"); strcpy(a[2],"二"); strcpy(a[3],"三"); strcpy(a[4],"四"); strcpy(a[5],"五"); strcpy(a[6],"六"); strcpy(a[7],"七"); strcpy(a[8],"八"); strcpy(a[9],"九"); strcpy(a[10],"十"); strcpy(a[11],"十一"); for (i=0;i<=11;i++) { num=tran(a[i]); if(flag==0) printf("%d ",num); } } int tran(char s[20]) { int num=0; flag=0; if(strcmp(s,"零")==0) num=0; else if(strcmp(s,"一")==0) num=1; else if(strcmp(s,"二")==0) num=2; else if(strcmp(s,"三")==0) num=3; else if(strcmp(s,"四")==0) num=4; else if(strcmp(s,"五")==0) num=5; else if(strcmp(s,"六")==0) num=6; else if(strcmp(s,"七")==0) num=7; else if(strcmp(s,"八")==0) num=8; else if(strcmp(s,"九")==0) num=9; else if(strcmp(s,"十")==0) num=10; else { flag=1; printf("输入有误,请重新输入\n"); } return num; }
用测试脚本测试结果如下:
(2)输出函数,能够输出一位数、两位数和三位数(将阿拉伯数字转换为中文的函数也可以通过这个代码测试出来):
测试代码如下:(其中包含整十、整百、一百零几、十几的情况)
#includeint main() { void put(int w); printf("7 ");put(7);printf("\n"); printf("10 ");put(10);printf("\n"); printf("16 ");put(16);printf("\n"); printf("66 ");put(66);printf("\n"); printf("90 ");put(90);printf("\n"); printf("300 ");put(300);printf("\n"); printf("517 ");put(517);printf("\n"); printf("730 ");put(730);printf("\n"); printf("999 ");put(999);printf("\n"); } void put(int w) { void tran2(int m); int p,q; p=w/100; q=w%10; if(w<=10) //个位数 tran2(w); else if(w>10&&w<20) //小于20的十位数 { printf("十"); tran2(w%10); } else if(w>=20&&w<100)//大于20的十位数 { tran2(w/10); printf("十"); if(w%10!=0) tran2(w%10); } else if(w>=100)//百位数 { tran2(w/100); printf("百"); if(w%100>0) { if(w%100>=10&&w%100<=20) printf("一"); else if(w%100<10&&w%100>0) printf("零"); put(w%100); } } } void tran2(int m) { switch (m) { case 0: printf("零");break; 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; case 10: printf("十"); } }
用测试脚本测试结果如下:
6.添加一些功能
我对于题目的理解是要实现在命令行中输入文件名,并实现将文件的内容作为输入的部分并且执行。
我在C语言的书本当中找到了这一部分的知识内容,并且在网上也搜索了相关的内容。在main函数中添加了freopen函数。
scanf("%s",h); freopen(h,"r",stdin);
要输入的文本内容如下:
用于运行的脚本内容如下:
运行之后的结果如下:
总结:
在本次作业中,我学习到了很多,了解了关于脚本的许多知识。在学习过程中,刚开始觉得很迷茫,不知道脚本是什么,也不知道从哪里开始,也查了很多资料,从一点都不会变成知道了一点点。然后也学着网上的资料给出的示例,自己尝试模仿着写了一下,一开始一直出错而且找不到原因,但慢慢地就开始知道出现什么样的结果是什么原因(例如“ 找不到路径 ” 等),最后发现这样的学习方式好像会让自己的印象更深刻一些,也能够开始知道要怎么样自己找资料、找解决方法,虽然也逐步发现自己经过一个学期的学习对于这个专业还是基本什么都不知道。