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

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业的要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 1、学习git的创建仓库和上传代码;2、优化代码并且可以优雅地命名;3、学习window批处理
作业正文 2020面向对象程序设计寒假作业2
其他参考文献 freopen函数;C++语言程序设计基础;windows批处理教程;创建仓库;commit和push

首先读题吧!

编程题(请使用C语言或者C++完成以下题目):
• 继续完成作业一的编程题。
• 优化架构,一般要求每个函数长度不超过15行。
• 优化规范,尤其是命名规范。
• 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
• 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
• 在作业一编程题的基础上添加以下功能:
o 通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
o 假设我的1.txt内容如下:
• 整数 钱包 等于 零
• 钱包 增加 四
• 钱包 减少 三
看看 钱包
o 输入lang 1.txt后,命令行输出一。

一、关于代码!要求:把作业一的编程题优化,首先要把每个函数的长度控制在15行以内,其次是命名要规范。

我要解决的就是函数长度问题和命名的问题(main(主函数),transform(转化),process(步骤),output(输出),这是第二个要求,命名,我也不晓得我这样命名专不专业!),自己代码太长了,要思考更好的写法。这一次我想尝试用C++来写,原因是我觉得String类这个应该会有很大的用处,就可不用strcmp函数了,直接用==,output的时候直接用+,这样可太方便了。还有一个就是getline函数!!

首先我初始化了一些东西,主要是用在汉字转化上,

string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "减少";

之后我把整个问题分为了,四个函数来实现,分别是main(主函数),transform(转化),process(步骤),output(输出)。

第一个transform(转化)是汉字转化为阿拉伯数字,这里的想法是运用数组下标对于数字,这在结束的转化里也用到了。

int  transform(string number)
{
    int i;
    for (i = 0;; i++)
    {
        if (number == chinese[i])
        {
            break;
        }
    }
    return i;
}

第二个是钱包的加加减减,函数process(步骤)同样是运用到数组下标的对应。

void process(string first)
{
    string number;
    getline(cin, number);
    if (first == add)
    {
        sum = sum + transform(number);
    }
    else
    {
        sum = sum - transform(number);
    }
}

第三个是output函数,代码比较长,原本想要分两个来函数来写,但是最终还是没分出来,它们之间的变量关系比较紧密,所以超出了几行。

void putout()
{
    int a[10], n, i, t,l;
    string outcome;
    if (sum < 0) cout << "error!";
    else {
        n = sum;
        if (sum <= 10) cout << chinese[sum];
        else {
            for (i = 1; n != 0; i++)
            {
                a[i] = n % 10;
                n = n / 10;
            }
            if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
            if (a[i - 2] == 0) outcome = outcome + "十";
            else {
                for (t = i - 2; t > 0; t--)
                {
                    l = a[t];
                    outcome = outcome + "十" + chinese[a[t]];
                }
            }
            cout << sum << endl << outcome;
        }
    }
}

最后是main函数。大量应用了getline函数,比如最开始“整数 钱吧 等于 零”,三个循环,每次读取字符串到空格,最后分出汉字数字“零”来,这解决了我在第一次作业里的困惑。

int main()
{
    string begin, origin, later, first;int flag = 1;
    for (int i = 1; i <= 3; i++)
    getline(cin, begin, ' ');
    getline(cin, origin);
    sum = transform(origin);
    do {
        getline(cin, later, ' ');
        if (later == "钱包")
        {
            getline(cin, first, ' ');process(first);
        }
        else
        {
            putout();flag = 0;
        }
    } while (flag);
    return 0;
}

完整代码如下:

#include
#include
using namespace std;
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "减少";
int sum;
int  transform(string number)
{
    int i;
    for (i = 0;; i++)
    {
        if (number == chinese[i])
        {
            break;
        }
    }
    return i;
}
void process(string first)
{
    string number;
    getline(cin, number);
    if (first == add)
    {
        sum = sum + transform(number);
    }
    else
    {
        sum = sum - transform(number);
    }
}
void putout()
{
    int a[10], n, i, t,l;
    string outcome;
    if (sum < 0) cout << "error!";
    else {
        n = sum;
        if (sum <= 10) cout << chinese[sum];
        else {
            for (i = 1; n != 0; i++)
            {
                a[i] = n % 10;
                n = n / 10;
            }
            if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
            if (a[i - 2] == 0) outcome = outcome + "十";
            else {
                for (t = i - 2; t > 0; t--)
                {
                    l = a[t];
                    outcome = outcome + "十" + chinese[a[t]];
                }
            }
            cout << sum << endl << outcome;
        }
    }
}
int main()
{
    string begin, origin, later, first;int flag = 1;
    for (int i = 1; i <= 3; i++)
    getline(cin, begin, ' ');
    getline(cin, origin);
    sum = transform(origin);
    do {
        getline(cin, later, ' ');
        if (later == "钱包")
        {
            getline(cin, first, ' ');process(first);
        }
        else
        {
            putout();flag = 0;
        }
    } while (flag);
    return 0;
}

二、有关脚本的那些事!

第一个:编译脚本

我好难啊!
学习过程就不提了!
讲讲我遇到的问题

首先,我的思路的这样的,依次打开(type)文件,直至打开作业二.cpp,然后编译!

可想而知,我遇到了什么!
那就是满屏的代码!!
面向对象程序设计寒假作业2_第1张图片

之后,我就仔细想想,这不太行,会不会是只要打开路径就好,在作业二.cpp所在的文件夹就行。
于是我就是试了试!
没想到,满屏代码消失了,却出现了令我闻风丧胆,看了就吐的这一段话!
<
'gcc' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
又又又找不到gcc了!!
我该怎么办,也只能百度了,于是可爱的网友告诉我要以下这样写!
面向对象程序设计寒假作业2_第2张图片

但是,就在我开心的转圈圈的时候!!gcc它竟然找不到作业二.cpp了
所以!
我试了一遍又一遍都搞不定它,所以我只好灵机一动,把作业二.cpp复制在了脚本的文件夹了,然后成功了!!
哈哈哈!!
面向对象程序设计寒假作业2_第3张图片

第二个:测试脚本

我开始因为是写一个批处理文件然后就相当于一个程序来测试,然后参考了其他同学的作业,才发现是,重新写一个.cpp来测试,测试脚本只是来运行它的??希望我的理解没有错。
首先根据我自己的代码吧,我觉得只有output函数最需要测试,这也是自己在写代码的时候修改最多的。
根据这个函数的性质,我的测试程序的功能是,输入一个数字(当然这个数字在0~99之间),得到正常的对应汉字可判断。
这很像在学习写作业的提交反馈哦。
我的测试代码:

#include
using namespace std;
int sum;
string b[10] = { "九","十","二十","十五","九十九","三十五","六十六","十一","零","一" };
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "减少";
string output()
{
    int a[10], n, i, t, l;
    string outcome;
    if (sum < 0) cout << "error!";
    else {
        n = sum;
        if (sum <= 10) outcome=chinese[sum];
        else {
            for (i = 1; n != 0; i++)
            {
                a[i] = n % 10;
                n = n / 10;
            }
            if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
            if (a[i - 2] == 0) outcome = outcome + "十";
            else {
                for (t = i - 2; t > 0; t--)
                {
                    l = a[t];
                    outcome = outcome + "十" + chinese[a[t]];
                }
            }

        }
    }
    return outcome;
}
int main()
{
    
    string output();
    int a[10] = {9,10,20,15,99,35,66,11,0,1},i;
    for (i = 0; i < 10; i++)
    {
        sum = a[i];
        if (output() == b[i])
            cout << "pass" << endl;
        else
            cout << "error" << endl;
        
        
    }


}

我的测试脚本和截图:

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

三、添一些功能?!

添加功能!
我看到题目的时候是惊呆的状态!这样可以??可以用代码写出来的??竟然要打开一个txt。
然后通过大佬的提示用freopen函数来写就好。于是粗粗看过百度对这个函数用法的介绍,我就上场写了,没想到,竟然成了!
我的代码:

int main()
{
    string begin, origin, later, first;int flag = 1;
    freopen("D:\\window批处理学习\\cin.txt","r" , stdin);
    for (int i = 1; i <= 3; i++)
    getline(cin, begin, ' ');
    getline(cin, origin);
    sum = transform(origin);
    do {
        getline(cin, later, ' ');
        if (later == "钱包")
        {
            getline(cin, first, ' ');process(first);
        }
        else
        {
            putout();flag = 0;
        }
    } while (flag);
    return 0;
}

结果:

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

创建仓库和上传代码!

首先,我先从群里下载了,GitHubdesktop,然后创建了自己的仓库
步骤如下
第一步在D盘新建一个文件夹,取名git
第二步点击软件页面菜单栏file后选择第一个new repository
第三步选择创建位置为文件夹git,取一个你喜欢的名字
第四步创建完成!
之后把你整理好的代码文件夹放在你新创建的仓库里!
之后就是commit(填写summary之后点击左下角)
面向对象程序设计寒假作业2_第6张图片

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

ok了!

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

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