这个作业属于哪个课程 | 2020面对对象程序设计 |
---|---|
这个作业要求在哪里 | 面对对象程序设计寒假作业2 |
这个作业的目标 | 1.实践题 新建一个github仓库,使用git或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。 请使用.gitignore文件忽略不要上传的文件。 2.编程题(请使用C语言或者C++完成以下题目): (1)继续完成作业一的编程题。 (2)优化架构,一般要求每个函数长度不超过15行。 (3)优化规范,尤其是命名规范。 (4)制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。 (5)进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。 (6)添加以下功能: 通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。 |
其他参考文献 | Windows批处理(cmd/bat)常用命令教程 freopen函数 |
由于作业要求“把接下去的编程题的代码及测试脚本传到这个仓库”,所以我打算先来完成编程题
编程题
编程题(请使用C语言或者C++完成以下题目):
继续完成作业一的编程题。
优化架构,一般要求每个函数长度不超过15行。
优化规范,尤其是命名规范。
制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
示例脚本:
gcc 1.cpp -o lang.exe
进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
示例脚本:
gcc 1.cpp test.cpp -o test.exe test
在作业一编程题的基础上添加以下功能:
通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
假设我的1.txt内容如下:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输入lang 1.txt后,命令行输出一。
第一部分:代码优化
由于原代码过于冗长,宁且函数的命名十分土气,所以在这次的优化中,我尽量的减少了没用代码,并且规范的命名函数,优化结果如下
0.最开始的开始,我定义了一个全局的字符数组,便于后面的一系列操作
char han[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
1.第一个我打算先编写一个个位数的转化函数,这样便于后面两位数转化的复杂情况
int transform1(char *c){
int i;
if(strlen(c)==2)
{
for(i=0;;i++){
if(strcmp(han[i],c)==0)break;
}
return i;
}
}
2.接下来就是真正的转化部分了
int transform(char *c){
int re;
char ch[2];
if(strlen(c)==2)
re=transform1(c);
else if(strlen(c)==4)
{
ch[0]=c[0];ch[1]=c[1];
if(strcmp(ch,"十")==0)re=10+transform1(c+2);
else re=10*transform1(ch);
}
else if(strlen(c)==6)
{
ch[0]=c[0];ch[1]=c[1];
re=10*transform1(ch)+transform1(c+4);
}
return re;
}
3.由于最终的输出结果是以汉字形式输出的,所以理所应当需要有一个输出的函数能将数字转化为汉字输出
void print(int num){
if(num<=10)printf("%s",han[num]);
else if(num<=19)printf("十%s",han[num%10]);
else if(num%10==0)printf("%s十",han[num/10]);
else printf("%s十%s",han[num/10],han[num%10]);
}
4.最后来看一下主函数
int main(){
int a,i;
char bian[20],cc[10],number[10];
scanf("%s",cc);
if(strcmp(cc,"整数")==0){
int num;
scanf("%s",bian);
for(i=0;i<2;i++)scanf("%s",cc);
num=transform(cc);
scanf("%s",cc);
while(strcmp(cc,"看看")!=0){
if(strcmp(cc,bian)==0){
scanf("%s %s",cc,number);
if(strcmp(cc,"增加")==0)num+=transform(number);
if(strcmp(cc,"减少")==0)num-=transform(number);
scanf("%s",cc);
continue;
}
if(strcmp(cc,bian)!=0){
scanf("%s %s",cc,number);
scanf("%s",cc);
}
}
scanf("%s",cc);
while(strcmp(cc,bian)!=0){
printf("未定义该物品");
for(i=0;i<2;i++)scanf("%s",cc);
}
if(strcmp(cc,bian)==0)
print(num);
}
}
return 0;
}
最后进行各个部分的合体将其形成整体
#include
#include
int transform1(char* c);
int transform(char* c);
void print(int num);
char han[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int main(){
int a,i;
char bian[20],cc[10],number[10];
scanf("%s",cc);
if(strcmp(cc,"整数")==0){
int num;
scanf("%s",bian);
for(i=0;i<2;i++)scanf("%s",cc);
num=transform(cc);
scanf("%s",cc);
while(strcmp(cc,"看看")!=0){
if(strcmp(cc,bian)==0){
scanf("%s %s",cc,number);
if(strcmp(cc,"增加")==0)num+=transform(number);
if(strcmp(cc,"减少")==0)num-=transform(number);
scanf("%s",cc);
continue;
}
if(strcmp(cc,bian)!=0){
scanf("%s %s",cc,number);
scanf("%s",cc);
}
}
scanf("%s",cc);
while(strcmp(cc,bian)!=0){
printf("未定义该物品");
for(i=0;i<2;i++)scanf("%s",cc);
}
if(strcmp(cc,bian)==0)
print(num);
}
}
return 0;
}
int transform1(char *c){
int i;
if(strlen(c)==2)
{
for(i=0;;i++){
if(strcmp(han[i],c)==0)break;
}
return i;
}
}
int transform(char *c){
int re;
char ch[2];
if(strlen(c)==2)
re=transform1(c);
else if(strlen(c)==4)
{
ch[0]=c[0];ch[1]=c[1];
if(strcmp(ch,"十")==0)re=10+transform1(c+2);
else re=10*transform1(ch);
}
else if(strlen(c)==6)
{
ch[0]=c[0];ch[1]=c[1];
re=10*transform1(ch)+transform1(c+4);
}
return re;
}
void print(int num){
if(num<=10)printf("%s",han[num]);
else if(num<=19)printf("十%s",han[num%10]);
else if(num%10==0)printf("%s十",han[num/10]);
else printf("%s十%s",han[num/10],han[num%10]);
}
第二部分 功能扩展
1.制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
首先新建一个文本文档,输入代码,然后保存之后改变文件扩展名为.bat,便生成了编译脚本,然后输入需要编译的文件的位置,即可编译成功。
2.进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
我认为该程序的一个重点在于将结果正确的转化,所以在这里我主要测试了transform函数。
我的测试思路是这样子的,首先开一个字符串数组cc[15][10]用来存放输入进去的汉字,开一个整数数组a[15],存放本应当得到的正确答案,当然其中设置了几个是与原数组不对应的答案。
代码如下:
#include
#include
char han[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int transform1(char *c){
int i;
if(strlen(c)==2)
{
for(i=0;;i++){
if(strcmp(han[i],c)==0)break;
}
return i;
}
}
int transform(char *c){
int re;
char ch[2];
if(strlen(c)==2)
re=transform1(c);
else if(strlen(c)==4)
{
ch[0]=c[0];ch[1]=c[1];
if(strcmp(ch,"十")==0)re=10+transform1(c+2);
else re=10*transform1(ch);
}
else if(strlen(c)==6)
{
ch[0]=c[0];ch[1]=c[1];
re=10*transform1(ch)+transform1(c+4);
}
return re;
}
int main(){
int a[15]={5,16,15,14,55,2,77,98,75,45,21,52,73,59,87},i,j;
char cc[15][10]={"五","十六","五十二","十四","五十五","二","八十五","九十八","七十五","四十五","二十一","五十二","五十三","五十九","八十七"};
for(i=0;i<15;i++){
printf("%6s %4d ",cc[i],a[i]);
if(transform(cc[i])==a[i])printf("pass\n");
else printf("error\n");
}
getchar();getchar();
return 0;
}
然后来看一下测试脚本以及测试结果吧
不难看出,得到的测试结果是正确的。
3.作业一编程题的基础上添加以下功能:通过命令行读取一个文件,然后运行这个文件
分析题目的话,要求就是直接传入包含输入信息的文件,再执行后续操作咯;
查了一下,应该使用freopen函数完成该结果,所以通过查询相关资料,完成了该任务
在这里展示一下使用freopen的主函数
int main(){
int a,i;
char bian[20],cc[10],number[10];
freopen("D:\\homework2\\input.txt","r" , stdin);
scanf("%s",cc);
if(strcmp(cc,"整数")==0){
int num;
scanf("%s",bian);
for(i=0;i<2;i++)scanf("%s",cc);
num=transform(cc);
scanf("%s",cc);
while(strcmp(cc,"看看")!=0){
if(strcmp(cc,bian)==0){
scanf("%s %s",cc,number);
if(strcmp(cc,"增加")==0)num+=transform(number);
if(strcmp(cc,"减少")==0)num-=transform(number);
scanf("%s",cc);
continue;
}
if(strcmp(cc,bian)!=0){
scanf("%s %s",cc,number); /*照样需要输入两次的字符串*/
scanf("%s",cc);
}
}
scanf("%s",cc);
while(strcmp(cc,bian)!=0){
printf("未定义该物品");
for(i=0;i<2;i++)scanf("%s",cc);
}
if(strcmp(cc,bian)==0) /*判断查看的是否是同一变量,如果是才进行输出*/{
print(num);
} /*同样是将最后的结果按照4种不同的情况进行分类输出*/
}
getchar();getchar();
return 0;
}
然后同样通过测试脚本的方法来看一下运行结果:
到这里,编程题应该就大功告成了,接下来来完成实践题!
实践题
1.新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
(1)从群文件中下载安装github desktop,并且登录
(2)点在右上角file,点击new repository,填入信息建立新仓库
(3)进入仓库所在文件夹,按照作业要求将相关作业文件复制到该文件夹,再上传到仓库
点击commit to master,就可以成功上传了,然后点击下图的push orgin,就可以在浏览器中看到上传的文件了
到此本次作业就结束了,接下来做个总结反思
总结
1.这次作业比上次作业涉及了更多的未学知识,换就话说就是触及了我的知识盲区,为了完成这次作业,或被动地或主动的去查询了相关的资料和知识,最终将我从放弃本次作业的边缘拉了回来,现在回想,如果我一开始,就主动的学习和查询的话,应该就不会体验这么多负面情绪,也可以得到更多收获了。
2.这次作业除了查询以外,有一部分还参考了别人的作业,并且询问了同学,所以在此一感受到了交流讨论的重要性,果然一味自己干还是难成功的,害。