热门标签 | 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++实现计算器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 如何优化2060显卡设置以提升《Apex英雄》游戏体验
    《Apex英雄》作为一款热门的战术竞技游戏,吸引了大量玩家。本文将探讨如何通过优化GeForce RTX 2060显卡设置,确保在《Apex英雄》中获得最佳性能和流畅的游戏体验。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文将详细介绍在Windows 7环境下,检查U盘启动盘是否制作成功的多种方法,包括通过BIOS设置和使用模拟启动工具。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
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社区 版权所有