简易计算器的实现

Ui界面的设计

界面设计如下:

QPushButton的创建

       以按钮8为例,通过ui界面中PushButton添加8的按钮,然后以字符串的形式呈现在显示屏上,如下:

其槽函数代码如下:
void Widget::on_eight_clicked()
{
    expression+="8";
    ui->lineEdit->setText(expression);
}

主要函数实现

Judge函数(判断):

      用来判断运算符的优先级

pre_expression函数(预处理):

·expression:为用户输入的原始表达式。

·返回值:字母中缀表达式。

zzzhz函数(中缀转后缀):

·zzzhz (QString pre_expression):用于将中缀表达式转换为后缀表达式。

·pre_expression:数据预处理的结果。

·返回值:返回的是一个队列q,里面存有后缀表达式。

cal函数(运算):

·cal(queue<QString> q):用于计算后缀表达式

·q:zzzhz函数所求的后缀表达式。

·返回值:返回的是一个字符串答案。

·wrong:当算术运算表达式不合法时报错。

关键算法分析

中缀表达式转后缀表达式

首先,需要定义一个操作符栈并且知道各运算符优先级,然后从左往右一次扫描字符(字符前后加#号),遇到数字直接输出,遇到操作符比较优先级。

栈顶优先级低,入栈;

栈顶优先级高,出栈并且输出;

优先级相等(即左右括号),出栈(不输出);

当扫描的字符为#并且栈顶字符为#时,此时输出的字符序列即为后缀表达式。

以下为列举的一个例子:

1. 初始化一个空。此桟用来对要运算的数字进出使用。

2. 后缀表达式中前三个都是数字,所以931进栈。

3. 接下来是减号“-”,所以将栈中的1出栈作为减数,3出栈作为被减数,并运算3-1得到2,再将2进栈。

4. 接着是数字3进栈。

5. 后面是乘法“*”,也就意味着栈中32出栈,23相乘,得到6,并将6进栈。

6. 下面是加法“+”,所以找中69出找,96相加,得到15,将15进栈。

7. 接着是102两数字进栈。

8. 接下来是符号因此,栈顶的210出栈,102相除,得到5,将5进栈。

9. 最后一个是符号“+”,所以155出找并相加,得到20,将20进栈。

10. 结果是20出栈,栈变为空。

后缀表达式求值

转换成后缀表达式后,即可利用后缀表达式进行求值,后缀表达式求值时,只需定义一个操作数栈,当从左往右扫描字符串时,扫描到数字时进栈,扫描到字符从栈中出两个数字,然后与扫描到的字符之间进行运算, ***<运算时注意:先出栈的做运算符的后操作数,后出栈的做前操作数>***当全部扫描完之后,栈顶的数字即为求值结果。

用户界面输入的容错机制

1)如果存在运算符,而队列中操作数小于2

2)出现小数点前面自动补0

3 "+×÷)"不能跟在"+×÷("之后;

4)右括号数量不能超过左括号数量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值