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

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2020OOP
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10231
这个作业的目标 1.继续完成作业1的编程题
2.学会新建github仓库并上传代码
3.制作编译脚本
作业正文 https://www.cnblogs.com/atsap/p/12260249.html
其他参考文献 https://blog.csdn.net/WxqHUT/article/details/86502948https://help.github.com/cn/articles/create-a-repohttps://blog.csdn.net/xu_fu_yong/article/details/83019776及一些同学的解答!

实践题

新建一个文件夹,右键点击Git Bash Here,执行命令git init创建一个.git隐藏文件夹。
面向对象程序设计寒假作业2_第1张图片
面向对象程序设计寒假作业2_第2张图片

输入自己的用户名和邮箱。
面向对象程序设计寒假作业2_第3张图片

设置SSH key,把生成的id_rsa.pubde内容复制粘贴在网页中的new SSH key,点击add SSH key。

将需要上传的代码复制到本地仓库,输入git status。
面向对象程序设计寒假作业2_第4张图片

git add +要上传的文件名,然后git status查看,发现new file。
面向对象程序设计寒假作业2_第5张图片

添加之后提交,输入git commit -m "第一次提交",再输入git status检查状态。
面向对象程序设计寒假作业2_第6张图片

新建一个repository。
复制repository的地址,输入命令:git remote add origin "地址”。
最后执行命令:git push origin master,会弹出一个登录的界面,登录。

可以看到自己的仓库里多了要上传的文件。
面向对象程序设计寒假作业2_第7张图片

编程题

继续完成程序

再对原来的代码进行了改动(感觉重新写了一遍??),虽然还有很多不完善的地方,但是相比于原来增加了对一些不规范输入的处理

  • 增加了输入的字符串字符数组的长度,避免输入使用不当造成数组越界;
  • 添加了没有输入“整数”,物品名称前后不一致,数字输入不规范等格式错误的提示,不过只能在输入回车后提示;
    如:

    if (strcmp(word, zs) != 0)
       {
          printf("程序只能处理整数数据\n");
       }

    运行结果:


  • 能够进行多次变量的加减,直到输入 看看 物品名称 ;
    面向对象程序设计寒假作业2_第8张图片

  • 把一个函数拆解成更多的函数,使每个函数行数更少,避免不同函数中有重复的部分。

    int Cn_To_Int(char* s); // 把一个汉字转化成数字
    void Int_To_Cn(char* m, int a); // 把数字转换成一个汉字
    int f(char* s); // 分类处理不同汉字数组成的数字
    int f1(char* s); // 把两个汉字转换成数字
    int f2(char* s); // 把三个汉字转换成数字
    void output(int i); // 处理数字并输出

书写规范:

虽然输入分号后vs会自动帮忙整理格式,但是还应当了解平时应该注意的书写规范,例如一些命名规则等,规范的书写可以使代码更整洁便于阅读,还可以避免一些错误,
在此摘录了一些觉得要注意的:

  • 在定义变量的同时初始化该变量
  • 两个相对独立的程序块、变量说明之后必须要加空行
  • 所有宏定义、枚举常数和const变量,用大写字母命名
  • 当需要把一个程序行的内容分成几行书写时,操作符应该放在行末
  • 函数名是复合词的,第一个词采用全部小写,随后每一个单词采用第一个字母大写,其余小写
  • 在一般情况下,源程序有效注释量必须在 20% 以上。虽然注释有助于理解代码,但注意不可过多地使用注释

全部代码:

#define _CRT_SECURE_NO_WARNINGS
#include
#include
char zero[] = "零",
one[] = "一",
two[] = "二",
three[] = "三",
four[] = "四",
five[] = "五",
six[] = "六",
seven[] = "七",
eight[] = "八",
nine[] = "九",
ten[] = "十";
int Cn_To_Int(char* s); // 把一个汉字转化成数字
void Int_To_Cn(char* m, int a); // 把数字转换成一个汉字
int f(char* s); // 分类处理不同汉字数组成的数字
int f1(char* s); // 把两个汉字转换成数字
int f2(char* s); // 把三个汉字转换成数字
void output(int i); // 处理数字并输出
int main()
{
    int money = 0;
    char zs[] = "整数",
        op1[] = "等于",
        op2[] = "增加",
        op3[] = "减少",
        kk[] = "看看";
    char word[1000] , name[1000];
    scanf("%s", word);
    if (strcmp(word, zs) != 0)
    {
        printf("程序只能处理整数数据\n");
    }
    scanf("%s", name);
    scanf("%s", word);
    if (strcmp(word, op1) == 0)
    {
        scanf("%s", word);
        money = f(word);
    }
    else
        printf("请按照格式输入\n");

        for (;;)
        {
            scanf("%s", word);
            if (strcmp(word, name) != 0 && strcmp(word, kk) != 0)
            {
                printf("无法进行运算\n");
                break;
            }
            else if (strcmp(word, kk) == 0)
                break;
            scanf("%s", word);
            if (strcmp(word, op2) == 0)
            {
                scanf("%s", word);
                money += f(word);
            }
            else if (strcmp(word, op3) == 0)
            {
                scanf("%s", word);
                money -= f(word);
            }
        }
    scanf("%s", word);
    
    if (strcmp(word, name) != 0)
    {
        printf("无法进行运算\n");
    }
    output(money);
    return 0;
}
int f(char* s)
{
    int i;
    if (strlen(s) == 2)
    {
        i = Cn_To_Int(s);
        if (i == -1)
            printf("无法处理输入的数字\n");
        else
            return i;
    }
    else if (strlen(s) == 4)
        return f1(s);
    else if (strlen(s) == 6)
        return f2(s);
    else printf("无法处理输入的数字\n");
}
int Cn_To_Int(char* s)
{
    if (strcmp(s, zero) == 0) return 0;
    else if (strcmp(s, one) == 0) return 1;
    else if (strcmp(s, two) == 0) return 2;
    else if (strcmp(s, three) == 0) return 3;
    else if (strcmp(s, four) == 0) return 4;
    else if (strcmp(s, five) == 0) return 5;
    else if (strcmp(s, six) == 0) return 6;
    else if (strcmp(s, seven) == 0) return 7;
    else if (strcmp(s, eight) == 0) return 8;
    else if (strcmp(s, nine) == 0) return 9;
    else if (strcmp(s, ten) == 0) return 10;
    else return -1;
}
void Int_To_Cn(char* m, int a)
{
    if (a == 1) strcat(m, one);
    if (a == 2) strcat(m, two);
    if (a == 3) strcat(m, three);
    if (a == 4) strcat(m, four);
    if (a == 5) strcat(m, five);
    if (a == 6) strcat(m, six);
    if (a == 7) strcat(m, seven);
    if (a == 8) strcat(m, eight);
    if (a == 9) strcat(m, nine);
}
int f1(char* s)
{
    int m = 0, n;
    char k[3];
    k[0] = s[0];
    k[1] = s[1];
    k[2] = '\0';
    n = Cn_To_Int(k);
    if (n > 1)
    {
        if (n < 10)
            m += n * 10;
        else if (n == 10)
            m += 10;
        k[0] = s[2];
        k[1] = s[3];
        m += (Cn_To_Int(k));
    }
    else
        printf("无法处理输入的数字\n");


        return (m);
}
int f2(char* s)
{
    int m = 0 ,n;
    char k[3];
    k[0] = s[0];
    k[1] = s[1];
    k[2] = '\0';
    n = Cn_To_Int(k);
    if (n > 1 && n < 10)
    {
        m += n * 10;
        k[0] = s[2];
        k[1] = s[3];
        if (Cn_To_Int(k) != 10)
        {
            printf("无法处理输入的数字\n");
        }
        k[0] = s[4];
        k[1] = s[5];
        n = Cn_To_Int(k);
        m += n;
    }
    else
        printf("无法处理输入的数字\n");
        return (m);

}
void output(int i)
{
    int a, b;
    char money[7] = { 0 };
    a = i % 10;
    b = i / 10;
    if (b != 0)
    {
        if (b != 1) Int_To_Cn(money, b);
        strcat(money, ten);
    }
    if (a != 0) Int_To_Cn(money, a);
    if (a == 0 && b == 0)
        strcat(money, zero);
    printf("%s", money);
}

制作编译脚本:

我用windows批处理来写编译的脚本。
首先在桌面上新建了一个记事本,内容是用cd命令找到要编译的文件的位置,然后cl 1.c。
写完后改成bat格式,双击打开。
起先打开后一直闪退,后来查资料后发现因为脚本已经运行完了所以就一闪而过,只要在脚本的末尾加上一个pause,就不会闪退了。
能看到生成了一个名为1.exe的文件。

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

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

制作单元测试:

其实测试过程没有全部做完,不过程序写完已经做了一些测试,没有出现问题,只抽取了两个幸运函数进行测试
单元测试的脚本与编译的脚本类似,但是增加了编译文件之后再运行文件的部分

cd..
cd source
cd repos
cd zuoye2+
cl hanshu.c 
hanshu.exe //更改文件名或目录就可以编译运行不同的文件
pause

测试的程序如下:
1.函数是int Cn_To_Int(char* s),作用是能把汉语数字转换成阿拉伯数字
如果返回正确的数字就显示 pass ,否则显示 !

#include
#include
char zero[] = "零",
one[] = "一",
two[] = "二",
three[] = "三",
four[] = "四",
five[] = "五",
six[] = "六",
seven[] = "七",
eight[] = "八",
nine[] = "九",
ten[] = "十";
int Cn_To_Int(char* s);
int main()
{
    char sz0[] = "零一二三四五六七八九十";
    char sz[3];
    int i;
    for (i = 0; i <= 10;i++)
    {
        sz[0] = sz0[2 * i];
        sz[1] = sz0[2 * i + 1];
        sz[2] = '\0';
        if (i == Cn_To_Int(sz))
        {
            printf("pass\n");
        }
        else
            printf("!\n");
    }
    return 0;
}
int Cn_To_Int(char* s)
{
    if (strcmp(s, zero) == 0) return 0;
    else if (strcmp(s, one) == 0) return 1;
    else if (strcmp(s, two) == 0) return 2;
    else if (strcmp(s, three) == 0) return 3;
    else if (strcmp(s, four) == 0) return 4;
    else if (strcmp(s, five) == 0) return 5;
    else if (strcmp(s, six) == 0) return 6;
    else if (strcmp(s, seven) == 0) return 7;
    else if (strcmp(s, eight) == 0) return 8;
    else if (strcmp(s, nine) == 0) return 9;
    else if (strcmp(s, ten) == 0) return 10;
    else return -1;
}

测试结果:

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

2.函数是int f2(char* s)。
作用是处理三个汉字组成的数。
测试数据为"五十五", "二二二", "二十四", "一十七"。

#include
#include
char zero[] = "零",
one[] = "一",
two[] = "二",
three[] = "三",
four[] = "四",
five[] = "五",
six[] = "六",
seven[] = "七",
eight[] = "八",
nine[] = "九",
ten[] = "十";
int f2(char* s);
int Cn_To_Int(char* s);
int main()
{
    char w1[] = "五十五", w2[] = "二二二", w3[] = "二十四", w4[] = "一十七";
    if (f2(w1) != 0)
        printf("%d\n", f2(w1));
    if (f2(w2) != 0)
        printf("%d\n", f2(w2));
    if (f2(w3) != 0)
        printf("%d\n", f2(w3));
    if (f2(w4) != 0)
        printf("%d\n", f2(w4));

    return 0;
}
int f2(char* s)
{
    int m = 0, n;
    char k[3];
    k[0] = s[0];
    k[1] = s[1];
    k[2] = '\0';
    n = Cn_To_Int(k);
    if (n > 1 && n < 10)
    {
        m += n * 10;
        k[0] = s[4];
        k[1] = s[5];
        n = Cn_To_Int(k);
        m += n;
        k[0] = s[2];
        k[1] = s[3];
        if (Cn_To_Int(k) != 10)
        {
            printf("无法处理输入的数字\n");
            m = 0;
        }
    }
    else
        printf("无法处理输入的数字\n");
    return (m);

}
int Cn_To_Int(char* s)
{
    if (strcmp(s, zero) == 0) return 0;
    else if (strcmp(s, one) == 0) return 1;
    else if (strcmp(s, two) == 0) return 2;
    else if (strcmp(s, three) == 0) return 3;
    else if (strcmp(s, four) == 0) return 4;
    else if (strcmp(s, five) == 0) return 5;
    else if (strcmp(s, six) == 0) return 6;
    else if (strcmp(s, seven) == 0) return 7;
    else if (strcmp(s, eight) == 0) return 8;
    else if (strcmp(s, nine) == 0) return 9;
    else if (strcmp(s, ten) == 0) return 10;
    else return -1;
}

测试结果:

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

添加功能

想了很久不知道该怎么做,在主函数里添加

char file[100];
scanf("%s",file); 
freopen(file,"r",stdin);

后可以输入txt文件名输出结果,如图:

txt文件内容:
面向对象程序设计寒假作业2_第13张图片

但是好像不合题意,因为要输入回车而不是空格。
踩坑:txt文件要用ANSI编码方式,否则不能运行。

立个flag:下次交作业不最后一天再交!!

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