C++結(jié)合QT實現(xiàn)帶有優(yōu)先級的計算器功能
更新時間:2021年01月05日 17:13:30 作者:ruokey_1
這篇文章主要介紹了C++結(jié)合QT實現(xiàn)帶有優(yōu)先級的計算器,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
代碼
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())); /* //沒有優(yōu)先級的計算器 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()//小數(shù)點 { 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()//重置輸入框里的內(nèi)容 { ui.textBrowser->clear(); } void MyCalculator::on_action_Button_d_clicked()//刪除表達(dá)式中最后一個符號 { 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) {//優(yōu)先級設(shè)置 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;//用來判斷是否是數(shù)字 int xiaoshu = 1;//用來判斷是否是小數(shù)部分 double number = 0;//暫存數(shù)字 QString frist = input.left(1); while (isNum(frist)) //連續(xù)的數(shù)字轉(zhuǎn)化為一個整數(shù) { 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 == '=')//支持得到結(jié)果后仍可以繼續(xù)運(yùn)算 { Num.clear(); Act.clear(); input = input.right(input.length() - 1); frist = input.left(1); } if (i + 1 >= a) //當(dāng)表達(dá)式都進(jìn)棧后,只要符號棧不為空就繼續(xù)執(zhí)行 { 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();//將輸入框里的內(nèi)容給input double value = getjieguo(input);//將表達(dá)式傳給getjieguo來將數(shù)字和操作符分別入對應(yīng)的棧 ui.textBrowser->clear(); ui.textBrowser->append(input + "=" + QString::number(value));//將結(jié)果的類型由數(shù)字轉(zhuǎn)化為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)); } */
測試
表達(dá)式 | 結(jié)果 |
---|---|
2*3+6-(1+3) | 8 |
2+3*6-(1+3) | 16 |
2+3*6-(1.3+5/2) | 16.2 |
說明
- 自己的學(xué)習(xí)筆記 ,還有一些bug沒有解決;
- 部分代碼需要優(yōu)化,重構(gòu);
- 沒有實現(xiàn)輸入錯誤表達(dá)式報錯功能,需要輸入正確的表達(dá)式。
- 不支持負(fù)數(shù)計算。
- 支持小數(shù),加,減,乘,除,括號運(yùn)算。
到此這篇關(guān)于C++結(jié)合QT實現(xiàn)帶有優(yōu)先級的計算器的文章就介紹到這了,更多相關(guān)C++實現(xiàn)計算器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11中bind綁定器和function函數(shù)對象介紹
這篇文章主要介紹了C++11中bind綁定器和function函數(shù)對象介紹,綁定器,函數(shù)對象和lambda表達(dá)式只能使用在一條語句中,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-07-07基于C++實現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)
本文的主要思想是Kinect SDK 讀取彩色、深度、骨骼信息并用OpenCV顯示,非常的實用,有需要的小伙伴可以參考下2015-12-12