计算器(C++QT)——有全部代码哦
一 效果展示
在开发的过程中,先实现了整数表达式求值的计算,后面再实现带括号的小数计算。分别如图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)——有全部代码哦相关推荐
- Qt下一行代码就可以使用的稳定易用的日志log类
Qt下一行代码就可以使用的稳定易用的日志类 此日志类是基于Qt 自带的 扩展的一个易用的日志类, 使用的是Qt自带的日志输出形式, 已长期运行在许多实际项目中,稳定可靠,而且跨平台, 在windows ...
- Qt Creator分析代码
Qt Creator分析代码 分析代码 QML Profiler Valgrind代码分析工具 lang工具 Heob 性能分析仪 Cppcheck Chrome跟踪格式可视化工具 分析代码 您可以在 ...
- Qt Creator填写代码
Qt Creator填写代码 填写代码 可用类型摘要 完成代码段 编辑代码段 删除片段 重置片段 完成Nim代码 填写代码 在编写代码时,Qt Creator会建议属性,ID和代码段以完成代码.它为您 ...
- Qt Creator检查代码语法
Qt Creator检查代码语法 检查代码语法 查看注释 指定线注释位置 JavaScript和QML错误代码 重置代码模型 检查QML和JavaScript 自动格式化QML / JS文件 检查代码 ...
- Qt Creator编写代码
Qt Creator编写代码 编写代码 在编辑模式下工作 语义突出显示 检查代码语法 填写代码 缩进文字或代码 使用Qt快速工具栏 粘贴和获取代码段 使用文本编辑宏 相关话题 比较文件 使用Clang ...
- Qt Creator指定代码样式设置
Qt Creator指定代码样式设置 指定代码样式设置 指定代码样式设置 Qt Creator使用文件的MIME类型来确定用于打开文件的模式和编辑器.Qt Creator在C ++代码编辑器中以&qu ...
- qt小项目 代码实现简易的QQ聊天界面
qt小项目 代码实现简易的QQ聊天界面 代码 效果图 总结 代码 myDialog.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QW ...
- 一、Qt初尝试,做一个QT计算器《QT 入门到实战》
学习目标 了解 qt 的基本信息 了解 qt 的下载及安装 了解创建一个基本 qt 项目的流程 了解信号与槽 通过示例了解信号与槽的设置与编写 了解控件添加的方式 了解控件如何使用代码获取其文本 了解 ...
- 【机器视觉案例】(5) AI视觉,远程手势控制虚拟计算器,附python完整代码
各位同学好,今天和大家分享一下如何使用MediaPipe+Opencv完成虚拟计算器,先放张图看效果.FPS值为29,食指和中指距离小于规定阈值则认为点击按键,为避免重复数字出现,规定每20帧可点击一 ...
最新文章
- Hexo博客NexT主题美化之文末统一添加“本文结束”标记
- 浅析网站开发的未来前景如何?
- 常见前端数据格式转换
- 安装oculus运行时出现问题_U盘安装windows10出现的问题解决方法
- 流媒体技术的国内外动态
- Android开发:4-3、Activity常用其他API接口、屏幕旋转
- java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用
- MATLAB产生线性等分量函数 linspace
- java aapt linux_Android:linux下aapt使用 | 学步园
- python 百度ai 牌照识别_Python用百度AI实现文字识别功能!(银行卡,营业执照,等识别)...
- 杭电acm题库 1001 统计气球问题
- C语言实现电脑关机程序
- 原来安卓手机安装谷歌服务框架这么简单!
- Frank-Wolfe方法
- XILINX-FPGA下载工具--CH347FPGADownloader
- 一文详解谷歌最新物联网操作系统 Android Things,话说还记得大明湖畔的Fuchsia吗?
- C语言基础知识入门(2022年)
- 如何制作一个简单的游戏 Cocos2d-x 2.0.4
- linux的input命令,认识linux input子系统(一)
- 一文看懂 redo log 与undo log