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

Markdown在线编辑器 - www.MdEditor.com

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




Markdown在线编辑器 - www.MdEditor.com
作业描述 作业详情
这个作业属于哪个课程 2020福大数计面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 1. 学习并使用git,建立github仓库
2.优化架构
3.优化命名规范
4.制作编译脚本
5.进行单元测试
6.添加功能
7.发布博客
作业正文 见下文
其他参考文献 1.Git教程
2.BAT 批处理脚本教程
3.C语言.c和.h
4.freopen()函数的使用



Markdown在线编辑器 - www.MdEditor.com

一、实践题

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


  • 我采用 githubdesktop 上传代码和测试脚本


    (1)下载并进入 GitHub desktop 建立新的仓库 FZU_homework2020


    2020面向对象程序设计寒假作业2 题解_第1张图片


    (2)打开仓库本地的文件夹 将代码和脚本传入仓库


    2020面向对象程序设计寒假作业2 题解_第2张图片
    2020面向对象程序设计寒假作业2 题解_第3张图片


    (3)打开网页版 github 检查文件已上传至仓库


    2020面向对象程序设计寒假作业2 题解_第4张图片



    二、编程题


  • 继续完成作业一的编程题。

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

  • 优化规范,尤其是命名规范。

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

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

  • 在作业一编程题的基础上添加以下功能:通过命令行读取一个文件,然后运行这个文件。

    1、优化架构



    我将 exchange 函数进行优化,用数组和循环结合,避免了重复的枚举,缩小了代码量。

    之前的函数

int exchange(char s4[]){
    if( !strcmp(s4,"零") ) return 0;
    if( !strcmp(s4,"一") ) return 1;
    if( !strcmp(s4,"二") ) return 2;
    if( !strcmp(s4,"三") ) return 3;
    if( !strcmp(s4,"四") ) return 4;
    if( !strcmp(s4,"五") ) return 5;
    if( !strcmp(s4,"六") ) return 6;
    if( !strcmp(s4,"七") ) return 7;
    if( !strcmp(s4,"八") ) return 8;
    if( !strcmp(s4,"九") ) return 9;
    if( !strcmp(s4,"十") ) return 10;
}

优化后

int exchange(char s4[])
{
    char b[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
    for(int i=0;i<=10;i++){
    if( !strcmp(s4,b[i]) ) return i;
    }
}


其余部分函数

cum函数 用于判断进行的运算 并据此将exchange得到的数进行正负转换 和原始数相加减。

int cum(char s3[],char s4[]){
    if( !strcmp(s3,"增加") ) { return exchange(s4); }
    if( !strcmp(s3,"减少") ) { return -exchange(s4); } 
}

back函数用于输出 将数字转换为汉字形式 并在输出时根据数据范围进行不同格式输出。

int back(int wal){
    char a[10][4]={"零","一","二","三","四","五","六","七","八","九"};
    if( wal >= 10 && wal <= 99){
        int x = wal%10;
        wal/=10;
        if(wal!=1) 
            printf("%s十%s",a[wal],a[x]);
        else    
            printf("十%s",a[x]);
    }
    else printf("%s",a[wal]);
}

主函数

#include
#include
int main()
{
    int wal = 0 ;
    char s1[100],s2[100],s3[100],s4[100];
    scanf("%s %s %s %s",s1,s2,s3,s4);
    getchar();
    if( strcmp(s1,"整数") ) { printf("输入错误。\n"); }
    else  wal += exchange(s4); 
        while(1){
        scanf("%s",s2);
            if( !strcmp(s2,"看看") ){
                if( wal < 0 ) printf("输入错误。\n"); 
                else back(wal);
                     break;
            }
            scanf("%s %s",s3,s4);
            wal += cum(s3,s4);
        }
}


2、编译脚本



根据查阅有关资料以及同学们的讨论
我才用了 notepad++ 写了类似如下图的编译脚本 并保存为 .bat 后缀

@echo off
title 函数测试脚本
g++ -o test1.exe test1.c
test1.exe
pause
del test1.exe



在操作过程中,我遇到不少问题


-.bat文件采用中文,如给控制台更改名字时,会出现奇奇怪怪的乱码。
-脚本运行时一下就结束了
经过进一步探索和借鉴


-将编码改为 ANSI 可以解决用中文出现乱码情况
-在脚本末尾加上 pause 可以阻止脚本马上结束



3、测试脚本


测试脚本需要先设计相对应的程序



我对 exchange 函数 以及 cum 函数 进行脚本测试

exchange函数脚本测试


#include
#include
int exchange(char str1[])
{
    char b[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
    for (int i=0;i<=10;i++){
    if (!strcmp(str1,b[i])) return i;
    }
}

int main(){
    int x,y;
    char str1[100],str2[100];
    char s[10][4]={"零","一","二","三","四","五","六","七","八","九"};
    while (scanf("%s",str1) != EOF){
        y=exchange(str1);
        if (!strcmp(str1,s[y]))
        printf("pass\n");
        else printf("error\n");
    }
    // 测试 exchange 函数 

} 

得到了如下的测试结果



2020面向对象程序设计寒假作业2 题解_第5张图片

cum 函数脚本测试


#include
#include

int cum(char str2[],int x){
    if (!strcmp(str2,"增加") )  {return x;}
    if (!strcmp(str2,"减少") )  {return -x;} 
}

int main(){
    int x,y;
    char str2[100];
        while (scanf("%s %d",str2,&x) != EOF){
            if (strcmp(str2,"增加") && strcmp(str2,"减少")) {
            printf("error\n"); continue;
            }
            y=cum(str2,x);
            if (!strcmp(str2,"增加")){
                if (y>0)
                printf("%d  pass\n",y); 
                else printf("error\n");}
            else if (!strcmp(str2,"减少")){
                if(y<0) 
                printf("%d  pass\n",y); 
                else printf("error\n"); } 
        }
    // 测试 cum 函数 增加 2 
}


得到了如下的测试结果



2020面向对象程序设计寒假作业2 题解_第6张图片



4、通过命令行读取一个文件



通过查阅资料,我知道这时应使用 freopen 函数

freopen是被包含于C标准库头文件stdio.h中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。
形参说明:
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。



(1)在这里需要将主函数做一定修改

int main(int argc,char *argv[]){
  if(argc!=1){ 
      freopen(argv[1],"r",stdin);
  } 

-argv[1]表示在控制台输入的.txt的地址。


(2)-准备测试样例 1.txt 、2.txt。并将其与程序的cpp及exe文件放于同一目录下。
在这里我又被卡了很久很久很久很久,刚开始直接用Windows自带的记事本来书写测试样例,然后在cmd操作时总出现输入错误,换了好几种 freopen 函数的输入方法都不行
后来想起来前面脚本书写的例子 才想起来改用 ASNI 编码的形式 。


2020面向对象程序设计寒假作业2 题解_第7张图片


2020面向对象程序设计寒假作业2 题解_第8张图片

测试结果:



2020面向对象程序设计寒假作业2 题解_第9张图片



以上就是我第二次作业的内容。


你可能感兴趣的:(2020面向对象程序设计寒假作业2 题解)