c 语言计算器带括号优先级,C++结合QT实现带有优先级的计算器功能

本文介绍了如何使用C++和QT库创建一个带有优先级的计算器。通过解析输入的数学表达式,计算器能够正确处理加、减、乘、除以及括号运算。代码实现了按钮点击事件的连接,以及表达式的计算逻辑,但目前存在一些未解决的bug,如不支持负数计算。此外,该计算器支持小数和基本的算术运算,但输入错误的表达式不会报错。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

MyCalculator.h

#pragma once

#include

#include

#include

#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

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

MyCalculator w;

w.show();

return a.exec();

}

MyCalculator.cpp

#include "MyCalculator.h"

#include

using namespace std;

#include

#include

#include

#include

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(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(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(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 Num;

QStack 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(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(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没有解决;

部分代码需要优化,重构;

没有实现输入错误表达式报错功能,需要输入正确的表达式。

不支持负数计算。

支持小数,加,减,乘,除,括号运算。

037d7be27a623f9e48749e18bc045e4f.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值