C++结合QT实现带有优先级的计算器功能
作者:ruokey_1 时间:2022-07-05 08:12:49
代码
MyCalculator.h
#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;
};
MyCalculator.main
#include "MyCalculator.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyCalculator w;
w.show();
return a.exec();
}
MyCalculator.cpp
#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;//用来判断是否是数字
int xiaoshu = 1;//用来判断是否是小数部分
double number = 0;//暂存数字
QString frist = input.left(1);
while (isNum(frist))//连续的数字转化为一个整数
{
if (frist == '.' || xiaoshu == 2)
{
number = frist.toDouble() / 10 + number;
xiaoshu = 2;
}
else
{
number = number * 10 + frist.toInt();
}
input = input.right(input.length() - 1);
frist = input.left(1);
flag = 1;
}
if (flag == 1)
Num.push(number);
if (isOperate(frist))
{
if (!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));
}
*/
测试
表达式 | 结果 |
---|---|
2*3+6-(1+3) | 8 |
2+3*6-(1+3) | 16 |
2+3*6-(1.3+5/2) | 16.2 |
说明
自己的学习笔记 ,还有一些bug没有解决;
部分代码需要优化,重构;
没有实现输入错误表达式报错功能,需要输入正确的表达式。
不支持负数计算。
支持小数,加,减,乘,除,括号运算。
来源:https://blog.csdn.net/qq_44052058/article/details/112170541
标签:C++,QT,计算器
0
投稿
猜你喜欢
Apache SkyWalking 修复TTL timer 失效bug详解
2023-08-18 08:09:53
java.lang.StackOverflowError出现的原因及解决
2022-03-21 08:12:21
C#中重载重写和覆盖的定义与区别
2022-04-23 09:25:34
Android监听手机电话状态与发送邮件通知来电号码的方法(基于PhoneStateListene实现)
2022-12-07 09:03:44
教你如何使用Java输出各种形状
2023-08-21 00:46:55
面试官:Java中new Object()到底占用几个字节
2022-02-09 19:04:00
JAVA并发图解
2023-03-26 03:11:41
Java实现FIFO任务调度队列策略
2021-09-19 09:05:37
Kotlin 匿名类实现接口和抽象类的区别详解
2021-09-04 07:14:58
浅谈Java中Int、Integer、Integer.valueOf()、new Integer()之间的区别
2023-10-29 20:08:53
C#实现HTTP下载文件的方法
2022-01-19 02:35:50
java实现多线程之定时器任务
2021-07-10 08:56:14
android ListView和GridView拖拽移位实现代码
2023-05-19 18:27:01
java自动装箱拆箱深入剖析
2023-09-03 08:45:19
Java输入/输出流体系详解
2023-03-01 06:37:00
Spring @Cacheable指定失效时间实例
2022-12-06 08:58:35
Java实现简单的五子棋游戏示例代码
2022-03-14 22:35:47
java实习--每天打卡十道面试题!
2021-12-06 15:22:19
浅谈C#泛型的用处与特点
2022-04-22 02:39:35
Android编程实现应用强制安装到手机内存的方法
2023-11-09 14:00:40