寒假作业2

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 寒假作业2
这个作业的目标 完善作业一代码、使用git建立github仓库、制作编译脚本、进行单元测试、添加文件读取功能
作业正文 寒假作业2
参考文献 git教程、git上传文件教程、Windows批处理(cmd/bat)常用命令教程、freopen函数

实践题

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

  • 在GitHub上创建仓库名为fzu-homework的仓库
    寒假作业2_第1张图片
  • 安装运行Git
    寒假作业2_第2张图片
  • 在Git上创建本地代码库fzu-homework
    寒假作业2_第3张图片
  • 首先我们需要在github上找到和我们相连接的https链接,首先在github上创建一个代码仓库,创建好之后找到clone and download,如下图所示:
    寒假作业2_第4张图片
  • 这个时候我们再按git上传文件教程上提示输入代码,最后系统会要求你输入你github的用户名和密码,如下图(脚本是我后来再上传的):
    寒假作业2_第5张图片
    寒假作业2_第6张图片
    再上传脚本:
    寒假作业2_第7张图片

  • 打开GitHub仓库可见代码成功上传:
    寒假作业2_第8张图片
    再上传脚本:
    寒假作业2_第9张图片

编程题

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

优化代码

将代码不同功能部分更具体编写成几个函数:

  • 1.读入是将汉字数字识别转换为可计算的数据——convert1函数,实现代码如下:
int convert1(char num[])
{
    if (strcmp(num, "一") == 0)
        return 1;
    else if (strcmp(num, "二") == 0)
        return 2;
    else if (strcmp(num, "三") == 0)
        return 3;
    else if (strcmp(num, "四") == 0)
        return 4;
    else if (strcmp(num, "五") == 0)
        return 5;
    else if (strcmp(num, "六") == 0)
        return 6;
    else if (strcmp(num, "七") == 0)
        return 7;
    else if (strcmp(num, "八") == 0)
        return 8;
    else if (strcmp(num, "九") == 0)
        return 9;
    else if (strcmp(num, "零") == 0)
        return 0;
    else if (strcmp(num, "十") == 0)
    return 10;
}
  • 2.将数字0-10转换为中文的函数——convert2函数,实现代码如下:
char* convert2(int n)
{
    if (n == 0)  return "零";
    else if (n == 1) return "一";
    else if (n == 2) return "二";
    else if (n == 3) return "三";
    else if (n == 4) return "四";
    else if (n == 5) return "五";
    else if (n == 6) return "六";
    else if (n == 7) return "七";
    else if (n == 8) return "八";
    else if (n == 9) return "九";
    else if (n == 10) return "十";
}
  • 3.由于中文对0-100数字的中文表达习惯的不同,所以我们需要将数字分成不同的区间,按不同的输出习惯进行输出——output函数,具体代码如下:
void output(int n)
{ 
 if (n<=10)
    {
        printf("%s",convert2(n));
    }
    else if(n%10==0&&n<100)
    {
        printf("%s十",convert2(n/10));
    }
    else if (n<20)
    {
        n%=10;
        printf("十%s",convert2(n));
    }
    else if (n<100)
    {
        printf("%s十%s", convert2(n/10),convert2(n%10));
    }
}
  • 4.对输入的数据计算以及其他部分功能的主函数,代码如下:
int main()
{
    int result;
    char a[10],name[10],b[10],c[10];
   scanf("%s %s %s %s",a,name,b,c);
    if(strcmp(a,"整数")!=0||strcmp(b,"等于")!=0)
    {printf("输入错误\n");
     return 0;
    }
    result=convert1(c);
    while(1)
    {
        scanf ("%s ",name);
        if(strcmp(name,"看看")!=0)
        {
            scanf("%s %s",b,c);
            if(strcmp(b,"增加")==0)
            {
                result+=convert1(c);
            }
            else if(strcmp(b,"减少")==0)
            {
                result-=convert1(c);
            }
        }
        else break;
    }
    output(result);
    return 0;
}
  • 5.总代码如下:
#include
#include
int convert1(char num[])
{
    if (strcmp(num, "一") == 0)
        return 1;
    else if (strcmp(num, "二") == 0)
        return 2;
    else if (strcmp(num, "三") == 0)
        return 3;
    else if (strcmp(num, "四") == 0)
        return 4;
    else if (strcmp(num, "五") == 0)
        return 5;
    else if (strcmp(num, "六") == 0)
        return 6;
    else if (strcmp(num, "七") == 0)
        return 7;
    else if (strcmp(num, "八") == 0)
        return 8;
    else if (strcmp(num, "九") == 0)
        return 9;
    else if (strcmp(num, "零") == 0)
        return 0;
    else if (strcmp(num, "十") == 0)
    return 10;
}
char* convert2(int n)
{
    if (n == 0)  return "零";
    else if (n == 1) return "一";
    else if (n == 2) return "二";
    else if (n == 3) return "三";
    else if (n == 4) return "四";
    else if (n == 5) return "五";
    else if (n == 6) return "六";
    else if (n == 7) return "七";
    else if (n == 8) return "八";
    else if (n == 9) return "九";
    else if (n == 10) return "十";
}
void output(int n)
{ 
 if (n<=10)
    {
        printf("%s",convert2(n));
    }
    else if(n%10==0&&n<100)
    {
        printf("%s十",convert2(n/10));
    }
    else if (n<20)
    {
        n%=10;
        printf("十%s",convert2(n));
    }
    else if (n<100)
    {
        printf("%s十%s", convert2(n/10),convert2(n%10));
    }
}
int main()
{
    int result;
    char a[10],name[10],b[10],c[10];
   scanf("%s %s %s %s",a,name,b,c);
    if(strcmp(a,"整数")!=0||strcmp(b,"等于")!=0)
    {printf("输入错误\n");
     return 0;
    }
    result=convert1(c);
    while(1)
    {
        scanf ("%s ",name);
        if(strcmp(name,"看看")!=0)
        {
            scanf("%s %s",b,c);
            if(strcmp(b,"增加")==0)
            {
                result+=convert1(c);
            }
            else if(strcmp(b,"减少")==0)
            {
                result-=convert1(c);
            }
        }
        else break;
    }
    output(result);
    return 0;
}

编译脚本

  • 参考其他大佬同学的博客以及Windows批处理(cmd/bat)常用命令教程,先在记事本编写,而后转为bat格式,然后在菜单栏找到该文件运行即可,具体代码如下:
@echo off
echo 请输入文件所在磁盘
set /p a=
echo 正在转移到该磁盘
cd "%a%"
echo 请输入文件所在路径
set /p b=
echo 转移到文件路径
cd "%b%"
echo 请输入文件名
set /p c=
echo 编译开始
gcc "%c%" -o try.exe
if exist "try.exe" echo 编译成功
if not exist "try.exe" echo 编译失败
pause

运行结果如下图:
寒假作业2_第10张图片

  • 另外还有种方法是像示例脚本那样编写如下脚本,而后会生成名为lang的exe
gcc 1.cpp -o lang.exe

测试脚本

编写测试convert1函数的程序,代码如下:

#include 
#include 
int convert1(char num[])
{
    if (strcmp(num, "一") == 0)
        return 1;
    else if (strcmp(num, "二") == 0)
        return 2;
    else if (strcmp(num, "三") == 0)
        return 3;
    else if (strcmp(num, "四") == 0)
        return 4;
    else if (strcmp(num, "五") == 0)
        return 5;
    else if (strcmp(num, "六") == 0)
        return 6;
    else if (strcmp(num, "七") == 0)
        return 7;
    else if (strcmp(num, "八") == 0)
        return 8;
    else if (strcmp(num, "九") == 0)
        return 9;
    else if (strcmp(num, "零") == 0)
        return 0;
    else if (strcmp(num, "十") == 0)
    return 10;
}
void test(char* s, int a)
{
    if (convert1(s)== a)
        printf("pass\n");
    else
        printf("error\n");
}
int main(void)
{
    test("九", 9);
    test("零", 0);
    test("一", 1);
    test("十", 10);
    test("五", 5);
    test("六", 6);
    test("七十七", 77);
    test("silly", 99);
    test("kobe", 66);
    test("westbrook", 1);
    test("TJT", 2);
    return 0;
        
}
  • 保存为test1.cpp,而后编写脚本如下(注意文件类型写exe而非cpp,不然没有测试结果):
@echo off
cd C:\Users\lenovo\Desktop
echo 开始测试
test1.exe
echo 测试结束
Pause
  • 运行后结果如下图:
    寒假作业2_第11张图片

增加文件读取功能

  • 编写1.txt内容如下:
    寒假作业2_第12张图片

  • 通过百度和参考大佬们的博客,我知道需要用到freopen函数
    freopen可以通过修改参数指针对应的结构的数据成员(真正的文件句柄)的方式,使该文件对象映射到新的文件,从而达到将特定值的文件指针重定向的效果。成功的时候返回参数文件指针。在一个地方重定向文件指针,其他使用该指针的代码操作的文件也会发生变化。该功能用于重定向标准输入输出很合适。
  • 因此在main函数里添加如下代码:
 printf("输入文件名\n"); 
     char s[10];
     scanf("%s",s);
     freopen(s,"r",stdin);
  • 运行后结果如下图:
    寒假作业2_第13张图片

反思总结

这些东西虽然有点麻烦,但是通过查资料和看大佬们的博客还是能学会的,总的来说这些东西还是很有意义的。

你可能感兴趣的:(寒假作业2)