结对编程第二次


这次作业使软件工程结对编程的第二次,我们选做的题目是生成四则运算练习题这道题目,题目要求如下:
1.可以定制题目数量。
2.可以选择运算符。
3.用户设置最大数。
4.是否有括号。
5.是否有小数。
6.输出方式: 输出到文件, 打印机。
7.最好提供图形界面。


这次结对编程,我是驾驶员,在导航员的导航之下,我们迅速的完成了 我们的编程工作,完美满足了前五个要求,输出方式我们选择直接输出到程序控制框,有点遗憾的是的图形界面没做出来。......代码点这里.......


编程历程

开始编程啦,我们刚开始看到这道题目是蒙圈的,要生成四则运算的练习题,还有这么多的附加条件,好麻烦。再说不能光出题目不给结果啊。脑袋里面这些想法一涌而上之后,整个人心态瞬间爆炸,看看旁边的领航员,他也一脸蒙b。
怎么办,到底怎么办,我们告诉自己要冷静,没思路就先不做,(最懒的程序员才最聪明的---只是心理安慰),于是我们就把刚拿起来的题目给抛到了一边。大概过了有几分钟,忽然间灵光一闪。虽然题目要求多,我们也可以先不管要求啊,为什么不能够做出来最基本的,然后再一点点去增加要求,去完善功能呢,正如软件工程所讲的那个增量模型一样。杀鸡也用牛刀。
理清了基本的思路之后,我们驾驶着秋名山86号开始前进,第一步先是去生成一个不带括号,不含有小数的只有加减乘除的多项式,我们也不考虑去计算结果。对于如此简单的问题,当然是迅速完成了。之后我们考虑怎么生成含有括号的,稍加思索后,找到了解决办法,就是有概率在合适位置插入括号,究竟怎么做这里就不说了,尽在代码中。之后,我们又考虑怎么去实现有小数。小数吗,整数数加小数就成了呗,也很so easy。具体怎么做也在代码里有。最后,我们就开始考虑怎么给出每个算式的结果,对于多项式的处理,最简单快捷的就是上一学期讲的算符优先文法了,拿出编译原理的书,找到算符优先文法回顾一遍后,我们定制了适合当前情况的算符优先算法,为了让导航员有个能进行单元测试的东西,我只好把它抽象成了一个计算四则运算多项式的类,当然也是为了方便自己去调用它,因为在前几步的增量中,main函数已经被写的狼狈不堪了。就这样,经过了一阵折腾之后,程序勉强可以跑跑,顺利(侥幸)完成任务。


部分代码

//下面就是函数的主干部分了
while (num--) {
        s1.isolve(); //清空计算器; 
        s1.getCh('#'); // 放入'#' 准备接受算式开始计算;
        float factor = 0;
        cout << order++ << ".     ";
        pos = 0;
        opmax = rand() % 6 + 1;
        kuohao = 0;

        while (opmax--) {  //开始生成多项式;
            bool lf = false;  // 用于表示此次是否生成了左括号
            if (cld1 == 1 && rand() % 8 > 5) {  // 1/8 的概率出现括号; 
                flag = 0;
                cout << '(';
                kuohao++;
                lf = true;
            }
            if (lf) {
                s1.getCh('(');
            }
            factor = rand() % (max-1) + 1  +((rand() % 100)*1.0 / 100)* cld2;
            cout << factor;
            //生成操作数 factor;
            s1.getNum(factor); //操作数放入计算器
            bool rf = false;  //用于表示是否生成了右括号;
            if (cld1 == 1 && kuohao > 0&&flag != 0) {
                if (rand() % 4 > 2) {
                    cout << ')';
                    kuohao--;
                    rf = true;
                }
            }
            if(rf){
                s1.getCh(')');
            }
            //生成操作符 
            pos = rand() % opnum;
            cout << op[pos];

            //将操作符放入计算器;
            s1.getCh(op[pos]);
            
            flag++; 
        }
        factor = rand() % (max-1) + 1 + ((rand() % 100)*1.0 / 100)* cld2;
        cout << factor;
        //将最后一个操作数放入计算器
        s1.getNum(factor);
        while (kuohao--) {
            cout << ')';
            s1.getCh(')');
        }
        //将结尾符号'#'放入计算器;
        s1.getCh('#');
        printf("=?\n");
        //将最终的结果放入结果数组
        resArray[respos++] = s1.getRes();
    }

部分运行结果截图


1342848-20180417213844419-118604104.jpg


1342848-20180417213852502-1247124097.png


心得体会

这次结对编程,不仅让我知道了有些程序看上去有点困难,但是一点点的去写还是能够写出来的。也让我明白了结对编程确实是把复查做到了极致,有一个好的导航员,敲键盘的人是可以少走弯路的,即使对于复杂程序,也可以用很少的调试和debug,就能让程序正常运行,甚至是一边成,大大缩短了开发的周期。


最后放上一张秋名山老司机的合影:

1342848-20180417213901628-90027113.jpg

转载于:https://www.cnblogs.com/lishaopeng123/p/8869776.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值