第二次作业

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

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 寒假作业二
作业正文 寒假作业二
这个作业的目标 1. 脚本的制作 2.Windows批处理的了解 3.freopen函数的运用 4.有了编写测试代码的概念 5.GitHub仓库的使用
其他参考文献 freopen函数用法 gitignore文件 Windows的批处理脚本

实践题

新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。

使用.gitignore文件忽略不要上传的文件

  • 下载GitHub Desktop,输入自己的GitHub账号登陆
  • 选择右上角file,填写相关信息后建立新的仓库
    第二次作业_第1张图片

  • 找到仓库所在的文件夹,将代码等复制进去即可上传到仓库
    第二次作业_第2张图片

  • 代码已经上传
    第二次作业_第3张图片

  • 下载git,在根目录下选择git bash 打开命令行,输入vim .gitignore 建立.gitignore文件
  • 输入i 开始编辑 输入:wq结束并保存,结果如图
    第二次作业_第4张图片
    第二次作业_第5张图片
    第二次作业_第6张图片
    第二次作业_第7张图片

    遇到的问题

  • GitHub的全英文让我阅读起来有些费力,好好学英语,好好学英语。。。
  • 设置.gitignore时有很多不懂的地方,有很多命令还是不太明白,后续会继续学习一下这方面知识。

编程题

优化架构,一般要求每个函数长度不超过15行

  • 将运算过程从原本的主函数分离出来,修改了一下一些过程使代码更简洁一些

    主函数

int main()
{
    char var[10],name[100],op[100],num[10];     //变量类型,变量名,运算// 
    scanf("%s %s %s %s",var,name,op,num);  
    int sum;
    sum=exchange(num);//初始化// 
    operation(name,op,num,sum);
    return 0; 
}

运算过程

void operation(char name[],char op[],char num[],int sum){     //运算// 
    int a;
    
    while((scanf("%s",name))!=EOF) {
        if(strcmp(name,"看看")!=0){
            scanf("%s %s",op,num);
            a=exchange(num);
            if(strcmp(op,"增加")==0)
            sum+=a; 
            else if(strcmp(op,"减少")==0)
            sum-=a;
            else
            printf("错误操作"); 
        }
        else {
            scanf("%s",op);//注意此时name存储的是操作,op存储的是变量名字//
            inexchange(sum);
        }
    }
}

文字转数字

int exchange(char a[]){                     //汉字转数字// 
    int i,j,n,sum;
    char tens[10],unit[10];
    if(strlen(a)==2) {                        //1-10// 
        for(i=0;i<=10;i++){
            if((strcmp(a,str[i])==0))
            return i;
        }
    }
    if(strlen(a)==4){                        //11-20,10的倍数// 
        tens[0]=a[0];tens[1]=a[1]; 
        unit[0]=a[2];unit[1]=a[3];
        if(strcmp(tens,"十")==0){
            for(i=0;i<=10;i++){
                if(strcmp(unit,str[i])==0)
                return 10+i;
            } 
        }
        if(strcmp(unit,"十")==0){
            for(i=0;i<=10;i++){
                if(strcmp(tens,str[i])==0)
                return i*10;
            }
        }   
    }
    else {                                       //几十几//
        tens[0]=a[0];tens[1]=a[1]; 
        unit[0]=a[4];unit[1]=a[5];
        for(i=0;i<=10;i++){
            if(strcmp(tens,str[i])==0)
            sum=i*10;
        }
        for(i=0;i<=10;i++){ 
            if(strcmp(unit,str[i])==0)
            sum+=i;
        }
        return sum;
    }
}

数字转文本

void inexchange(int sum){     //数字转文本//
    int unit=sum%10,tens=sum/10;                
    if(sum<=10)//0-10//
    printf("%s\n",str[sum]); 
    else if(sum>=11&&sum<=20||sum%10==0){
        if(sum%10==0)
        printf("%s十\n",str[tens]);
        else
        printf("十%s\n",str[unit]);   
    } 
    else{
        printf("%s十%s\n",str[tens],str[unit]);
    }
}

制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。

  • 查了好多资料找不到如何编写脚本,直到助教给了示例才明白了切入点,但还不是很懂。
  • 打开一个文本文档,输入windows批处理对应代码(和命令行编译很类似),保存后改为文件类型改为.bat,运行后会生成一个对应的exe可执行程序
    第二次作业_第8张图片

第二次作业_第9张图片

进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。

  • 首先要自己写好测试代码,开始我以为很轻松,结果发现测试代码和原本的代码基本差不多大小。。。
  • 函数功能最主要的就是文本和数字的转化,所以我主要测试exchange函数

第二次作业_第10张图片

第二次作业_第11张图片

添加功能:通过命令行读取一个文件,然后运行这个文件

  • 这个问题一直是很懵的,知道看了班级大佬们的作业才知道freopen函数,去搜了它的用法才知道怎么操作。
  • freopen是在stdio.h库中的一种函数,定义为FILE * freopen(const char * path, const char * mode, FILE * stream);
  • 但我们只需要freopen(“txt文件名”,“r”,“stdin”);就可以直接使用。
    第二次作业_第12张图片
  • 开始txt中的中文会变成乱码导致程序错误,我改变了打开放式重新输入了一遍就OK了(记事本改为写字板)
    第二次作业_第13张图片

    遇到的问题

  • 这一部分基本全部是我没有学过的东西,而且网络上也很难找到相关知识(应该是我菜),所以做的很艰难,也还有很多地方没明白。
  • 脚本语言,我开始无从下手,甚至不知道从哪里开始编辑,问了一些同学才慢慢弄明白,而且发现很有趣,还有许多命令和代码都没有尝试,以后会更多的学一些。
  • freopen函数,有很多用法,我只是简单的把文件名直接输入到代码内,还可以输入文件名或者地址,而且文件一定要和源代码在一个文件夹内。
  • 脚本编写和使用freopen时,txt文件内的内容老是显示乱码,我换了一种打开方式就成功了,但还有些不明白原理。

总结

-这次作业学到了很多定西也有很多东西还没有弄明白,培养了自己自己找答案的能力,还有耐心,中途我找不到一些问题的答案我甚至想放弃作业
-还是有很多东西不是很明白,需要后续再学习。

你可能感兴趣的:(第二次作业)