本次结对项目是在上次四则运算程序的基础上进行优化,具体有以下几点:
1.改进为图形用户界面,利用了Qt图形用户界面开发框架。
2.将之前程序中零散的函数封装成类,提供接口共主程序调用,分为生成题目的Question类和计算结果的Calculator类。
3.为题目生成类增加了新的Setting函数,可通过调用来设置生成题目的算符个数和数字取值范围。
4.改进了计算类对题目识别的Bug,当输入算式不合法,如:1++2=,248/0=,会进行相应报告并停止运算。着重对括号输入不合法进行了调试,如:)1+2=,((1+2=,1+2)=.
5.优化了约分函数中对负分数的显示,不会再出现分母为负的情况。
==================分割线===========
虽然在上个项目中各个函数较为分散,但函数设计合理,只要把函数放入类中稍加改动参数就可以了,试想如果当时结构设计不够严谨,对现在的工作肯定造成很大影响。首先是给生成题目的Question类增加了SettingScale(int n)函数,用来设定数字的取值范围0-n。由于生成题目的函数本来就需要传入符号数量,所以只需要改动传入的参数就能达到限制符号数的功能。
首先在控制台中测试了以上两个函数,代码如下:
1 #include <iostream> 2 #include <sstream> 3 #include <algorithm> 4 #include <string> 5 #include <stack> 6 #include "Calculator.h" 7 #include "Question.h" 8 using namespace std; 9 10 int main(){ 11 string n; 12 Question a;//生成题目类a 13 a.SettingScale(10);//设定数字取值范围 14 a.CreateQuestion(4,n);//创建题目,符号数为4,题目存入string型变量n 15 Calculator b;//计算类b 16 b.SettingQue(n);//将题目进行计算 17 cout<<n<<b.DisplayAnswer()<<endl;//显示答案 18 return 0; 19 }
显示结果如下:
在经过改写了中缀转后缀及后缀运算的相关函数后,测试了有关非法输入算式的处理。目前非法输入导致结果错误甚至程序崩溃的方式共有以下几点:除数为0;右括号前无左括号;左括号后无右括号,算符位置不符合中缀表达式。
除数为0只需检测除数位置是否为0即可,算符不符合中缀表达式时只需在运算时检测数字栈是否为空,若输入合法那么在后缀表达式进行运算时是不会遇到数字栈中为空的情况。在中缀转后缀时遇到右括号,出栈时不能为空,否则输入不合法,在最后将栈中剩余符号出栈时不能遇到左括号,否则为非法。
具体测试结果如下:
经过以上测试后,利用Qt制作了UI界面:
采用了计算器的界面,随机生成题目,下方状态栏显示完成情况,可通过对话框设定符号数(不超过9)及数字范围:
在使用Question与Calculator两个类时只需调用给出的两个接口,因此在完成图形界面时不需对类做任何改动调试,实现界面模块与核心模块松耦合。
这次项目我有两个收获,一个是在开始设计时就应当考虑对象的封装,在以后的调用或移植平台时都能非常方便快速的完成,另一个就是结队开发不仅能减轻个人负担,还能暴露出个人开发测试时注意不到的异常,当一个人进行开发测试时,往往会被自己的逻辑束缚,发现不了在当前逻辑下覆盖不到的异常情况。通过两个人互相审视可以极大解决这个问题,发现问题解决问题都很高效。