软件工程第二次结对作业

一、题目要求

我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:

(1)能够自动生成四则运算练习题
(2)可以定制题目数量
(3)用户可以选择运算符
(4)用户设置最大数(如十以内、百以内等)
(5)用户选择是否有括号、是否有小数
(6)用户选择输出方式(如输出到文件、打印机等)
(7)最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二、任务分配
此次结对作业的任务分配为:
驾驶员:赵一霖,负责编写代码,对同伴做出评价
领航员:林天成,辅助驾驶员完成代码,设计单元测试用例,对同伴做出评价
三、代码内容

1、代码上传

本次作业代码已上传Here

2、代码具体模块介绍

整个代码共由以下函数构成:
1650347-20190505172950758-1506218924.png
①、类的声明

class Solve
{
private:
    char *cst;
    float *fst;
    int cp, fp;              //当前数组的长度
    static int table[7][7];  //算数优先符号表
protected:
    int compare(char a, char b);
    /* 在这里比较运算符的优先次序如a 为新输入操作符, b 为后输入操作符, 如果 a > b
    返回 1, 如果 a = b 返回0; 如果 a < b, 返回 1 */
    void computer(char c);
    /* 从操作数栈里取出两数进行 c 运算,并把结果入栈*/
    int getodr(char c);  //获取操作符在table表中的下标;
public:
    Solve();
    void isolve();
    ~Solve();
    void getNum(float c);     //获取相应长度
    void getCh(char c);     //获取相应字符压入栈
    float getRes();
};

②、读取算式

void Solve::getCh(char c)           // c 为新得到的字符;
{
    if (cp == 0 && c == '#')        //接受第一个字符 '#'
    {
        cst[cp++] = c;
    }
    else                            //若输入的是加减乘除'#';
    {
        char u = cst[cp - 1];       // u 栈顶字符
        if (compare(c, u) == 1)     //新输入的优先级大于栈顶
        {
            cst[cp++] = c;
        }
        else if (compare(c, u) == 0) // 新输入优先级小于栈顶
        {
            if (u == '(' && c == ')' || u == '#' && c == '#')
            {
                cp--; //将左括号移出去;
            }
            else
            {
                printf("priority 0 error");
            }
        }
        else if (compare(c, u) == -1) //新输入优先级等于小于栈顶
        {
            do
            {
                cp--;
                computer(u);            //拿出栈顶符号去计算
                u = cst[cp - 1];        //新的栈顶符号
            } while (compare(c, u) == -1);
            //直到栈顶符号优先级不高于 最新输入的操作符优先级,跳出循环
            if (u == '(' && c == ')' || u == '#' && c == '#') //如果优先级相等,就拿出去;
            {
                cp--; //将左括号移出去;
            }
            else                     //如果新输入操作符优先级高,则放入;
            {
                cst[cp++] = c;
            }
        }
        else
        {
            printf("error\n");
        }
    }
}

③、计算函数

void Solve::computer(char c)
{
    float a, b;
    float res;
    b = fst[--fp];
    a = fst[--fp];
    if (c == '*')
    {
        res = a * b;
    }
    else if (c == '/') //除数为0是不被允许的,这里当除数为时当1处理,防止程序崩溃;
    {
        if (b == 0)
        {
            res = a;
        }
        else
        {
            res = 1.0 * a / b;
        }
    }
    else if (c == '+')
    {
        res = a + b;
    }
    else if (c == '-')
    {
        res = a - b;
    }
    else
    {
        printf("computer error having excepted opr");
    }
    fst[fp++] = res; //将计算成功的结果返回堆栈;
}

3、代码测试

①、整数加法
1650347-20190505180049910-1099289903.png

②、整数减法
1650347-20190505180130887-1595940077.png

③、整数乘法
1650347-20190505180208310-2050970546.png

④、整数除法
1650347-20190505180251150-1472347267.png

⑤、整数混合运算
1650347-20190505180329333-1300380083.png
⑥、小数的运算
同理,小数的加减乘除运算可通过选择是否有小数来实现。
四、评价队友及总结
通过几天晚上的编写代码,在五一放假前代码就已写好并上传,这多亏了我的队友一直在催我(翻白眼)哈哈哈哈,让我可以提前的完成老师布置的任务。我觉得这是他身上很大的一个优点,就是做什么是都赶早不赶晚,像我就很能拖(当然也是有那么一丢丢原因的嘛)。
通过编写代码,我也了解到了自己的一些不足,例如说命名时习惯用汉语拼音、不够规范、不能让其他看代码的人一下子明白我代码的意思;考虑的方面少,像临界的值、特殊值,就本代码来说就是除法时分母为0的情况,为了不让结果报错,强制将分母为0时当成分母为1了,以防出现无法运行的情况;内存的申请和释放不够合理,本代码堆栈部分是按照固定长度申请内存,所以当内存不够分配时,内存申请会出现错误,我们未对错误做出改变,因为如果改成动态分配,内存不够时也会报错;但是由于同伴的存在,一部分小问题在编写代码互相讨论的过程中已经改正过来了。在代码测试的时候,我将代码发给他之后,他就开始进行测试用例的设计了,由于代码中ifelse语句过多,我们采用的测试方法实现了语句覆盖,发现代码可以正常运行没有什么错误。美中不足的是它没有人那么智能,由于生成的算式中的数字是随机的,所以无法保证整数运算后最终结果是否还为整数。还有就是没有生成图形化界面,与用户的交互性较差,只有有这个Visual Studio软件才可以运行这段代码,不能普遍的使用。由于上传的较早,上传的代码是不可以输出到文件的,但是后来我觉得还是输出到文件好一点,就加了几句话,所以可以实现保存为文件的形式。如下图。
1650347-20190505194310262-1929615498.png

通过这次结对编程我了解到两个人的共同合作可以使代码更加完善,一个人的能力或许不够,但两个人共同努力就一定可以完成!

转载于:https://www.cnblogs.com/zhaoyilin0728/p/10813586.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值