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

时间:2021-05-20

代码

MyCalculator.h

#pragma once#include <QtWidgets/QMainWindow>#include <QStack>#include <QString>#include "ui_MyCalculator.h"class MyCalculator : public QMainWindow{ Q_OBJECTpublic: MyCalculator(QWidget *parent = Q_NULLPTR); 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();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())); }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没有解决;
  • 部分代码需要优化,重构;
  • 没有实现输入错误表达式报错功能,需要输入正确的表达式。
  • 不支持负数计算。
  • 支持小数,加,减,乘,除,括号运算。
  • 到此这篇关于C++结合QT实现带有优先级的计算器的文章就介绍到这了,更多相关C++实现计算器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

    声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

    相关文章