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

这个作业属于哪个课程 数学与计算机科学学院2020年面向对象程序设计.
这个作业要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 1.继续完成编程题 2.新建一个github仓库,并把作业推送到该仓库 3.发布博客
其他参考文献 https://www.cnblogs.com/zouzou-1/p/12253815.html windows下如何将创建bat批处理脚本? 环境变量如何修改

实践题

  • 新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
    2020面向对象程序设计寒假作业2 题解_第1张图片
    2020面向对象程序设计寒假作业2 题解_第2张图片

  • 请使用.gitignore文件忽略不要上传的文件。用法自行百度。

编程题(请使用C语言或者C++完成以下题目):

继续完成作业一的编程题。
1.优化架构,一般要求每个函数长度不超过15行。
2.优化规范,尤其是命名规范。
3.制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。

编程题要求:

1.读题,提取出题目的要求。
2.分解需求,把需求分解为几个你觉得不太相关的模块。
3.思考每个模块怎么写,可以从简单的模块开始写。
4.对于不会的问题进行查阅资料。
5.对于每一个模块设计测试用例。
6.详细记录下以上每一步,并写在博客中。
7.不要求完全做出来,但要求记录详细。
8.建议博客长度不少于1000字(不包含代码)。

示例脚本:

gcc 1.cpp -o lang.exe

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

gcc 1.cpp test.cpp -o test.exe
test

-在作业一编程题的基础上添加以下功能:
-通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
-假设我的1.txt内容如下:

整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包

输入lang 1.txt后,命令行输出

因为要把函数长度缩减到十五行以内,故借鉴了其他同学的代码
为了规范命名,我搜索了一下,大致如下:

1.变量全部小写,单词之间可以加_,也可以不加,不要大小写混合
全局变量可以加前缀g_以与局部变量区分
2.函数分为普通函数和存取函数
普通函数以大写字母开头,每个单词首字母大写,无下划线
存取函数:要求与变量名匹配(TODO)
3.类
包含头文件的顺序:C系统文件,C++系统文件,第三方头文件
举个例子,写OpenCV工程的时候,先写 这些C++系统头文件,然后再包含(现在还看不懂是什么东西)

所以,我的代码中包含了4个函数,分布用于将汉字转化为数字进行计算,判断加或减的操作,将数字转化为汉字输出,主函数用于输入输出及错误判断:

int Transform(string s)
void Operate(string a,string b)
void Output()
int main()

首先定义一个包含零到十几个汉字的字符串用于转换,相比于之前枚举的方法,极大的减少了代码量;

string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" };
int Transform(string s)
{
    int i;
    for (i = 0; i <= 10; i++)
    {
        if (s == chinese[i])
            break;
    }
    return i;
}

其次用一个函数判断增加或减少,在我看来和之前用strcmp(···)==0的方法差不多,但是写起来简便得多

void Operate(string a,string b)
{
    if (a == "增加")
        g_sum = g_sum + Transform(b);
    else if (a == "减少")
        g_sum = g_sum - Transform(b);
}

然后用一个函数将数字转化为汉字输出,考虑到平时说话习惯,把1~99分为1~10,10n,10+m(1<=m<=9)和10n+m(1

void Output()
{
    int i,m=g_sum%10,n=g_sum/10;
    if (g_sum < 0)
        cout << "出现财政赤字" << endl;
    else if (g_sum >= 0 && g_sum <= 10)
        cout << chinese[g_sum] << endl;
    else if (g_sum > 10 && m == 0)
        cout << chinese[n] << "十" << endl;
    else if (g_sum >= 11 && g_sum <= 19)
        cout << "十" << chinese[m] << endl;
    else if (g_sum > 20 && m != 0)
        cout << chinese[n] << "十" << chinese[m] << endl;
}

最后写主函数用于输入输出,还要针对错误的输入设置特别的输出,最后超出了几行

int main()
{
    string s1, s2, s3, s4, s5, s6, s7;
    cin >> s1 >> s2 >> s3 >> s4;
    if (s1 == "整数" && s3 == "等于")
        g_sum = Transform(s4);
    do {
        cin >> s5 >> s6;
        if (s5 == s2 && s6 == "增加" || s5 == s2 && s6 == "减少")
        {
            cin >> s7;
            Operate(s6, s7);
        }
        else if (s5 == "看看" && s6 == s2)
        {
            Output();
            break;
        }
        else //if (s5 == "看看" && s6 != s2)
            cout << "error!" << endl;
    } while (1);
}

加上头文件和定义的全局变量等,完整代码如下:

#include
#include
using namespace std;
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" };
int g_sum;
int Transform(string s)
{
    int i;
    for (i = 0; i <= 10; i++)
    {
        if (s == chinese[i])
            break;
    }
    return i;
}
void Operate(string a,string b)
{
    if (a == "增加")
        g_sum = g_sum + Transform(b);
    else if (a == "减少")
        g_sum = g_sum - Transform(b);
}
void Output()
{
    int i,m=g_sum%10,n=g_sum/10;
    if (g_sum < 0)
        cout << "出现财政赤字" << endl;
    else if (g_sum >= 0 && g_sum <= 10)
        cout << chinese[g_sum] << endl;
    else if (g_sum > 10 && m == 0)
        cout << chinese[n] << "十" << endl;
    else if (g_sum >= 11 && g_sum <= 19)
        cout << "十" << chinese[m] << endl;
    else if (g_sum > 20 && m != 0)
        cout << chinese[n] << "十" << chinese[m] << endl;
}
int main()
{
    string s1, s2, s3, s4, s5, s6, s7;
    cin >> s1 >> s2 >> s3 >> s4;
    if (s1 == "整数" && s3 == "等于")
        g_sum = Transform(s4);
    do {
        cin >> s5 >> s6;
        if (s5 == s2 && s6 == "增加" || s5 == s2 && s6 == "减少")
        {
            cin >> s7;
            Operate(s6, s7);
        }
        else if (s5 == "看看" && s6 == s2)
        {
            Output();
            break;
        }
        else //if (s5 == "看看" && s6 != s2)
            cout << "error!" << endl;
    } while (1);
}

不过这个代码只能支持输入0~10,输出0~99,且不能同时出现多个变量同时进行运算

接下来要制作一个编译脚本,运行该脚本可以编译我的代码
我选择了Windows批处理

根据windows下如何将创建bat批处理脚本?
首先要在指定文件夹下新建一个文本文档
2020面向对象程序设计寒假作业2 题解_第3张图片
用文本编辑器打开该文本,在该文本中输入命令,然后将该文件重命名为以bat为扩展名
2020面向对象程序设计寒假作业2 题解_第4张图片
2020面向对象程序设计寒假作业2 题解_第5张图片
可见该文件类型已变成Windows批处理文件
双击即可运行

-看到群里说到需要设置环境变量,path里其中一个文件地址必须指向安装的目录mingw32/bin下,要把gcc程序所在的目录加到环境变量,虽然不知道为什么要这样,这样有什么用处,但是还是百度了一下环境变量如何修改

根据网上所说,环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文件夹位置等。这点有点类似于DOS时期的默认路径,当你运行某些程序时除了在当前文件夹中寻找外,还会到设置的默认路径中去查找。简单地说这里的“Path”就是一个变量,里面存储了一些常用命令所存放的目录路径。

  • 要修改环境变量,需要:
    • 点击“我的电脑”,选择属性。
    • 找到并打开“高级系统配置”。在接下来的页面中点击“高级系统配置”,打开“系统属性”窗口。
    • 找到“环境变量”按钮并点击。
    • 环境变量窗口。在环境变量窗口中一般有两个变量,一个是你当前所使用的用户独有的环境变量,另一个是所有用户都可以访问的系统变量。其实如果在你的电脑上你只使用一个用户的话,那么不管你 修改的用户的环境变量还是系统变量,效果都是一样的。为了以防未来会新建其他用户,那么我建议你修改系统变量而不是某个用户独有的环境变量。
    • 在系统变量显示框中找到变量path,选中并点击编辑进行修改。path变量告诉系统, 当要求系统运行一个程序而没有告诉它程序所在的完整路径时, 系统除了在当前目录下面寻找此程序外, 还应到path变量指定的目录下去寻找。一般我们修改环境变量时如果没有指定具体的变量,比如JAVA_HOME时,我们所指的环境变量就是path。
    • 修改完毕之后一定要记得全部点击“确定”才能够保存修改的内容。一个路径和另一个路径之间要记得用分号隔开。三个窗口中的按钮都需要点击“确定”才能保存修改的内容。
      2020面向对象程序设计寒假作业2 题解_第6张图片
  • 要找到gcc程序所在目录mingw32/bin,我在资源管理器中直接搜索了
    2020面向对象程序设计寒假作业2 题解_第7张图片
    然后再path中新建了一个,将这个目录输入了进去
    (然后就不知道要怎么办了......还没有学会)

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