Qt学习3-Qt Creator四则运算计算器(哔站视频学习记录)
计算器中的“=”按钮这部分的代码解释
目录
制作计算器中的“=”按钮这部分的代码解释
一、代码部分
二、解释
三、思路
四、死循环!
一、代码部分
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
- ‘(’ 满足条件1的s_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里面的操作符
- ‘+’满足条件1的s_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四则运算计算器(哔站视频学习记录)相关推荐
- Qt学习1-对QT的初步了解(哔站视频学习记录)
目录 一.简介QT 二.选择QT的原因 三.Qt开发工具详解 1.Qt开发工具介绍 2.Qt模块介绍 四.一些注意点 1.VS做Qt开发容易中文乱码 2.只能用于窗口应用程序 3.学习注意点 4.Qt ...
- 郑莉老师c++第五版+b站视频 学习笔记
本文是系统学习 郑莉c++第五版+b站视频的学习笔记. 郑莉老师b站内容分为 导学 文章目录 第0章:学习怎么学习--论道开篇+怎样学c++ 论道开篇 怎样学c++ 第1章绪论 导学笔记(学堂在线+b ...
- c++学习笔记-提高编程-模板(哔站-黑马程序员c++教学视频)
目录 1.模板概念 2.模板特点 3.模板语法 3.1编程思想:泛型编程 3.2两种模板方法: 3.2.1 函数模板 3.2.2 类模板 1.模板概念 通用的模具,提高代码复用性 2.模板特点 不可以 ...
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day10-字符串
1.API和API帮助文档 API:应用程序接口. 简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可. JavaAPI:指的就是JDK中提供的各种功能的Java类.这些类将底层 ...
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day14-面向对象进阶02
1.权限修饰符和代码块 1.1 权限修饰符 权限修饰符:是用来控制一个成员能够被访问的范围的. 可以修饰:成员变量.方法.构造方法.内部类. 巧计举例: private--------私有的----- ...
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day15-阶段项目(拼图小游戏)(上篇)
1.主界面分析 1.练习:创建主界面1 到IDEA中创建一个宽603像素,高680像素的游戏主界面 到IDEA中创建一个宽488像素,高430像素的登录界面 到IDEA中创建一个宽488像素,高500 ...
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day7-综合练习
1.卖飞机票 需求:机票价格按照淡季旺季.头等舱和经济舱收费.输入机票原价.月份和头等舱或者经济舱. 按照如下规则进行计算机票价格:旺季(5-10月)头等舱9折,经济舱8.5折:淡季(11月到来年4月 ...
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day4-判断和循环
1.顺序结构 顺序结构语句是Java程序默认的执行流程,按照代码的先后顺序,从上到下依次执行. 2.分支结构 1.if语句 (1).if语句的第一种格式,格式如下: if (关系表达式){语句体; } ...
- 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day11-ArrayList集合
1.集合的基本应用 数组的长度是固定的,集合的长度是可变的,集合具有自动扩容的功能. 数组可以存基本数据类型和引用数据类型,集合只能存储引用数据类型,基本数据类型只有设置成包装类才能存储在集合当中. ...
最新文章
- 进程间通信-Queue
- 堆(heap)和栈(stack)有什么区别??
- 财务用计算机可以一次摊销,购入的电脑可以一次性计提折旧吗
- Twitter Snowflake算法详解
- 逆向工程核心原理学习笔记(十二):分析abex' crackme #1
- 图像颜色迁移《color transfer between images》
- 树莓派:3安装NodeJS
- nowcoder80D applese的生日
- 如何在Mac上使用Memoji贴纸、屏幕效果、应用程序和Messages
- vsan双主机配置_5千右预算,兼顾Pr剪辑、Ps修图、CAD制图的高性价比DIY主机配置...
- 数据-第17课-栈课后练习
- 钉钉现身数博会:增长200% 年内要覆盖450万家企业组织
- database如何管理超过4GB的文件
- 三维模型格式转换神器-assimp
- 2021年程序员个人年终工作总结10篇
- 透视宝Java监控部署流程
- 微信小程序:用户头像的更改与保存
- Android夜神模拟器
- 蛋白质结构预测方案总结
- 区块链溯源是如何实现的?