寒假作业三

作业描述 详情
这个作业属于哪个课程 2020福大面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业三
这个作业的目标 a.继续完成作业二的编程题;
b.优化架构,思考代码的拓展性;
c.参考现有的编程语言,加入部分语言内容,
如:选择、循环语句、函数、或扩大数值范围;
作业正文 寒假作业三
其他参考文献 markdown代码优化switch

编程题

编程题要求:

  • 读题,提取出题目的要求。
  • 分解需求,把需求分解为几个模块。
  • 思考每个模块如何编写。
  • 查阅资料。
  • 对每个模块设计测试用例。

思考

1.需考虑输入输出转换,以及计算过程的实现。

2.在作业二的基础上扩大数值范围,增加负数。

3.代码规范优化

4.代码问题:数值范围仍然较小

程序划分

  • 汉字转换过程:通过三个函数实现

            1.char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };作为转换桥梁
    
            2.通过judge函数判断数值正负,并调用convert0函数,最终返回输入数值对应阿拉伯数字
    
            2.通过convert0函数分情况拆分输入数值,调用convert0转换成数字。
    
            3.通过convert1函数把单个数值转换成数字。
    
            4.其中借助strcmp函数和strlen函数实现转换和情况拆分。
  • 运算过程:通过opera函数实现

            1.完成运算操作的输入。
    
            2."增加""减少""乘以""除以"的运算。
  • 运算结果输出过程:通过output函数实现

            1.完成正负判断
    
            2.借助num字符串转换输出汉字
  • 主函数:进行部分数据的输入,输出,以及函数调用

增加负数

在作业二的基础上增加一个judge函数:对正负进行判断,并返回对应阿拉伯数字

输出部分也独立出来,增加一个output函数

judge函数如下:

int judge(char y[])
{
    using namespace std;
    char j[20], k[20];
    k[0] = y[0];
    k[1] = y[1];
    k[2] = '\0';

    if (strcmp(k, "负") != 0){
        return convert0(y);
    }   
    else {
        j[0] = y[2];
        j[1] = y[3];
        j[2] = y[4];
        j[3] = y[5];
        j[4] = y[6];
        j[5] = y[7];
        j[6] = '\0';
        return (-1) * convert0(j);
    }
}

代码优化

  • 函数之间应该用空行分开;

  • 用空行将代码按照逻辑片断划;

  • if 、for 、do、while 、case、switch、defaul 等语句自占一行,且if 、for 、do、while等语句的执行语句部分无论多少都要加括号{};

  • 函数头部应进行注释,列出函数的目的/功能、输入参数、输出参数、返回值等。

    例如:

     /*
     Description:    // 函数功能、性能等的描述 
     Input:          // 输入参数说明,包括每个参数的作用、取值说明及参数间关系。 
     Output:         // 对输出参数的说明。 
     Return:         // 函数返回值的说明 
     Others:         // 其它说明
     */
  • 尽可能的使用位运算来代替常规的乘法、除法、除余运算。

    优先级: 位运算 -> 自增减运算 -> 加减法运算 -> 乘法运算 -> 除法运算 ->求余运算

    例如:

      s = b / 4; 可以替换为 s = b >> 2;
      s = b % 4; 可以替换为 s = b & 3;
      s = b * 3; 可以替换为 s = b << 1 + b;
      s = s + b; 可以代替位 s += b;
      s = s * b; 可以代替位 s *= b;
      s = s / b; 可以代替位 s /= b;
  • if 是每一个分支语句都去做一次判断的,影响了代码的运行效率
    可以使用switch代替if语句。

完整代码

#include<iostream>
#include<string>
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
int integer = 0;

/*
功能:将单个汉字数值转换成阿拉伯数字
参数:wen为需要转换的单个汉字数值
返回值: 转换后的阿拉伯数字
*/
int convert1(char wen[])
{
    using namespace std;
    int z,i=0;
    for (z = 0; z < 11; z++) {//利用for循环找到汉字数值对应的阿拉伯数字
        if (strcmp(num[z], wen) == 0) {
            return z;
            i++;
            break;
        }
    }
    if (i == 0) {//i==0说明找不到对应数字,输入的数值错误
        cout << "输入的数值错误";
    }
}

/*
功能:分解每个数位上的数,通过调用convert1函数转换成阿拉伯数字
参数:wen为需要转换的汉字数值 
返回值: 数值转换后的阿拉伯数字
*/
int convert0(char wen[])
{
    using namespace std;
    char c[10], d[10];//c,d用来暂时储存汉字数值部分数位上的数
    int l = strlen(wen);
    switch (l) {//利用switch语句分情况对数值进行拆分转换

        case 2:return convert1(wen); break;//十以内的数值转换

        case 4: {//十几或几十的数值转换
            c[0] = wen[2];
            c[1] = wen[3];
            c[2] = '\0';//储存个位数

            if (convert1(c) != 10) {
                return convert1(c) + 10;
            }
            else {
                c[0] = wen[0];
                c[1] = wen[1];
                c[2] = '\0';//储存十位数
                return 10 * convert1(c);
            }
        }; break;

        case 6: {
            c[0] = wen[4];
            c[1] = wen[5];
            c[2] = '\0';//储存十位数
            d[0] = wen[0];
            d[1] = wen[1];
            d[2] = '\0';//储存个位数
            return 10 * convert1(d) + convert1(c);
        }; break;

        default:cout << "输入的数值超出范围"; break;
    }    
}

/*
功能:判断输入数值的正负,并返回转换后的阿拉伯数字,期间通过调用
     convert0函数得到数值绝对值转换后的阿拉伯数字
参数:y为输入的汉字数值
返回值: 输入数值对应的阿拉伯数字
*/
int judge(char y[])
{
    using namespace std;
    char j[20], k[20];
    k[0] = y[0];
    k[1] = y[1];
    k[2] = '\0';//储存输入数值的第一个字

    if (strcmp(k, "负") != 0){
        return convert0(y);
    }   
    else {
        j[0] = y[2];
        j[1] = y[3];
        j[2] = y[4];
        j[3] = y[5];
        j[4] = y[6];
        j[5] = y[7];
        j[6] = '\0';//去掉第一个字--“负”,保留绝对值数值
        return (-1) * convert0(j);
    }
}

/*
功能:进行运算操作,得到最终运算结果
参数:x为运算操作对象
*/
void opera(char x[])
{
    using namespace std;
    char m[20], n[20], s[20];//m为每次操作的运算对象,n为运算方式,s为运算变化值
    while (1) {
        cin >> m;

        if (strcmp(m, "看看") == 0){//当m为“看看”时,运算结束
            break;
        }
        
        if (strcmp(m, x) != 0) {
            cout << "输入的运算对象错误" << endl;
            break;
        }

        cin >> n >> s;

        if (strcmp(n, "增加") == 0){
            integer += judge(s);
        }   
        else if (strcmp(n, "减少") == 0){
            integer -= judge(s);
        }
        else if (strcmp(n, "乘以") == 0){
            integer *= judge(s);
        }   
        else if (strcmp(n, "除以") == 0&&strcmp(s,"零")!=0) {
            integer /= judge(s);
        }   
        else {
            cout << "输入的运算操作错误" << endl;
            break;
        }
    }
}

/*
功能:输出运算结果对应的汉字数值
参数:integer为运算结果,是阿拉伯数字
*/
void output(int integer)
{
    using namespace std;
    if (integer < 0) {//判断正负,若为负数,先输出“负”,再对绝对值进行转换
    cout << "负";
    integer = -integer;
    }

    if (integer >= 0 && integer < 11){
        cout << num[integer];
     }
    else if (integer > 11 && integer < 20){
        cout << "十" << num[integer % 10];
     }
    else if (integer > 19 && integer % 10 == 0){
        cout << num[integer / 10] << "十";
     }      
    else if (integer > 19 && integer % 10 != 0) {
        cout << num[integer / 10] << "十" << num[integer % 10];
     }
}

//进行部分数据的输入,输出,以及函数调用
int main(void)
{
    using namespace std;
    char a[20], x[20], b[20], y[20], h[20];
    cin >> a >> x >> b >> y;

    if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0) {
        cout << "输入错误" << endl;
    }   

    integer = judge(y);
    opera(x);
    cin >> h;

    if (integer > 99 || integer < -99) {
        cout << "运算结果超出范围";
    }
    else {
        output(integer);
    }
    return 0;
}

编译脚本以及测试脚本

1.编译脚本
同作业二

@echo off
set line=----------------------------------------------------------------------------------------------------------------------
echo 输入文件所在路径
set /p b=
cd "%b%"
echo 输入文件名
set /p c=
echo %line%
echo 编译开始
cl "%c%"
echo %line%
if exist "guwen.exe" echo 编译成功
if not exist "guwen.exe" echo 编译失败
pause

2.测试脚本

这里就测试新增的judge函数

测试代码如下:

#include<iostream>
#include<string>
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
int integer = 0;

int convert1(char wen[])
{
    using namespace std;
    int z, i = 0;
    for (z = 0; z < 11; z++) {
        if (strcmp(num[z], wen) == 0) {
            return z;
            i++;
            break;
        }
    }
    if (i == 0) {
        cout << "输入的数值错误";
    }
}

int convert0(char wen[])
{
    using namespace std;
    char c[10], d[10];
    int l = strlen(wen);
    switch (l) {

    case 2:return convert1(wen); break;

    case 4: {
        c[0] = wen[2];
        c[1] = wen[3];
        c[2] = '\0';

        if (convert1(c) != 10) {
            return convert1(c) + 10;
        }
        else {
            c[0] = wen[0];
            c[1] = wen[1];
            c[2] = '\0';
            return 10 * convert1(c);
        }
    }; break;

    case 6: {
        c[0] = wen[4];
        c[1] = wen[5];
        c[2] = '\0';
        d[0] = wen[0];
        d[1] = wen[1];
        d[2] = '\0';
        return 10 * convert1(d) + convert1(c);
    }; break;

    default:cout << "输入的数值超出范围"; break;
    }
}

int judge(char y[])
{
    using namespace std;
    char j[20], k[20];
    k[0] = y[0];
    k[1] = y[1];
    k[2] = '\0';

    if (strcmp(k, "负") != 0) {
        return convert0(y);
    }
    else {
        j[0] = y[2];
        j[1] = y[3];
        j[2] = y[4];
        j[3] = y[5];
        j[4] = y[6];
        j[5] = y[7];
        j[6] = '\0';
        return (-1) * convert0(j);
    }
}

int main(void)
{
    using namespace std;
    int x[20] = { -7,17,-70,77};
    char y[17][10] = { "负七","十七","负七十","七十七"};
    int i, j = 0, h = 0;
    for (i = 0; i < 4; i++) {
        if (x[i] == judge(y[i])) {
            cout << y[i] << "       测试成功" << endl;
            h++;
        }
        else
            cout << y[i] << "   测试失败,为异常测试数据" << endl;
    }
    cout << endl;
    if (h == 4)
        cout << "测试通过,无异常数据" << endl;
    else cout << "出现异常测试数据" << endl;
    return 0;
}

测试脚本:

@echo off
title 单元测试:judge函数
set line=----------------------------------------------------------------------------------------------------------------------
cd "C:\Users\Q sea\source\repos\judge\judge"
cl judge.cpp
echo %line%
echo 测试开始
judge.exe
echo %line%
pause

猜你喜欢

转载自www.cnblogs.com/19xaQ/p/12301335.html