这次作业使软件工程结对编程的第二次,我们选做的题目是生成四则运算练习题这道题目,题目要求如下:
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();
}
部分运行结果截图
心得体会
这次结对编程,不仅让我知道了有些程序看上去有点困难,但是一点点的去写还是能够写出来的。也让我明白了结对编程确实是把复查做到了极致,有一个好的导航员,敲键盘的人是可以少走弯路的,即使对于复杂程序,也可以用很少的调试和debug,就能让程序正常运行,甚至是一边成,大大缩短了开发的周期。
最后放上一张秋名山老司机的合影: