2020面对对象程序设计寒假作业2

这个作业属于哪个课程 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<stdio.h>
#include<string.h>
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],存放本应当得到的正确答案,当然其中设置了几个是与原数组不对应的答案。
代码如下:

扫描二维码关注公众号,回复: 8977968 查看本文章
#include<stdio.h>
#include<string.h>
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.这次作业除了查询以外,有一部分还参考了别人的作业,并且询问了同学,所以在此一感受到了交流讨论的重要性,果然一味自己干还是难成功的,害。

猜你喜欢

转载自www.cnblogs.com/monkd/p/12264553.html
今日推荐