计算器中的“=”按钮这部分的代码解释

目录

制作计算器中的“=”按钮这部分的代码解释

一、代码部分

二、解释

三、思路

四、死循环!


一、代码部分

void Widget::on_equalButton_clicked()
{QStack<int> s_num,s_opt; //声明两个int类型变量char opt[128]={0};//char型数组int i = 0,tmp = 0,num1,num2;//声明变量i,tmp,num1,num2//把QString 转换成 char*QByteArray ba;//字节数组ba.append(expression);//把QString转换成QByteArraystrcpy(opt,ba.data());//data可以把QByteArray转换成char *while(opt[i]!='\0'||s_opt.empty()!=true)//在字符串中'\0'用作字符串的结束标志,字符串没结束且不为空的情况下{if(opt[i]>='0'&&opt[i]<='9')//字符在0-9之间{tmp=tmp*10+opt[i]-'0';i++;if(opt[i]<'0'||opt[i]>'9')//字符不在0-9之间{s_num.push(tmp);tmp = 0;}}else  //操作符{if(s_opt.empty() == true || Priority(opt[i]) > Priority(s_opt.top()) ||(s_opt.top() == '(' && opt[i] != ')')){s_opt.push(opt[i]);i++;continue;}if(s_opt.top() == '(' && opt[i] == ')'){s_opt.pop();i++;continue;}if (Priority(opt[i]) <= Priority(s_opt.top() || (opt[i] == ')' && s_opt.top()) ||(opt[i]) == '\0' && s_opt.empty() != true)){char ch = s_opt.top();s_opt.pop();switch (ch){case '+':num1 = s_num.top();//取出栈顶元素s_num.pop();//删除栈顶元素num2 = s_num.top();s_num.pop();s_num.push(num2+num1);  //进栈break;case '-':num1 = s_num.top();s_num.pop();num2 = s_num.top();s_num.pop();s_num.push(num2-num1);  //进栈break;case '*':num1 = s_num.top();s_num.pop();num2 = s_num.top();s_num.pop();s_num.push(num2*num1);  //进栈break;case '/':num1 = s_num.top();s_num.pop();num2 = s_num.top();s_num.pop();s_num.push(num2/num1);  //进栈break;}}else  //新增,解决2*3+7死循环时的问题{s_opt.push(opt[i]);i++;continue;}}}//最后留在栈里的就是结果,将结果显示ui->mainLineEdit->setText(QString::number(s_num.top()));  //QString中有个静态成员函数number(),可以把数字转换成字符串。expression.clear();
}
int Widget::Priority(char ch)
{switch (ch){case '(':return 3;case '*':case '/':return 2;case '+':case '-':return 1;default:return 0;}
}

pop()删除栈顶元素

top() 是取出栈顶元素,不会删掉栈里边的元素


二、解释

这里有个优先级函数不好理解

三个并列的条件语句:

条件1:if(s_opt.empty() == true || Priority(opt[i]) > Priority(s_opt.top()) ||
                                                 (s_opt.top() == '(' && opt[i] != ')'))

//如果操作符s_opt是空,或者当前操作符的优先级Priority大于栈顶的优先级,或者栈顶的操作符   是‘(’ 不是 ')'           然后把操作符入栈

条件2:if(s_opt.top() == '(' && opt[i] == ')')

//如果操作符是 ‘(’  不是 ')'            直接操作符删除

条件3:if (Priority(opt[i]) <= Priority(s_opt.top() || (opt[i] == ')' && s_opt.top()) ||
                                             (opt[i]) == '\0' && s_opt.empty() != true))

//如果当前的操作符小于栈顶操作符,或者操作符是(且位于栈顶,或者操作符不是字符尾和不是空时   计算+-*/

例如(3-1)+1

  • ‘(’  满足条件1s_opt.empty() == true ,刚开始时s_opt未存入任何操作符,s_opt现在有‘(’
  • ‘-’满足条件1(s_opt.top() == '(' && opt[i] != ')'),s_opt.top()=='('且不等于‘)’
  • ')’满足条件3(Priority(opt[i]) <= Priority(s_opt.top() ,Priority(opt[i])是‘)’的优先级0,Priority(s_opt.top())是‘-’号的优先级1,0<1所有满足条件3,计算3-1,结果保存在s_num=2
  • ')’满足条件2,删除s_opt里面的操作符
  • ‘+’满足条件1s_opt.empty() == true,每次计算都会pop删除栈顶的操作符,所有s_opt此时为0,之前存入的操作符已经被删除完
  • ‘+’满足条件3(Priority(opt[i]) <= Priority(s_opt.top(),Priority(opt[i])是当i=7时的第七个字符‘\0’的优先级是0,Priority(s_opt.top())是‘+’号的优先级1,0<1所有满足条件3,计算2+1=3,结果继续入栈存入s_num中

三、思路

思路理解:

条件1是存入操作符

条件2在s_opt栈顶是'('和当前操作符是‘)’时删除s_opt栈顶操作符

条件3判断操作符优先级,当前操作符 优先级  小于  栈顶优先级时进行计算

四、死循环!

出现问题:运行2*3+7的时候报错!

产生原因:i无法正常加1,一直在i=3时循环

解决方法:

else  //新增,解决2*3+7死循环时的问题{s_opt.push(opt[i]);i++;continue;}

 完整代码参考博客和哔站QT基础教程:

w代码复现|QT快速入门 (课程来自B站)--其二_OZ__96的博客-CSDN博客

Qt学习3-Qt Creator四则运算计算器(哔站视频学习记录)相关推荐

  1. Qt学习1-对QT的初步了解(哔站视频学习记录)

    目录 一.简介QT 二.选择QT的原因 三.Qt开发工具详解 1.Qt开发工具介绍 2.Qt模块介绍 四.一些注意点 1.VS做Qt开发容易中文乱码 2.只能用于窗口应用程序 3.学习注意点 4.Qt ...

  2. 郑莉老师c++第五版+b站视频 学习笔记

    本文是系统学习 郑莉c++第五版+b站视频的学习笔记. 郑莉老师b站内容分为 导学 文章目录 第0章:学习怎么学习--论道开篇+怎样学c++ 论道开篇 怎样学c++ 第1章绪论 导学笔记(学堂在线+b ...

  3. c++学习笔记-提高编程-模板(哔站-黑马程序员c++教学视频)

    目录 1.模板概念 2.模板特点 3.模板语法 3.1编程思想:泛型编程 3.2两种模板方法: 3.2.1 函数模板 3.2.2 类模板 1.模板概念 通用的模具,提高代码复用性 2.模板特点 不可以 ...

  4. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day10-字符串

    1.API和API帮助文档 API:应用程序接口. 简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可. JavaAPI:指的就是JDK中提供的各种功能的Java类.这些类将底层 ...

  5. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day14-面向对象进阶02

    1.权限修饰符和代码块 1.1 权限修饰符 权限修饰符:是用来控制一个成员能够被访问的范围的. 可以修饰:成员变量.方法.构造方法.内部类. 巧计举例: private--------私有的----- ...

  6. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day15-阶段项目(拼图小游戏)(上篇)

    1.主界面分析 1.练习:创建主界面1 到IDEA中创建一个宽603像素,高680像素的游戏主界面 到IDEA中创建一个宽488像素,高430像素的登录界面 到IDEA中创建一个宽488像素,高500 ...

  7. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day7-综合练习

    1.卖飞机票 需求:机票价格按照淡季旺季.头等舱和经济舱收费.输入机票原价.月份和头等舱或者经济舱. 按照如下规则进行计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折:淡季(11月到来年4月 ...

  8. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day4-判断和循环

    1.顺序结构 顺序结构语句是Java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行. 2.分支结构 1.if语句 (1).if语句的第一种格式,格式如下: if (关系表达式){语句体; } ...

  9. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day11-ArrayList集合

    1.集合的基本应用 数组的长度是固定的,集合的长度是可变的,集合具有自动扩容的功能. 数组可以存基本数据类型和引用数据类型,集合只能存储引用数据类型,基本数据类型只有设置成包装类才能存储在集合当中. ...

最新文章

  1. 进程间通信-Queue
  2. 堆(heap)和栈(stack)有什么区别??
  3. 财务用计算机可以一次摊销,购入的电脑可以一次性计提折旧吗
  4. Twitter Snowflake算法详解
  5. 逆向工程核心原理学习笔记(十二):分析abex' crackme #1
  6. 图像颜色迁移《color transfer between images》
  7. 树莓派:3安装NodeJS
  8. nowcoder80D applese的生日
  9. 如何在Mac上使用Memoji贴纸、屏幕效果、应用程序和Messages
  10. vsan双主机配置_5千右预算,兼顾Pr剪辑、Ps修图、CAD制图的高性价比DIY主机配置...
  11. 数据-第17课-栈课后练习
  12. 钉钉现身数博会:增长200% 年内要覆盖450万家企业组织
  13. database如何管理超过4GB的文件
  14. 三维模型格式转换神器-assimp
  15. 2021年程序员个人年终工作总结10篇
  16. 透视宝Java监控部署流程
  17. 微信小程序:用户头像的更改与保存
  18. Android夜神模拟器
  19. 蛋白质结构预测方案总结
  20. 区块链溯源是如何实现的?

热门文章

  1. YUV数据YUY2到I420
  2. 自动驾驶之眼-摄像头模组介绍
  3. 菜鸟的草缸 篇二:开缸种草篇
  4. 高版本自动接听电话方法
  5. 游戏行业使用高防IP有什么优势?
  6. eNSP为什么直连交换机防火墙却ping不通交换机
  7. 一张图看懂项目管理的47个过程(干货)
  8. Linux安装PPTP
  9. 蔡高厅高等数学19-初等函数的连续性、反函数的连续性、复合函数的连续性
  10. ps 如何使文字弯曲