C++结合QT实现带有优先级的计算器功能
ruokey_1 人气:0这篇文章主要介绍了C++结合QT实现带有优先级的计算器,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
代码
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没有解决;
- 部分代码需要优化,重构;
- 没有实现输入错误表达式报错功能,需要输入正确的表达式。
- 不支持负数计算。
- 支持小数,加,减,乘,除,括号运算。
加载全部内容