热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

C++结合QT实现带有优先级的计算器功能

这篇文章主要介绍了C++结合QT实现带有优先级的计算器,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

代码

MyCalculator.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#pragma once
 
#include <qtwidgets qmainwindow="">
#include <qstack>
#include <qstring>
#include "ui_MyCalculator.h"
 
class MyCalculator : public QMainWindow
{
  Q_OBJECT
 
public:
  MyCalculator(QWidget *parent = Q_NULLPTR);
     
/*  void setnum1(int num);
    void setnum2(int num);
    void setflag(int f);
    int calculartor();
*/
 
 
private slots:
    void on_number_Button_clicked();
    void on_action_Button_clicked();
    void on_comma_Button_clicked();
    void on_action_Button_c_clicked();
    void on_action_Button_d_clicked();
    void on_action_Button_e_clicked();
 
/*
    void on_action_Button_equal_clicked();
    void on_number_Button_clicked();
    void on_action_Button_clicked();
    void on_action_Button_c_clicked();
*/
 
private:
  Ui::MyCalculatorClass ui;
 
};</qstring></qstack></qtwidgets>

MyCalculator.main

1
2
3
4
5
6
7
8
9
10
#include "MyCalculator.h"
#include <qtwidgets qapplication="">
 
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);
  MyCalculator w;
  w.show();
  return a.exec();
}</qtwidgets>

MyCalculator.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
#include "MyCalculator.h"
 
#include<iostream>
using namespace std;
#include<stack>
#include<vector>
#include<cstdlib>
#include<limits.h>
 
MyCalculator::MyCalculator(QWidget *parent)
  : QMainWindow(parent)
{
  ui.setupUi(this);
    setWindowTitle(QStringLiteral("计算器"));
    ui.textBrowser->setFontPointSize(28);
 
    connect(ui.pushButton0, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton1, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton2, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton3, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton4, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton5, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton6, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton7, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton8, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton9, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
 
    connect(ui.pushButton_add, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_div, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_mul, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_sub, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_right, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_left, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_dian, SIGNAL(clicked()), this, SLOT(on_comma_Button_clicked()));
 
 
    connect(ui.pushButton_del, SIGNAL(clicked()), this, SLOT(on_action_Button_d_clicked()));
    connect(ui.pushButton_re, SIGNAL(clicked()), this, SLOT(on_action_Button_c_clicked()));
    connect(ui.pushButton_equ, SIGNAL(clicked()), this, SLOT(on_action_Button_e_clicked()));
    /*
    //没有优先级的计算器
    connect(ui.pushButton0, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton1, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton2, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton3, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton4, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton5, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton6, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton7, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton8, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
    connect(ui.pushButton9, SIGNAL(clicked()), this, SLOT(on_number_Button_clicked()));
 
    connect(ui.pushButton_add, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_div, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_mul, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
    connect(ui.pushButton_sub, SIGNAL(clicked()), this, SLOT(on_action_Button_clicked()));
 
    connect(ui.pushButton_re, SIGNAL(clicked()), this, SLOT(on_action_Button_c_clicked()));
 
    connect(ui.pushButton_equ, SIGNAL(clicked()), this, SLOT(on_action_Button_equal_clicked()));
    */
 
}
void MyCalculator::on_number_Button_clicked()
{
    QPushButton *btn = qobject_cast<qpushbutton*>(sender());
    QString number = btn->text();
    QString ss = ui.textBrowser->toPlainText();
    ui.textBrowser->clear();
    ui.textBrowser->append(ss + number);
}
void MyCalculator::on_action_Button_clicked()//操作符
{
    QPushButton *btn = qobject_cast<qpushbutton*>(sender());
    QString action = btn->text();
    QString ss = ui.textBrowser->toPlainText();
    ui.textBrowser->clear();
    ui.textBrowser->append(ss + action);
}
void MyCalculator::on_comma_Button_clicked()//小数点
{
    QPushButton *btn = qobject_cast<qpushbutton*>(sender());
    QString action = btn->text();
    QString ss = ui.textBrowser->toPlainText();
    ui.textBrowser->clear();
    ui.textBrowser->append(ss + action);
}
void MyCalculator::on_action_Button_c_clicked()//重置输入框里的内容
{
    ui.textBrowser->clear();
}
void MyCalculator::on_action_Button_d_clicked()//删除表达式中最后一个符号
{
    QString ss = ui.textBrowser->toPlainText();//在一行
    ss = ss.left(ss.length() - 1);
    ui.textBrowser->clear();
    ui.textBrowser->setText(ss);
}
bool isNum(QString ch)
{
    if (ch >= '0' && ch <= '9' || ch == '.')
        return true;
    else
        return false;
}
bool isOperate(QString ch)
{
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' )
        return true;
    else
        return false;
}
int level(QString ch) {//优先级设置
    if(ch == '(')
        return 5;
    else if (ch == '*' || ch== '/')
        return 4;
    else if (ch == '+' || ch == '-')
        return 3;
    else if (ch == ')')
        return 2;
}
double calcu(double a ,double b, QString c)
{
    double result = 0;
    if (c == '+')
        result = b + a;
    else if (c == '-')
        result = b - a;
    else if (c == '*')
        result = b * a;
    else if (c == '/')
        result = b / a;
    else
        result = INT_MAX;
    return result;
}
double getjieguo(QString input)
{
    QStack<double> Num;
    QStack<qstring> Act;
    int a = input.length();
    for(int i=0;i<a;i++) {="" int="" flag="0;//用来判断是否是数字" xiaoshu="1;//用来判断是否是小数部分" double="" number="0;//暂存数字" qstring="" frist="input.left(1);" while="" (isnum(frist))="" 连续的数字转化为一个整数="" if="" (frist="=" '.'="" ||="" 2)="" 10="" +="" number;="" }="" else="" *="" frist.toint();="" input="input.right(input.length()" -="" 1);="" (flag="=" 1)="" num.push(number);="" (isoperate(frist))="" (!act.empty()="" &&="" (level(act.top())=""> level(frist)))
            {
                    double a = Num.pop();
                    double b = Num.pop();
                    QString c = Act.pop();
                    double result = calcu(a, b, c);
                    Num.push(result);
                    if (frist != ')')
                        Act.push(frist);
                    input = input.right(input.length() - 1);
                    frist = input.left(1);
            }
            else if (!Act.empty() && (level(Act.top()) <= level(frist)))
            {
                if (frist != '(')
                    Act.push(frist);
                input = input.right(input.length() - 1);
                frist = input.left(1);
            }
            else if(Act.empty())                //操作符第一次入符号栈
            {
                Act.push(frist);
                input = input.right(input.length() - 1);
                frist = input.left(1);
            }
        }
        if (frist == '=')//支持得到结果后仍可以继续运算
        {
            Num.clear();
            Act.clear();
            input = input.right(input.length() - 1);
            frist = input.left(1);
        }
 
        if (i + 1 >= a)              //当表达式都进栈后,只要符号栈不为空就继续执行
        {
            while (!Act.empty())
            {
                double a1 = Num.pop();
                double b1 = Num.pop();
                QString c1 = Act.pop();
                double result = calcu(a1, b1, c1);
                Num.push(result);
            }
        }
    }
 
    return Num.top();
 
}
void MyCalculator::on_action_Button_e_clicked()
{
    QString input = ui.textBrowser->toPlainText();//将输入框里的内容给input
    double value = getjieguo(input);//将表达式传给getjieguo来将数字和操作符分别入对应的栈
    ui.textBrowser->clear();
    ui.textBrowser->append(input + "=" + QString::number(value));//将结果的类型由数字转化为QString
 
}
/*
void MyCalculator::setnum1(int num)
{
    num1 = num;
}
void MyCalculator::setnum2(int num)
{
    num2 = num;
}
void MyCalculator::setflag(int f)
{
    flag = f;
}
int MyCalculator::calculartor()
{
    int result = 0;
    if (flag == 1)
        result = num1 + num2;
    else if (flag == 2)
        result = num1 - num2;
    else if (flag == 3)
        result = num1 * num2;
    else if (flag == 4)
    {
        if (num2 == 0)
            setflag(5);
        else
            result = num1 / num2;
    }
    else
        result = 0;
 
    return result;
}
 
void MyCalculator::on_action_Button_c_clicked()
{
    ui.textBrowser->clear();
    setnum1(0);
    setnum2(0);
    setflag(0);
}
 
void MyCalculator::on_number_Button_clicked()
{
    QPushButton *btn = qobject_cast<qpushbutton*>(sender());
    QString number = btn->text();
    QString ss = ui.textBrowser->toPlainText();
    ui.textBrowser->clear();
    ui.textBrowser->append(ss + number);
}
 
void MyCalculator::on_action_Button_clicked()
{
    int number = ui.textBrowser->toPlainText().toInt();
    setnum1(number);
    QPushButton *btn = qobject_cast<qpushbutton*>(sender());
    QString action = btn->text();
    ui.textBrowser->clear();
    if (action == "+")
        setflag(1);
    else if (action == "-")
        setflag(2);
    else if (action == "*")
        setflag(3);
    else
        setflag(4);
 
}
 
void MyCalculator::on_action_Button_equal_clicked() {
    int number = ui.textBrowser->toPlainText().toInt();
    setnum2(number);
    int res = calculartor();
    ui.textBrowser->clear();
    if (flag == 5)
        ui.textBrowser->append(QStringLiteral("不能除于0,请重新输入"));
    else
        ui.textBrowser->append(QString::number(res));
}
*/</qpushbutton*></qpushbutton*></a;i++)></qstring></double></qpushbutton*></qpushbutton*></qpushbutton*></limits.h></cstdlib></vector></stack></iostream>

测试

表达式 结果
2*3+6-(1+3) 8
2+3*6-(1+3) 16
2+3*6-(1.3+5/2) 16.2

说明

  1. 自己的学习笔记 ,还有一些bug没有解决;
  2. 部分代码需要优化,重构;
  3. 没有实现输入错误表达式报错功能,需要输入正确的表达式。
  4. 不支持负数计算。
  5. 支持小数,加,减,乘,除,括号运算。

在这里插入图片描述

到此这篇关于C++结合QT实现带有优先级的计算器的文章就介绍到这了,更多相关C++实现计算器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • Vue 2 中解决页面刷新和按钮跳转导致导航栏样式失效的问题
    本文介绍了如何通过配置路由的 meta 字段,确保 Vue 2 项目中的导航栏在页面刷新或内部按钮跳转时,始终保持正确的 active 样式。具体实现方法包括设置路由的 meta 属性,并在 HTML 模板中动态绑定类名。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 如何在PHPcms网站中添加广告
    本文详细介绍了在PHPcms网站后台添加广告的方法,涵盖多种常见的广告形式,如百度广告和Google广告,并提供了相关设置的步骤。同时,文章还探讨了优化网站流量的SEO策略。 ... [详细]
  • 当iOS设备越狱后,某些插件可能会导致系统崩溃(白苹果)。此时,可以通过进入安全模式来排查并删除有问题的插件。本文将详细介绍如何通过特定按键组合进入不加载MobileSubstrate的安全模式,并提供相关背景知识。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 如何优化2060显卡设置以提升《Apex英雄》游戏体验
    《Apex英雄》作为一款热门的战术竞技游戏,吸引了大量玩家。本文将探讨如何通过优化GeForce RTX 2060显卡设置,确保在《Apex英雄》中获得最佳性能和流畅的游戏体验。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
author-avatar
手机用户2602921303_852
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有