2020面向对象寒假作业(二)

作业属于 2020年面向对象程序设计 
作业要求 面向对象程序设计寒假作业2
作业目标

1.创建GitHub仓库,并上传文件

2.学习Windows批处理

3.使用Windows批处理编译代码

参考文献

Windows批处理(cmd/bat)常用命令教程

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

Git教程

Git和GitHub使用教程

 

1.使用github desktop新建一个github仓库

  • 新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
  • 请使用.gitignore文件忽略不要上传的文件。

由于之前已经创建过GitHub的账号, 安装了GitHub, 所以跳过这些步骤

 

(1)创建仓库

创建了一个名为"2020-opp"的仓库,将本次作业上传于此

 

 

 

 

(2)上传文件

右键文件夹, 点击Git bash here, 随后输入命令语句

git clone https://github.com/Es-war/2020-opp.git

 

 

 

创建成功后打开多出来的文件夹,把所需文件复制黏贴进去

继续输入命令    cd 2020-opp, 进入此文件夹

接下来依次输入以下代码即可完成其他剩余操作:

     git add .        (别省略".")

     git commit  -m  "提交信息"  

     git push -u origin master   

 

 

最后打开网页检查是否上传成功

 

 

 

 

 

 

 

2.编程题

·继续完成作业一的编程题。
·优化架构,一般要求每个函数长度不超过15行。
·优化规范,尤其是命名规范。
·制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
·进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
·在作业一编程题的基础上添加以下功能
         ·通过命令行读取一个文件

(1)代码分块

          error函数

在此函数中提示用户错误输入的类型

void error(int type)
{
    switch ( type )
      {
          case 1:printf("请输入正确数据\n");break;
          case 2:printf("请输入正确符号\n");break;
          case 3:printf("输入数值须在0~10内\n");break;
          case 4:printf("数值总和须在0~99范围内\n");
      }
}
         getValue函数

在此函数中对输入的金额进行由中文到阿拉伯数字的转换,包括第一次输入时的初始金额,和后续的钱包增加/减少操作中的转换. 在最开始的版本中,sum(钱包金额)值的增加减少我给它们各自定义了一个函数,后来发现没有这个必要,只要我输入的数据为零到十,可以直接调用getValue函数进行处理,这样也优化了代码的结构,减少代码冗余部分.

int getValue()  
{
    if (!strcmp("", money)) return 0;
    else if ( !strcmp("", money) ) return 1;
    else if ( !strcmp("", money) ) return 2;
    else if ( !strcmp("", money) ) return 3;
    else if ( !strcmp("", money) ) return 4;
    else if ( !strcmp("", money) ) return 5;
    else if ( !strcmp("", money) ) return 6;
    else if ( !strcmp("", money) ) return 7;
    else if ( !strcmp("", money) ) return 8;
    else if ( !strcmp("", money) ) return 9;
    else if ( !strcmp("", money) ) return 10;
    else error(3);
} 
           deal函数

在此函数中对用户输入的"钱包 增加"/  "钱包 减少"/  "看看 钱包"的行为进行判断处理, 根据具体行为具体操作

void deal() 
{
    for (;;)
      {
          scanf("%s", wallet);
          if ( !strcmp("钱包", wallet) )   
            {
                scanf("%s%s", sign, money);  
                if ( !strcmp("增加", sign) )   
                  sum += getValue(); 
                else if ( !strcmp("减少", sign) )
                  sum -= getValue();
                else
                  error(2);
          }
        else if ( !strcmp("看看", wallet) )
          {
              scanf("%s", wallet);  break; 
          } 
        else error(1); 
      }
}
            output函数

在此函数中定义了字符二维数组来保存"零一二三四五六七八九十"这些中文字符,根据下标便可轻松调用.  主要用于输出<10的数据,以及接下来被outputPlus函数的调用.  原先采用的是switch语句,但后来发现这样过于繁琐,所以这样改进.

void output(int num)  
{
    char figure[10][4] = {"", "", "", "", "", "", "", "", "", ""};
    printf("%s", figure[num]);
}
             outputPlus

 

在此函数中,主要是对[10, 99]区间数据的输出进行处理, 较为特殊的数据为[10,19], 例如12, 按照日常表达习惯应为"十二", 而不是"一十二"

void outputPlus(int num)
{
    int tensPlace, onesPlace;
    tensPlace = num / 10;
    onesPlace = num % 10;
    if ( tensPlace != 1 )
      output(tensPlace);
    printf("十");
    if ( onesPlace )
          output(onesPlace);
}
              完整代码
#include<stdio.h>
#include<string.h>
char movement[10], wallet[10], sign[10], money[10];
int sum;
void error(int type)
{
    switch ( type )
      {
          case 1:printf("请输入正确数据\n");break;
          case 2:printf("请输入正确符号\n");break;
          case 3:printf("输入数值须在0~10内\n");break;
          case 4:printf("数值总和须在0~99范围内\n");
      }
}
int getValue()  
{
    if (!strcmp("", money)) return 0;
    else if ( !strcmp("", money) ) return 1;
    else if ( !strcmp("", money) ) return 2;
    else if ( !strcmp("", money) ) return 3;
    else if ( !strcmp("", money) ) return 4;
    else if ( !strcmp("", money) ) return 5;
    else if ( !strcmp("", money) ) return 6;
    else if ( !strcmp("", money) ) return 7;
    else if ( !strcmp("", money) ) return 8;
    else if ( !strcmp("", money) ) return 9;
    else if ( !strcmp("", money) ) return 10;
    else error(3);
} 
void deal() 
{
    for (;;)
      {
          scanf("%s", wallet);
          if ( !strcmp("钱包", wallet) )   
            {
                scanf("%s%s", sign, money);  
                if ( !strcmp("增加", sign) )   
                  sum += getValue(); 
                else if ( !strcmp("减少", sign) )
                  sum -= getValue();
                else
                  error(2);
          }
        else if ( !strcmp("看看", wallet) )
          {
              scanf("%s", wallet);  break; 
          } 
        else error(1); 
      }
}
void output(int num)  
{
    char figure[10][4] = {"", "", "", "", "", "", "", "", "", ""};
    printf("%s", figure[num]);
}
void outputPlus(int num)
{
    int tensPlace, onesPlace;
    tensPlace = num / 10;
    onesPlace = num % 10;
    if ( tensPlace != 1 )
      output(tensPlace);
    printf("");
    if ( onesPlace )
          output(onesPlace);
}
int main() 
{
    scanf("%s%s%s%s", movement, wallet, sign, money); 
    sum = getValue();  
    deal();   
    if (sum < 10) 
      output(sum);  
    else if ( sum < 100 ) 
      outputPlus(sum);
    else
      error (4);
    return 0;
}

#不足:对于输入金额大于十的未能进行有效处理

 

(2)制作编译脚本

使用Windows批处理来制作编译器脚本

查阅相关资料,了解"脚本""编译器脚本""Windows批处理"等相关名词, 掌握主要的Windows批处理命令语句, 以及询问同学

(一开始, 我选择学习的脚本语言是shell, 看了一大半以后才发现原来shell是针对Linux系统的, 如果想在Windows下运行, 需下载专门的软件, 也比较麻烦. 后来了解到Git bash可以运行shell, 于是我跟着网上的教程进行操作, 但是不知道为什么老是出错, 我使用Windows自带的记事本进行编写shell指令, 然后另存为时修改后缀, 一开始总是出现闪退现象, 我一双击文件, 立马关闭, 后来我给它增加了sleep属性, 便于观察. 一番折腾后, 我最终选择Windows批处理.)

 最后一句"pause"很重要, 有点类似于shell中的sleep吧(不知道有没有说错), 这可以让我们看到最终运行结果.

@echo off
set /p a=请输入文件所在磁盘
cd "%a%"
set /p b=请输入文件所在路径
cd "%b%"
set /p c=请输入文件名
echo 编译开始
gcc "%c%" -o try.exe
if exist "try.exe" echo 编译成功
if not exist "try.exe" echo 编译失败
pause

 

 

 

(3)测试脚本

测试脚本的编写与上述的编译脚本大同小异

 测试脚本代码如下

@echo off
cd C:/Users/Es war/C
set /p a=请输入所要测试单元
echo 开始测试
"%a%"
echo 测试结束
pause
                 error函数测试
#include<stdio.h>
#include<string.h>
char movement[10], wallet[10], sign[10], money[10];
int sum;
void error(int type)
{
    switch ( type )
      {
          case 1:printf("请输入正确数据\n");break;
          case 2:printf("请输入正确符号\n");break;
          case 3:printf("输入数值须在0~10内\n");break;
          case 4:printf("数值总和须在0~99范围内\n");
      }
}
int main() 
{
    int i;
    for (i = 1; i < 5; i++)
      error(i);
    return 0;
}

 

 

 

                 getValue函数测试
#include<stdio.h>
#include<string.h>
char movement[10], wallet[10], sign[10], money[10];
int sum;
void error(int type)
{
    switch ( type )
      {
          case 1:printf("请输入正确数据\n");break;
          case 2:printf("请输入正确符号\n");break;
          case 3:printf("输入数值须在0~10内\n");break;
          case 4:printf("数值总和须在0~99范围内\n");
      }
}
int getValue()  
{
    if (!strcmp("", money)) return 0;
    else if ( !strcmp("", money) ) return 1;
    else if ( !strcmp("", money) ) return 2;
    else if ( !strcmp("", money) ) return 3;
    else if ( !strcmp("", money) ) return 4;
    else if ( !strcmp("", money) ) return 5;
    else if ( !strcmp("", money) ) return 6;
    else if ( !strcmp("", money) ) return 7;
    else if ( !strcmp("", money) ) return 8;
    else if ( !strcmp("", money) ) return 9;
    else if ( !strcmp("", money) ) return 10;
    else error(3);
} 
int main() 
{
    for (int i = 0; i<12; i++)
      {
          scanf("%s", money); 
        sum = getValue();  
        printf("%d\n", sum);
      }
    return 0;
}

 

                   deal函数测试

 

#include<stdio.h>
#include<string.h>
char movement[10], wallet[10], sign[10], money[10];
int sum;
void error(int type)
{
    switch ( type )
      {
          case 1:printf("请输入正确数据\n");break;
          case 2:printf("请输入正确符号\n");break;
          case 3:printf("输入数值须在0~10内\n");break;
          case 4:printf("数值总和须在0~99范围内\n");
      }
}
int getValue()  
{
    if (!strcmp("", money)) return 0;
    else if ( !strcmp("", money) ) return 1;
    else if ( !strcmp("", money) ) return 2;
    else if ( !strcmp("", money) ) return 3;
    else if ( !strcmp("", money) ) return 4;
    else if ( !strcmp("", money) ) return 5;
    else if ( !strcmp("", money) ) return 6;
    else if ( !strcmp("", money) ) return 7;
    else if ( !strcmp("", money) ) return 8;
    else if ( !strcmp("", money) ) return 9;
    else if ( !strcmp("", money) ) return 10;
    else error(3);
} 
void deal() 
{
    for (;;)
      {
          scanf("%s", wallet);
          if ( !strcmp("钱包", wallet) )   
            {
                scanf("%s%s", sign, money);  
                if ( !strcmp("增加", sign) )   
                  sum += getValue(); 
                else if ( !strcmp("减少", sign) )
                  sum -= getValue();
                else
                  error(2);
          }
        else if ( !strcmp("看看", wallet) )
          {
              scanf("%s", wallet);  break; 
          } 
        else error(1); 
      }
}
int main() 
{
    scanf("%s%s%s%s", movement, wallet, sign, money); 
    sum = getValue();  
    deal();   
    printf("%d\n", sum);
    return 0;
}

 

 

 

 

 

 

                   output函数outputPlus函数测试

 

 

#include<stdio.h>
#include<string.h>
char movement[10], wallet[10], sign[10], money[10];
int sum;
void error(int type)
{
    switch ( type )
      {
          case 1:printf("请输入正确数据\n");break;
          case 2:printf("请输入正确符号\n");break;
          case 3:printf("输入数值须在0~10内\n");break;
          case 4:printf("数值总和须在0~99范围内\n");
      }
}
void output(int num)  
{
    char figure[10][4] = {"", "", "", "", "", "", "", "", "", ""};
    printf("%s", figure[num]);
}
void outputPlus(int num)
{
    int tensPlace, onesPlace;
    tensPlace = num / 10;
    onesPlace = num % 10;
    if ( tensPlace != 1 )
      output(tensPlace);
    printf("");
    if ( onesPlace )
          output(onesPlace);
}
int main() 
{
    scanf("%d", &sum); 
    if (sum < 10) 
      output(sum);  
    else if ( sum < 100 ) 
      outputPlus(sum);
    else
      error (4);
    return 0;
}

 

 

(4)添加功能

使C语言的freopen()函数即可

例如, 我要读入的文件名为"war.txt"

 

 

 

 

 

 答案正确

 

posted @ 2020-02-04 17:27  Es-war  阅读(283)  评论(0编辑  收藏  举报