一 效果展示

在开发的过程中,先实现了整数表达式求值的计算,后面再实现带括号的小数计算。分别如图1和图2所示:

图1     不带括号的整数的计算

图2      带括号的小数计算

最后还加上了除数为0的异常处理,如图3所示:

图3     除数为0,结果为INF(无穷)

二 算法

2.1 算法思路

我们一般在计算器中输入都是中缀表达式,而计算机在计算的时候,是将中缀表达式转化后缀表达式来计算结果。中缀表达式转变为后缀时,需要两个栈,分别为字符栈和数字栈,从左到右遍历中缀,遍历的每个字符和字符栈栈顶字符作比较,根据比较结果,作出处理。处理方法如图3所示:

图3      处理方法(中缀表达式转后缀表达式)

根据中缀表达式计算结果的方法,将后缀表达式从左到右依次入栈,如果数字就入栈,如果为运算符时,依次取出栈顶和栈顶的下一个元素,然后根据运算符进行运算,然后进行st[top-1] op st[top]运算,将运算结果重新入栈,持续上面的过程,直到后缀遍历完毕,栈顶就是计算结果,如图4所示:

图4     后缀表达式求值

2.2 算法代码

2.2.1 中缀转变后缀

#include <iostream>
#include <cstring>
#pragma warning(disable:4996)using namespace std;
const int N = 1010;
char str1[N], str2[N];
float str3[N];
int tt1 = -1, tt2 = -1, tt3 = -1;void InTo(char p, char q) { //p(top) //压入符号栈的情况 if (tt2 == -1) {      //符号栈为空 ,直接进 str2[++tt2] = q;return;}if (q == '(') {          //(直接进入操作符栈 str2[++tt2] = q;return;}//外面的优先级高 ,直接进入操作符栈 if ((p == '+' || p == '-') && (q == '/' || q == '*')) {str2[++tt2] = q;return;}//遇到),寻找左括号,在括号之间的字符弹入操作数栈 if (q == ')') {while (str2[tt2] != '(' && tt2 != -1) {str1[++tt1] = str2[tt2--];str1[++tt1] = ' ';}if (tt2 != -1)tt2--;return;}//里面优先级较高else {while ((p == '*' || p == '/') || ((p == '+' || p == '-') && (q == '+' || q == '-'))) {if (tt2 == -1)    //操作符栈为空,停止。 break;if (str2[tt2] != '(') {        //(之前的弹出,进入操作数栈 str1[++tt1] = str2[tt2--];str1[++tt1] = ' ';p = str2[tt2];      //更新操作符栈的栈顶 }if (str2[tt2] == '(')  //遇到(,不能再弹出 break;}str2[++tt2] = q;   }
}int main(void)
{char str[N];int flag = 0, k = 0, t = 0, cnt = 0;float r = 0.0, tmp = 0.0;scanf("%s", str);for (int i = 0; str[i] != '\0'; i++) {while (('0' <= str[i] && str[i] <= '9') || str[i] == '.') {      //数字直接进入操作数栈 str1[++tt1] = str[i++];flag = 1;}if (flag) {i--;str1[++tt1] = ' ';flag = 0;}else {          if (tt2 == -1)       //非数字 InTo('0', str[i]);elseInTo(str2[tt2], str[i]);}}while (tt2 != -1) {        //将结果逆序,并加上' ',变成后缀表达式。 str1[++tt1] = str2[tt2--];str1[++tt1] = ' ';}printf("后缀表达式:%s\n", str1);return 0;
}

 2.2.2 后缀求值(注:应用C语言写的,没有把计算的结果变为理想状态,意味着如果结果为小数,最后保留2位小数)

for (int i = 0; i <= tt1; i++) {      //后缀表示式求值 while (str1[i] == ' ')i++;if (i > tt1)break;if ('0' <= str1[i] && str1[i] <= '9') {++tt3;k = 1;}if (k) {float res = 0.0;while (('0' <= str1[i] && str1[i] <= '9') || str1[i] == '.') {if (str1[i] == 46) {t = 1;i++;}if (t == 0)str3[tt3] = str1[i++] - 48 + str3[tt3] * 10;if (t) {cnt++;float temp = str1[i++] - 48;for (int i = 0; i < cnt; i++)temp = (temp) * 0.1;res += temp;}}str3[tt3] += res;k = 0;i--;t = 0;cnt = 0;}else {if (str1[i] == '+')  tmp = str3[tt3 - 1] + str3[tt3];if (str1[i] == '-')   tmp = str3[tt3 - 1] - str3[tt3];if (str1[i] == '*')    tmp = str3[tt3 - 1] * str3[tt3];if (str1[i] == '/')    tmp = str3[tt3 - 1] / str3[tt3];tt3 -= 2;str3[++tt3] = tmp;for (int j = tt3 + 1; j < N; j++)str3[j] = 0;}}int Lres = int(str3[tt3]);if(str3[tt3] - Lres < 1e-6)printf("%d\n",Lres);elseprintf("%.2f\n", str3[tt3]);

注(该代码,中使用的变量,都是来源于2.2.1,读者可以将两段代码 放在一起观看,便于理解)

三 C++QT(UI设计)

3.1 UI设计用到C++QT中的pushbutton控件,如4*5的按键使用QT中的pushbutton控件,输入输出也用到pushbutton控件,如图

图5   UI界面

四 总结和反思

4.1 播放背景音乐

步骤:1,在pro工程文件中加入QT += multimedia(播放音乐的模块)

2,在Resources文件夹中添加要播放的音乐(格式一般为.mp3)

3,如何写代码,调用播放音乐的模块。

QMediaPlayer* music = new QMediaPlayer;
music->setMedia(QUrl("qrc:/M/lastji.mp3"));       //文件地址
music->setVolume(50);            //设置音量
music->play();
sleep(11000);        //播放11秒(sleep函数:也要查一下,不是库函数)
music->stop();

4.2 感悟

小黑子,坚持自率,塑造更好的自己。

五 工程链接(一定要配置C++QT环境)

链接:https://pan.baidu.com/s/1bi_6K2Jdi9qhJ4i338eszQ 
提取码:1017

计算器(C++QT)——有全部代码哦相关推荐

  1. Qt下一行代码就可以使用的稳定易用的日志log类

    Qt下一行代码就可以使用的稳定易用的日志类 此日志类是基于Qt 自带的 扩展的一个易用的日志类, 使用的是Qt自带的日志输出形式, 已长期运行在许多实际项目中,稳定可靠,而且跨平台, 在windows ...

  2. Qt Creator分析代码

    Qt Creator分析代码 分析代码 QML Profiler Valgrind代码分析工具 lang工具 Heob 性能分析仪 Cppcheck Chrome跟踪格式可视化工具 分析代码 您可以在 ...

  3. Qt Creator填写代码

    Qt Creator填写代码 填写代码 可用类型摘要 完成代码段 编辑代码段 删除片段 重置片段 完成Nim代码 填写代码 在编写代码时,Qt Creator会建议属性,ID和代码段以完成代码.它为您 ...

  4. Qt Creator检查代码语法

    Qt Creator检查代码语法 检查代码语法 查看注释 指定线注释位置 JavaScript和QML错误代码 重置代码模型 检查QML和JavaScript 自动格式化QML / JS文件 检查代码 ...

  5. Qt Creator编写代码

    Qt Creator编写代码 编写代码 在编辑模式下工作 语义突出显示 检查代码语法 填写代码 缩进文字或代码 使用Qt快速工具栏 粘贴和获取代码段 使用文本编辑宏 相关话题 比较文件 使用Clang ...

  6. Qt Creator指定代码样式设置

    Qt Creator指定代码样式设置 指定代码样式设置 指定代码样式设置 Qt Creator使用文件的MIME类型来确定用于打开文件的模式和编辑器.Qt Creator在C ++代码编辑器中以&qu ...

  7. qt小项目 代码实现简易的QQ聊天界面

    qt小项目 代码实现简易的QQ聊天界面 代码 效果图 总结 代码 myDialog.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QW ...

  8. 一、Qt初尝试,做一个QT计算器《QT 入门到实战》

    学习目标 了解 qt 的基本信息 了解 qt 的下载及安装 了解创建一个基本 qt 项目的流程 了解信号与槽 通过示例了解信号与槽的设置与编写 了解控件添加的方式 了解控件如何使用代码获取其文本 了解 ...

  9. 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe+Opencv完成虚拟计算器,先放张图看效果.FPS值为29,食指和中指距离小于规定阈值则认为点击按键,为避免重复数字出现,规定每20帧可点击一 ...

最新文章

  1. Hexo博客NexT主题美化之文末统一添加“本文结束”标记
  2. 浅析网站开发的未来前景如何?
  3. 常见前端数据格式转换
  4. 安装oculus运行时出现问题_U盘安装windows10出现的问题解决方法
  5. 流媒体技术的国内外动态
  6. Android开发:4-3、Activity常用其他API接口、屏幕旋转
  7. java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
  8. MATLAB产生线性等分量函数 linspace
  9. java aapt linux_Android:linux下aapt使用 | 学步园
  10. python 百度ai 牌照识别_Python用百度AI实现文字识别功能!(银行卡,营业执照,等识别)...
  11. 杭电acm题库 1001 统计气球问题
  12. C语言实现电脑关机程序
  13. 原来安卓手机安装谷歌服务框架这么简单!
  14. Frank-Wolfe方法
  15. XILINX-FPGA下载工具--CH347FPGADownloader
  16. 一文详解谷歌最新物联网操作系统 Android Things,话说还记得大明湖畔的Fuchsia吗?
  17. C语言基础知识入门(2022年)
  18. 如何制作一个简单的游戏 Cocos2d-x 2.0.4
  19. linux的input命令,认识linux input子系统(一)
  20. 一文看懂 redo log 与undo log

热门文章

  1. Pytorch学习——张量
  2. 关于java 编译器级别与项目版本不匹配
  3. 【RSA原理5】浅谈--密钥如何生成及其可靠性说明
  4. win7系统语言栏默认输入法怎么设置教学分享
  5. 超级牛逼,用python制作全国身份证号验证及查询系统
  6. 【React】【Ant Design】引入阿里矢量图
  7. 手把手搭建Java金融借贷系统【附源码】(毕设)
  8. Candence PCB Allegro⑤DRC、光绘及其他命令
  9. Ubuntu 22.04 安装R语言及R studio
  10. ACCESS在程序运行中实时更新查询列表的条件