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

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 1.继续完成编程题 2.新建一个github仓库,并把作业推送到该仓库 3.发布博客
作业正文 一、实践题 二、编程题
其他参考文献 常见代码命名规则 C语言常见命名规范

一、实践题

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

多次下载git或者github desktop都不成功

一开始我以为是笔记本电脑自身问题,所以我换用台式电脑下载,下载到最后的时候依旧出现下载失败

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

可能是家里网络问题,等过段时间疫情好转,可以出去的时候,我再换个地方的网络,下载git,完成这次没完成好的作业。

所以这一题我只在网站上创建了仓库,并在网站上上传文件

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

二、编程题

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

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

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

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

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

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

2.1 优化结构

将point函数分成point和point2函数

point实现零到十的转化

point2实现十一到九九的转化

int point(char num[])
{
    if (strcmp("零", num) == 0) return 0;
    else 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 10;
    else{
        int i, a, b, c;
        char x[2], y[2];
        for (i = 0; i < 2; i++){
            x[i] = num[i];
            y[i] = num[i + 2];
        }
        if (strcmp("十", x) == 0){
            a = 10;
            b = point(y);
            c = a + b;
        }
        else {
            a = point(x);
            b = point(y);
            c = a * 10 + b;
        }
        return c;
    }
}

换成

int point(char num[])
{
    int point2(char num[]);
    if (strcmp("零", num) == 0) return 0;
    else 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 10;
    else{
        int shu;
        shu=point2(num); 
        return  shu;
    }
}

int point2(char num[])
{
    int i, a, b, c;
        char x[2], y[2];
        for (i = 0; i < 2; i++){
            x[i] = num[i];
            y[i] = num[i + 2];
        }
        if (strcmp("十", x) == 0){
            a = 10;
            b = point(y);
            c = a + b;
        }
        else {
            a = point(x);
            b = point(y);
            c = a * 10 + b;
        }
        return c;
}

完整代码

#include
#include
int main()
{
    int point(char num[]);
    void change(int a);
    int qian,k;
    char a[30], b[30], c[30], d[30],x[30],y[30],z[30];
    scanf("%s%s%s%s", a, b, c, d);
    if (strcmp(a, "整数") != 0 || strcmp(b, "钱包") != 0 || strcmp(c, "等于") != 0) {
        printf("格式错误");
        return 0;
    }
    else qian = point(d);
    for(;;) {
        scanf("%s%s", x, y);
        if (strcmp(x, "看看") == 0 && strcmp(y, "钱包") == 0){
            change(qian);
            break;
        }
        if (strcmp(x, "钱包") == 0) {
            if (strcmp(y, "增加") == 0) {
                scanf("%s", z);
                k = point(z);
                qian += k;
            }
            if (strcmp(y, "减少") == 0) {
                scanf("%s", z);
                k = point(z);
                qian -= k;
            }
        }
        else printf("格式错误");
    }
    return 0;
}
int point(char num[])
{
    int point2(char num[]);
    if (strcmp("零", num) == 0) return 0;
    else 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 10;
    else{
        int shu;
        shu=point2(num); 
        return  shu;
    }
}

int point2(char num[])
{
    int i, a, b, c;
        char x[2], y[2];
        for (i = 0; i < 2; i++){
            x[i] = num[i];
            y[i] = num[i + 2];
        }
        if (strcmp("十", x) == 0){
            a = 10;
            b = point(y);
            c = a + b;
        }
        else {
            a = point(x);
            b = point(y);
            c = a * 10 + b;
        }
        return c;
}

void change(int a)
{
    void exchange(int b);
    int x, y;
    if (a <= 10) exchange(a);
    else if (a > 10 && a < 20) {
        printf("十");
        x = a % 10;
        exchange(x);
    }
    else if (a >= 20 && a % 10 == 0) {
        y = a / 10;
        exchange(y);
        printf("十");
    }
    else {
        x = a / 10;
        exchange(x);
        printf("十");
        y = a % 10;
        exchange(y);
    }
}
void exchange(int b)
{
    if (b == 0)printf("零");
    if (b == 1)printf("一");
    if (b == 2)printf("二");
    if (b == 3)printf("三");
    if (b == 4)printf("四");
    if (b == 5)printf("五");
    if (b == 6)printf("六");
    if (b == 7)printf("七");
    if (b == 8)printf("八");
    if (b == 9)printf("九");
    if (b == 10)printf("十");
}

2.2 命名规范

2.2.1 常用的命名规则

·匈牙利命名法
这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的。

其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。

匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。

·驼峰命名法

驼峰命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。其中第一个单词首字母小写,余下的单词首字母大写。

函数名中每一个逻辑断点都有一个大写字母来标记。

·帕斯卡命名法

帕斯卡(Pascal)命名法与骆驼命名法类似。

只不过骆驼命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。

·下划线命名法

下划线法是随着C语言的出现流行起来的,在UNIX/LIUNX这样的环境,以及GNU代码中使用非常普遍。

2.2.2 函数的命名

函数名使用下划线分割小写字母的方式命名:
设备名_操作名()

2.2.3 变量的命名

变量的命名也采用下划线分割小写字母的方式命名。

2.2.4 常量及宏的命名

采用下划线分割大写字母的方式命名,一般应以设备名作为前缀,防止模块间命名的重复。

参考内容:常见代码命名规则 C语言常见命名规范

2.3 编译脚本

参考了很多同学的作业,我最终决定也用windows批处理的方法。

首先我在B站上看了一些视频,做好了准备工作,出现的却是下面的结果。

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

我一直修改脚本,做了很多尝试,没有效果。

随后,我试着百度,好像有了办法。

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

结果,依旧没有用。

然后,我上网搜索“如何解决“ 'g++' 不是内部或外部命令,也不是可运行的程序或批处理文件 ”

根据以下两个博客:

(https://www.jianshu.com/p/9bffbaf12bed)

(https://blog.csdn.net/wzhwei1987/article/details/83414218)

我下载了所需文件

设置了路径

期间还遇到了各种困难,我又搜寻了很多相关问题的答案,在此就不一一列举了。

但最终,我成功了!!

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

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

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

(由于电脑自动设置了隐藏扩展名,所以上图没有test后面.exe,不过现已更改)

哦对了,我最初上网查如何“制作一个编译脚本,运行该脚本可以编译你的代码”,看到一个回答是使用makefile。

Makefile文件详解一(怎么在Windows下使用Makefile文件)

windows下使用makefile

Makefile教程

根据这些资料以及在b站上看的makefile教学视频,我认为大致步骤为:

第一步,创建example1文件夹,里面有test.c的文件。

第二步,创建makefile文本文件(脚本)。

面向对象程序设计寒假作业2_第8张图片
(上图来自视频)

第三步,到所属文件夹下打一个make,点回车后自动运行命令gcc test.c -o test,然后就有test可执行文件了,最后可以执行它。
面向对象程序设计寒假作业2_第9张图片
(上图来自视频)

补充: makefile格式:

target:dependencies
command

不过我并未完全实现这些操作,不知道问题出在哪里。

2.4 单元测试**

选择对point及point2函数进行测试

测试代码如下:

#include
#include
int main()
{
    int point(char num[]);
    int a[10]={0,3,5,13,20,31,33,45,56,99};
    char b[10][6] = { "零","三","五","十六","十九","三十","三三","四八","五九","九九" };
    int i;
    for(i=0;i<10;i++)
    {
        if(a[i]==point(b[i])) 
        {
            printf("%s",b[i]);
            printf( "测试正确" );
            printf("\n");
        }
        else
        {
                printf("%s",b[i]);
            printf( "测试错误" );
            printf("\n");
        }
     } 
     return 0;
 } 
 
 int point(char num[])
{
    int point2(char num[]);
    if (strcmp("零", num) == 0) return 0;
    else 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 10;
    else{
        int shu;
        shu=point2(num); 
        return  shu;
    }
}

int point2(char num[])
{
    int i, a, b, c;
        char x[2], y[2];
        for (i = 0; i < 2; i++){
            x[i] = num[i];
            y[i] = num[i + 2];
        }
        if (strcmp("十", x) == 0){
            a = 10;
            b = point(y);
            c = a + b;
        }
        else {
            a = point(x);
            b = point(y);
            c = a * 10 + b;
        }
        return c;
}

测试脚本如下:

测试结果如下:

2.5 命令行读取并运行文件

参考了许多同学的作业说使用freopen()函数,所以我在主函数中加入了这一步,成功实现了命令行读取并运行文件。

代码如下:

#include
#include
int main()
{
    int point(char num[]);
    void change(int a);
    char file[100];
    printf("请输入文件地址\n");
    scanf("%s",file); 
    freopen(file,"r",stdin);
    int qian,k;
    char a[30], b[30], c[30], d[30],x[30],y[30],z[30];
    scanf("%s%s%s%s", a, b, c, d);
    if (strcmp(a, "整数") != 0 || strcmp(b, "钱包") != 0 || strcmp(c, "等于") != 0) {
        printf("格式错误");
        return 0;
    }
    else qian = point(d);
    for(;;) {
        scanf("%s%s", x, y);
        if (strcmp(x, "看看") == 0 && strcmp(y, "钱包") == 0){
            change(qian);
            break;
        }
        if (strcmp(x, "钱包") == 0) {
            if (strcmp(y, "增加") == 0) {
                scanf("%s", z);
                k = point(z);
                qian += k;
            }
            if (strcmp(y, "减少") == 0) {
                scanf("%s", z);
                k = point(z);
                qian -= k;
            }
        }
        else printf("格式错误");
    }
    return 0;
}
int point(char num[])
{
    int point2(char num[]);
    if (strcmp("零", num) == 0) return 0;
    else 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 10;
    else{
        int shu;
        shu=point2(num); 
        return  shu;
    }
}

int point2(char num[])
{
    int i, a, b, c;
        char x[2], y[2];
        for (i = 0; i < 2; i++){
            x[i] = num[i];
            y[i] = num[i + 2];
        }
        if (strcmp("十", x) == 0){
            a = 10;
            b = point(y);
            c = a + b;
        }
        else {
            a = point(x);
            b = point(y);
            c = a * 10 + b;
        }
        return c;
}

void change(int a)
{
    void exchange(int b);
    int x, y;
    if (a <= 10) exchange(a);
    else if (a > 10 && a < 20) {
        printf("十");
        x = a % 10;
        exchange(x);
    }
    else if (a >= 20 && a % 10 == 0) {
        y = a / 10;
        exchange(y);
        printf("十");
    }
    else {
        x = a / 10;
        exchange(x);
        printf("十");
        y = a % 10;
        exchange(y);
    }
}
void exchange(int b)
{
    if (b == 0)printf("零");
    if (b == 1)printf("一");
    if (b == 2)printf("二");
    if (b == 3)printf("三");
    if (b == 4)printf("四");
    if (b == 5)printf("五");
    if (b == 6)printf("六");
    if (b == 7)printf("七");
    if (b == 8)printf("八");
    if (b == 9)printf("九");
    if (b == 10)printf("十");
}

文本内容如下:

面向对象程序设计寒假作业2_第10张图片

结果如下:

面向对象程序设计寒假作业2_第11张图片

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