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

这个作业属于哪个课程 数学与计算机科学学院2020年面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业3
这个作业的目标 1.继续完成编程题 2.发布博客
其他参考文献 https://blog.csdn.net/qq_42978418/article/details/89636029

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

继续完成作业二的编程题。
优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。

编程题要求:

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

  • 我想要使输入数字的范围增加到0~99
    所以我把原来输入中的string换成了char
    两位数以内有一个汉字(0~9),两个汉字(n10,10+m),三个汉字(n10+m)三种情况,所以我又定义了三个函数Trans_1,Trans_2,Trans_3分别处理这三种情况
    • Trans_1如下,与上次作业中的基本一样;
int Trans_1(string cn1)
{
    int i;
    for (i = 0; i < 10; i++)
    {
        if (cn1 == chinese[i])
            break;
    }
    return i;
}
- Trans_2如下,调用了Trans_1函数,因为我不知道要怎么写,只好非常浪费地再设置一个数组
int Trans_2(string cn2)
{
    int t;
    char copy[20];
    if (cn2[0] == '十')
    {
        copy[0] = cn2[1];
        t = Trans_1(copy)+10;
    }
    else if (cn2[1] == '十')
    {
        copy[0] = cn2[0];
        t = Trans_1(copy)*10;
    }
    return t;
}
- Trans_3如下
int Trans_3(string cn3)
{
    int t;
    char copy1[20], copy2[20];
    copy1[0] = cn3[0], copy2[0] = cn3[2];
    t = Trans_1(copy1) * 10 + Trans_1(copy2);
    return t;
}
  • 原来的Transform函数和主函数也做了一些修改
    • Transform函数如下
int Transform(string s)
{
    int i, j,  t;
    char copy[20];
    for (i = 0; i <= 10; i++)
    {
        if (s[i] == ' ')
            break;
    }
    if (s[0] == '负')
    {
        for (j = 0; j < i; j++)
        {
            copy[i] = s[i + 1];
        }
        if (i == 2)
            t = -1 * Trans_1(copy);
        else if (i == 3)
            t = -1 * Trans_2(copy);
        else if (i == 4)
            t = -1 * Trans_3(copy);
        return t;
    }
    else
    {
        if (i == 1)
            t = Trans_1(copy);
        else if (i == 2)
            t = Trans_2(copy);
        else if (i == 3)
            t = Trans_3(copy);
    }
    return t;
}
- 主函数如下
int main()
{
    string s1, s2, s3, s4, s5, s6, s7;
    char num1[20], num2[20];
    cin >> s1 >> s2 >> s3 >> num1[20];
    if (s1 == "整数" && s3 == "等于")
        g_sum = Transform(num1);
    do {
        cin >> s5 >> s6;
        if (s5 == s2 && s6 == "增加" || s5 == s2 && s6 == "减少")
        {
            cin >> num2[20];
            Operate(s6, num2);
        }
        else if (s5 == "看看" && s6 == s2)
        {
            Output();
            break;
        }
        else //if (s5 == "看看" && s6 != s2)
            cout << "error!" << endl;
    } while (1);
}
  • 但是我尝试运行的时候,Transform函数中调用Trans_1,Trans_2,Trans_3的语句显示找不到标识符
    于是我搜索了一下,发现出现原因是该函数调用的函数定义在该函数之前,所以找不到标识符(如果我的理解没错的话)
    所以我把Transform函数调到这三个函数之前,这些错误就消失了
    完整代码如下
#include<iostream>
#include<string>
using namespace std;
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" };
int g_sum;

int Trans_1(string cn1)
{
    int i;
    for (i = 0; i < 10; i++)
    {
        if (cn1 == chinese[i])
            break;
    }
    return i;
}
int Trans_2(string cn2)
{
    int t;
    char copy[20];
    if (cn2[0] == '十')
    {
        copy[0] = cn2[1];
        t = Trans_1(copy)+10;
    }
    else if (cn2[1] == '十')
    {
        copy[0] = cn2[0];
        t = Trans_1(copy)*10;
    }
    return t;
}
int Trans_3(string cn3)
{
    int t;
    char copy1[20], copy2[20];
    copy1[0] = cn3[0], copy2[0] = cn3[2];
    t = Trans_1(copy1) * 10 + Trans_1(copy2);
    return t;
}
int Transform(string s)
{
    int i, j,  t;
    char copy[20];
    for (i = 0; i <= 10; i++)
    {
        if (s[i] == ' ')
            break;
    }
    if (s[0] == '负')
    {
        for (j = 0; j < i; j++)
        {
            copy[i] = s[i + 1];
        }
        if (i == 2)
            t = -1 * Trans_1(copy);
        else if (i == 3)
            t = -1 * Trans_2(copy);
        else if (i == 4)
            t = -1 * Trans_3(copy);
        return t;
    }
    else
    {
        if (i == 1)
            t = Trans_1(copy);
        else if (i == 2)
            t = Trans_2(copy);
        else if (i == 3)
            t = Trans_3(copy);
    }
    return t;
}
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;
    char num1[20], num2[20];
    cin >> s1 >> s2 >> s3 >> num1[20];
    if (s1 == "整数" && s3 == "等于")
        g_sum = Transform(num1);
    do {
        cin >> s5 >> s6;
        if (s5 == s2 && s6 == "增加" || s5 == s2 && s6 == "减少")
        {
            cin >> num2[20];
            Operate(s6, num2);
        }
        else if (s5 == "看看" && s6 == s2)
        {
            Output();
            break;
        }
        else //if (s5 == "看看" && s6 != s2)
            cout << "error!" << endl;
    } while (1);
}
  • 解释

单元测试:对每一个函数进行测试,这代表了你需要把代码分到不同的文件,使用不同的主函数切换测试/运行。
编译脚本:运行该脚本后无需任何输入就能自动编译全部代码,并输出编译结束的代码。
测试脚本:运行该脚本后可以自动的编译并运行所有测试样例,并输出测试结果。

posted @ 2020-02-16 22:57  SCP-033  阅读(270)  评论(0编辑  收藏  举报