C++結合QT實現帶有優先順序的計算器功能
阿新 • • 發佈:2021-01-06
程式碼
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,SLOT(on_number_Button_clicked())); connect(ui.pushButton2,SLOT(on_number_Button_clicked())); connect(ui.pushButton3,SLOT(on_number_Button_clicked())); connect(ui.pushButton4,SLOT(on_number_Button_clicked())); connect(ui.pushButton5,SLOT(on_number_Button_clicked())); connect(ui.pushButton6,SLOT(on_number_Button_clicked())); connect(ui.pushButton7,SLOT(on_number_Button_clicked())); connect(ui.pushButton8,SLOT(on_number_Button_clicked())); connect(ui.pushButton9,SLOT(on_number_Button_clicked())); connect(ui.pushButton_add,SLOT(on_action_Button_clicked())); connect(ui.pushButton_div,SLOT(on_action_Button_clicked())); connect(ui.pushButton_mul,SLOT(on_action_Button_clicked())); connect(ui.pushButton_sub,SLOT(on_action_Button_clicked())); connect(ui.pushButton_right,SLOT(on_action_Button_clicked())); connect(ui.pushButton_left,SLOT(on_action_Button_clicked())); connect(ui.pushButton_dian,SLOT(on_comma_Button_clicked())); connect(ui.pushButton_del,SLOT(on_action_Button_d_clicked())); connect(ui.pushButton_re,SLOT(on_action_Button_c_clicked())); connect(ui.pushButton_equ,SLOT(on_action_Button_e_clicked())); /* //沒有優先順序的計算器 connect(ui.pushButton0,SLOT(on_action_Button_clicked())); connect(ui.pushButton_re,SLOT(on_action_Button_c_clicked())); connect(ui.pushButton_equ,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沒有解決;
- 部分程式碼需要優化,重構;
- 沒有實現輸入錯誤表示式報錯功能,需要輸入正確的表示式。
- 不支援負數計算。
- 支援小數,加,減,乘,除,括號運算。
到此這篇關於C++結合QT實現帶有優先順序的計算器的文章就介紹到這了,更多相關C++實現計算器內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!