这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2020OOP |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10231 |
这个作业的目标 | <1、优化代码,规范命名;2、学会使用github以及github desktop,能够管理github;3、学会运用一种脚本语言,能够编译和测试;> |
作业正文 | https://www.cnblogs.com/xiao-qingjiang/p/12254936.html |
其他参考文献 | https://www.bilibili.com/video/av32990445?t=586 |
-- | 百度百科 |
-- | https://www.cnblogs.com/xyyt/p/9234063.html |
-- | 批处理(.bat脚本)基本命令语法 |
-- | 【黑客基础】Windows/Powershell脚本学习 |
第二次作业
继续完成编程题
新建一个github仓库,并把作业推送到该仓库。
发布博客
实践题
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
该任务参考了(https://www.bilibili.com/video/av32990445?t=586)
在GitHub中建立新仓库
同步新仓库到github desktop
github desktop克隆新仓库
将存放作业的文件夹放入github desktop
github desktop变为
将GitHub desktop中新变化同步到github
GitHub变为
编程题(请使用C语言或者C++完成以下题目):
继续完成作业一的编程题。
优化架构,一般要求每个函数长度不超过15行。
优化规范,尤其是命名规范。
制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
有关优化,本次结合函数使用骆驼式命名法(小驼峰法),变量使用帕斯卡命名法(大驼峰法)
命名规范参考了百度百科
脚本,脚本语言的学习参考了批处理(.bat脚本)基本命令语法,【黑客基础】Windows/Powershell脚本学习
编译脚本
运行示例
测试
#include<stdio.h> #include<string.h> int main(){ char a[10]; gets(a); int convertInto(char d[]){ if(strcmp(d,"零")==0)return 0; else if(strcmp(d,"一")==0)return 1; else if(strcmp(d,"二")==0)return 2; else if(strcmp(d,"三")==0)return 3; else if(strcmp(d,"四")==0)return 4; else if(strcmp(d,"五")==0)return 5; else if(strcmp(d,"六")==0)return 6; else if(strcmp(d,"七")==0)return 7; else if(strcmp(d,"八")==0)return 8; else if(strcmp(d,"九")==0)return 9; else if(strcmp(d,"十")==0)return 10; else return -1; } int c=convertInto(a); if (c!=-1) printf("测试正确\n"); else printf("error"); return 0; }
在作业一编程题的基础上添加以下功能:
通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
假设我的1.txt内容如下:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输入lang 1.txt后,命令行输出一。
根据题目要求,要做到
通过命令行读取一个文件,然后运行这个文件。
为此加了freopen()在代码中,实现导入函数;
char file[100]; printf("请输入文件地址\n"); scanf("%s",file); freopen(file,"r",stdin);
运行示例
编程题要求:
读题,提取出题目的要求。
分解需求,把需求分解为几个你觉得不太相关的模块。
思考每个模块怎么写,可以从简单的模块开始写。
对于不会的问题进行查阅资料。
对于每一个模块设计测试用例。
详细记录下以上每一步,并写在博客中。
不要求完全做出来,但要求记录详细。
建议博客长度不少于1000字(不包含代码)。
1.我在作业一中代码汉字的编码是通过汉字字符串先找出对应每个汉字所对应的ASCII码再带入转化,再我看了其他同学的做法后觉得我的代码比较不方便,因此这次作业参考其他同学的方法重新写了一份,并将代码解释以注释形式写出;
2.第一个模块
要解决的第一个问题便是要解决汉字到数字的转化,因为我们一开始要以汉字形式输入钱数,而如果要进行计算,就要转化成数字形式;
于是我声明了一个新函数convertInto()用于实现汉字到数字的转化;
其中核心便是通过<string.h>头文件中strcmp()进行对输入汉字与数字所对应汉字的比较,如果strcmp(输入汉字,“数字对应的数字”==0),则可找出输入汉字对应的数值,然后再return回数字;
以下是定义convertInto()的具体内容;
int convertInto(char d[]);//声明新函数,通过新函数将汉字形式转化为数字;
//补充函数定义; //通过strcmp()判断字符串之间的关系,找出输入汉字对应的数值;返回到数字形式; int convertInto(char d[]){ if(strcmp(d,"零")==0)return 0; else if(strcmp(d,"一")==0)return 1; else if(strcmp(d,"二")==0)return 2; else if(strcmp(d,"三")==0)return 3; else if(strcmp(d,"四")==0)return 4; else if(strcmp(d,"五")==0)return 5; else if(strcmp(d,"六")==0)return 6; else if(strcmp(d,"七")==0)return 7; else if(strcmp(d,"八")==0)return 8; else if(strcmp(d,"九")==0)return 9; else if(strcmp(d,"十")==0)return 10; }
3.第二个模块
我觉得要解决的第二个问题是解决输入样式(即各个汉字字符串的输入问题)
于是设置了多个char型数组用于储存输入的汉字;
char KanKan[10],Qian[10],Symbol[10];//KanKan[10]指 看看;Qian[10]指 钱数对应的汉字(为字符串) ;Symbol[10]用于判断增加或减少; char a[10],b[10],c[10],d[10];// a[10],b[10],c[10],d[10]分别指 整数 钱包 等于 输入的数字;
4.第三个模块
要根据输入的汉字判断下一步所要进行的操作,其中我以“看看”二字作为条件,“看看”后在输入汉字字符串则通过break跳出循环
int sum; scanf("%s%s%s%s",a,b,c,d);//输入 整数 钱包 等于 数字 sum=convertInto(d); while(!0){ //一直循环,直到输入“看看” “钱包”后通过break跳出循环; scanf("%s",KanKan); if(strcmp(KanKan,"看看")!=0){ //若输入不是“看看”,则计算还未结束; scanf("%s%s",Symbol,Qian);//判断增加或减少,以及钱的数值(汉字形式); if(strcmp(Symbol,"增加")==0)//symbol为“增加”; sum+=convertInto(Qian); else //symbol为“减少”; sum-=convertInto(Qian); } else{ scanf("%s",b);//输入为“看看”后输入“钱包”; break; } }
5.第四个模块
由于执行后的计算结果sum为数字形式,而要求输出的是汉字字符串形式,于是还需要将数字形式转化为汉字形式;
我将sum的数值分三种情况讨论
当0<sum<9,直接转化为对应的汉字;
当10<sum<19,即十位数为1,输出“十”,再通过sum%10求各位数,返回并输出对应的汉字;
当20<sum<99,输出十位数,再输出“十”,再输出个位数;
if(sum<=10) switch(sum){ 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("十");break; } else{ switch(sum/10){ //输出十位数; case 1: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; } printf("十"); if(sum%10!=0){ //输出个位数; switch(sum%10){ 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; } } }
6.第五个模块
根据题目要求,要做到
通过命令行读取一个文件,然后运行这个文件。
为此加了freopen()在代码中,实现导入函数;
char File[100]; printf("请输入文件地址\n"); scanf("%s",File); freopen(File,"r",stdin);//通过输入文件名调用,如果输入,则以下无需再输入汉字,回车可得答案
完整代码贴在GitHub了
这次作业做了很久,查了很多资料,并参考了其他同学的想法,很感谢几位大佬的指点,不然可能都做不完╯﹏╰,不过真的收获很多\ (•◡•) /。
在完成了以上作业后,写一篇博客体现你完成作业的过程和内容,推荐包括以下内容:
问答题的答案,和思考过程。
实践题的截图(禁止拍屏),和遇到的问题。
编程题的主要实现过程、思考过程和遇到的问题。
你查阅的资料的网址。
为了方便其他学校的老师或者助教了解课程实况,请大家在作业开头添加抬头,与上次作业格式一致
来源:https://www.cnblogs.com/xiao-qingjiang/p/12254936.html