1、 项目概述
1.1 项目目标和主要内容
- 实现一个计算器软件。
- 能通过设计的按钮控件输入并实现算术表达式,表达式在文本框中显示,运算结果输出显示;保存和浏览历史运算记录;
- 能够检验算术表达式的合法性;
- 能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;
- 要求交互界面友好,程序健壮。
简述本项目实现的主要内容和目标,使用的开发平台,采用的主要工具。
1.2 项目的主要功能 - 检验算术表达式的合法性;
- 能够实现混合运算的求解,算术表达式中包括加、减、乘、除、括号等运算符;
- 运算结果输出显示;
- 保存和浏览历史运算记录。
2、 项目设计
2.1 项目总体框架
设计思想:
使用QT进行图形化开发设计。UI中的控件和具体的槽函数或 Lamda表达式进行绑定。在本项目中与用户交互的按钮控件主要分为三类, 一类是触发后在可编辑文本框的末尾 添加一个字符,例如数字和操作符; 一类是触发后在可编辑文本框的末尾减少一个字符,例如Backspace键; 一类是触发后清除可编辑文本框,例如Clear键。
系统框架图:
层次逻辑图:
2.2 系统详细设计
【1】 模块划分图及描述
逻辑设计部分主要又包括两个部分:一是保证输入正确的表达式。二是计算正确的表达式。
(1)保证输入正确的表达式。这里既包括输入数字和运算符,也包括正确输入他们的关系。
其中,前者,主要是利用按钮的信号和槽,即按下一个数字,将会触发一个槽,在这个槽中输入这个数字。具体的,在本程序中为了程序的简洁化,中间又加了一个公共的信号,这样按下任意一个数字都会触发同样的信号SendNum(int num)。这个信号有一个参数,就是对应的数字值。同理,符号也是一样。
(2)、计算正确输入的表达式:本程序采用的过程是先把中序表达式转化为后续表达式,然后利用后续表达式进行计算。其中的原理网上很多,在此就不赘述了。
【2】 类关系图及描述
QCalculatorUI Class里面封装了GUI图形界面设计,QCalculatorDec Class里面封装了运算函数,将中缀表达式转换为后缀表达式,分3个函数具体来实现。
【3】 程序流程图及描述
【4】 存储结构、内存分配
后缀表达式求解,需要用到一个结果栈Res_Stack :用于存放计算的中间过程的值和最终结果。 上述内容也可以按照函数或模块划分分别设计。
2.3 关键算法分析
算法 1:QQueue Split(const QString& exp);
【1】 算法功能
分离前缀。
【2】 算法基本思想
通过遍历字符串,每扫描到数字,就把它放到队列里面。
【3】 算法空间、时间复杂度分析
时间复杂度O(n),空间复杂度O(n)。
QQueue<QString> QCalculatorDec::Split(const QString& exp) //分离前缀
{
QQueue<QString> ret;
QString num="";
for(int i=0;i<exp.length();i++)
{
if( (exp[i]=='.') || ( (exp[i]>='0') && (exp[i]<='9') )) //判断小数点和数字
{
num += exp[i];
}
else if(exp[i]== '(' || exp[i]==