大二用qt写的简易计算机,已经修改完bug,请放心食用
输入的时候一定用按钮,不要直接在文本框中输入
在qt中新建这几个文件,运行就OK了
main.cpp
#include "calculator.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);calculator w;w.show();return a.exec();
}
calculator.h的代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include<QPushButton>
#include<QLineEdit>
#include<QHBoxLayout>
#include<QVBoxLayout>
#include<QGridLayout>
#include<QString>
#include<QStack>
#include<QTime>
#include<iterator>
class calculator : public QMainWindow
{Q_OBJECTpublic:calculator(QWidget *parent = 0);~calculator();private:QLineEdit *inputLine;//显示框QString input="0"; //输入框bool flat=false;//0-9按钮QPushButton *zeroButton;QPushButton *oneButton;QPushButton *twoButton;QPushButton *threeButton;QPushButton *fourButton;QPushButton *fiveButton;QPushButton *sixButton;QPushButton *sevenButton;QPushButton *eightButton;QPushButton *nineButton;QPushButton *addButton;QPushButton *subButton;QPushButton *divButton;QPushButton *mulButton;QPushButton *equButton;QPushButton *timButton; //TimeQPushButton *decButton;QPushButton *botButton;QPushButton *CEButton;QPushButton *ACButton;QPushButton *lefButton;QPushButton *rigButton;private slots:void buttonZeroClicked();void buttonOneClicked();void buttonTwoClicked();void buttonThreeClicked();void buttonFourClicked();void buttonFiveClicked();void buttonSixClicked();void buttonSevenClicked();void buttonEightClicked();void buttonNineClicked();void buttonAddClicked();//+void buttonSubClicked();//-void buttonMulClicked();//乘void buttonDivClicked();//除void buttonTimClicked(); //时间void buttonDecClicked();//小数点void buttonBotClicked(); //加减号void buttonEquClicked();//等于号void buttonLefClicked();//左括号void buttonRigClicked();//右括号void buttonCEClicked();//CEvoid buttonACClicked();//AC
};#endif // MAINWINDOW_H
calculator.cpp的代码
#include "calculator.h"
#include<iostream>
using namespace std;
#include<stack>
#include<vector>
#include<cstdlib>
#include<limits.h>
#pragma execution_character_set("utf-8")
bool isNum(char ch);
bool isOperate(char ch);
int level(char ch);
double scd(string s);
double getValue(vector<string> V);
vector<string> midToPost(string s);calculator::calculator(QWidget *parent) : QMainWindow(parent)
{QWidget *widget=new QWidget; //构建一个QWidget布局将设置的布局添加进这个QWidgetthis->setCentralWidget(widget);inputLine=new QLineEdit;inputLine->setText(input);zeroButton=new QPushButton("0");oneButton=new QPushButton("1");twoButton=new QPushButton("2");threeButton=new QPushButton("3");fourButton=new QPushButton("4");fiveButton=new QPushButton("5");sixButton=new QPushButton("6");sevenButton=new QPushButton("7");eightButton=new QPushButton("8");nineButton=new QPushButton("9");decButton=new QPushButton(".");botButton=new QPushButton("±");timButton=new QPushButton("Time");addButton=new QPushButton("+");subButton=new QPushButton("-");mulButton=new QPushButton("*");divButton=new QPushButton("/");equButton=new QPushButton("=");lefButton=new QPushButton("(");rigButton=new QPushButton(")");CEButton=new QPushButton("CE");ACButton=new QPushButton("AC");QGridLayout *H=new QGridLayout(this); //声明了一个网格布局inputLine->setFixedHeight(50); //调整第一行大小CEButton->setFixedHeight(50);ACButton->setFixedHeight(50);H->addWidget(inputLine,0,0,1,3);H->setRowStretch(0,100);H->addWidget(CEButton,0,3);H->addWidget(ACButton,0,4);H->addWidget(oneButton,1,0);H->addWidget(twoButton,1,1);H->addWidget(threeButton,1,2);H->addWidget(botButton,1,3);H->addWidget(timButton,1,4);H->addWidget(fourButton,2,0);H->addWidget(fiveButton,2,1);H->addWidget(sixButton,2,2);H->addWidget(addButton,2,3);H->addWidget(subButton,2,4);H->addWidget(sevenButton,3,0);H->addWidget(eightButton,3,1);H->addWidget(nineButton,3,2);H->addWidget(mulButton,3,3);H->addWidget(divButton,3,4);H->addWidget(zeroButton,4,0);H->addWidget(decButton,4,1);H->addWidget(lefButton,4,2);H->addWidget(rigButton,4,3);H->addWidget(equButton,4,4);widget->setLayout(H); //将布局显示出来connect(zeroButton,SIGNAL(clicked()),this,SLOT(buttonZeroClicked()));//信号与槽函数connect(oneButton,SIGNAL(clicked()),this,SLOT(buttonOneClicked()));connect(twoButton,SIGNAL(clicked()),this,SLOT(buttonTwoClicked()));connect(threeButton,SIGNAL(clicked()),this,SLOT(buttonThreeClicked()));connect(fourButton,SIGNAL(clicked()),this,SLOT(buttonFourClicked()));connect(fiveButton,SIGNAL(clicked()),this,SLOT(buttonFiveClicked()));connect(sixButton,SIGNAL(clicked()),this,SLOT(buttonSixClicked()));connect(sevenButton,SIGNAL(clicked()),this,SLOT(buttonSevenClicked()));connect(eightButton,SIGNAL(clicked()),this,SLOT(buttonEightClicked()));connect(nineButton,SIGNAL(clicked()),this,SLOT(buttonNineClicked()));connect(addButton,SIGNAL(clicked()),this,SLOT(buttonAddClicked()));connect(subButton,SIGNAL(clicked()),this,SLOT(buttonSubClicked()));connect(mulButton,SIGNAL(clicked()),this,SLOT(buttonMulClicked()));connect(divButton,SIGNAL(clicked()),this,SLOT(buttonDivClicked()));connect(botButton,SIGNAL(clicked(bool)),this,SLOT(buttonBotClicked()));//正负号connect(timButton,SIGNAL(clicked(bool)),this,SLOT(buttonTimClicked()));//时间connect(decButton,SIGNAL(clicked(bool)),this,SLOT(buttonDecClicked()));//点号connect(lefButton,SIGNAL(clicked(bool)),this,SLOT(buttonLefClicked()));//左括号connect(rigButton,SIGNAL(clicked(bool)),this,SLOT(buttonRigClicked()));//右括号connect(CEButton,SIGNAL(clicked()),this,SLOT(buttonCEClicked()));connect(ACButton,SIGNAL(clicked()),this,SLOT(buttonACClicked()));connect(equButton,SIGNAL(clicked()),this,SLOT(buttonEquClicked())); //等于号*/}void calculator::buttonZeroClicked() //以下是实现相应的槽函数
{if(input=="0")input='0';else input=input+'0';inputLine->setText(input);
}void calculator::buttonOneClicked()
{if(input=="0")input='1';else input=input+'1';inputLine->setText(input);
}void calculator::buttonTwoClicked()
{if(input=="0")input='2';else input=input+'2';inputLine->setText(input);
}void calculator::buttonThreeClicked()
{if(input=="0")input='3';else input=input+'3';inputLine->setText(input);
}void calculator::buttonFourClicked()
{if(input=="0")input='4';else input=input+'4';inputLine->setText(input);
}void calculator::buttonFiveClicked()
{if(input=="0")input='5';else input=input+'5';inputLine->setText(input);
}void calculator::buttonSixClicked()
{if(input=="0")input='6';else input=input+'6';inputLine->setText(input);
}void calculator::buttonSevenClicked()
{if(input=="0")input='7';else input=input+'7';inputLine->setText(input);
}void calculator::buttonEightClicked()
{if(input=="0")input='8';else input=input+'8';inputLine->setText(input);
}void calculator::buttonNineClicked()
{if(input=="0")input='9';else input=input+'9';inputLine->setText(input);
}void calculator::buttonAddClicked()
{if(input=="0")input='+';else input=input+'+';inputLine->setText(input);
}void calculator::buttonSubClicked()
{if(input=="0")input='-';else input=input+'-';inputLine->setText(input);
}void calculator::buttonMulClicked()
{if(input=="0")input='*';else input=input+'*';inputLine->setText(input);
}void calculator::buttonDivClicked()
{if(input=="0")input='/';else input=input+'/';inputLine->setText(input);
}void calculator::buttonTimClicked() //Time
{input=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"); //格式化输出当前时间inputLine->setText(input);
}void calculator::buttonDecClicked() //小数点
{if(input=="0")input='.';else input=input+'.';inputLine->setText(input);
}void calculator::buttonBotClicked() //加减号
{if(input=="0")input='-';else{QString::iterator p=input.end();p--;if('-'==*p)input=input.left(input.length()-1);else input=input+'-';}inputLine->setText(input);
}void calculator::buttonLefClicked()//左括号
{if(input=="0")input='(';else input=input+'(';inputLine->setText(input);
}void calculator::buttonRigClicked()//右括号
{if(input=="0")input=')';else input=input+')';inputLine->setText(input);
}void calculator::buttonCEClicked()
{input = input.left(input.length()-1); //减去一字符inputLine->setText(input);
}
void calculator::buttonACClicked() //直接清空
{input='0';inputLine->setText(input);
}void calculator::buttonEquClicked()//等于号
{string inputTemp = input.toStdString();vector<string> expression = midToPost(inputTemp);double value = getValue(expression);if(value != INT_MAX) {input=input+"="+QString::number(value);inputLine->setText(input);}else{input=input+"=syntax error";inputLine->setText(input);}
}bool isNum(char ch) {if(ch >= '0' && ch <= '9') return true;else return false;
}bool isOperate(char ch) {if(ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')')return true;else return false;
}int level(char ch) {switch(ch) {case '(' :return 5;case '*' :return 4;case '/' :return 4;case '+' :return 3;case '-' :return 3;case ')':return 2;}
}
/*字符串转数字*/
double scd(string s) {if(s.length() == 0) return INT_MAX;bool flag = false;for(int i = 0; i < s.length(); i++) {if(i == 0 && s[i] == '-') continue;else if(s[i] == '.' && !flag) {if(i > 0 && isNum(s[i-1])) {flag = true;continue;}else return INT_MAX;}else if(isNum(s[i])) continue;else return INT_MAX;}double result = atof(s.c_str());return result;
}/*由中缀表达式得到后缀表达式, 向量V存储结果*/
vector<string> midToPost(string s) {stack<char> S; /*符号栈*/vector<string> V; /*后缀表达式*/int i = 0;while(i < s.length()) {if(isNum(s[i])) {string str = "";while(isNum(s[i]) || s[i] == '.') {str += s[i];i++;}V.push_back(str);}else if(isOperate(s[i])){/*负数情况*/if(s[i] == '-' && (i == 0 || !isNum(s[i-1])) {string str = "-"; i++;while(isNum(s[i]) || s[i] == '.') {str += s[i]; i++;}V.push_back(str);}else{if(S.empty()){S.push(s[i]); i++;}else {int initial = level(s[i]);if(initial == 2) {while(level(S.top()) != 5 && !s.empty()) {string str = "";str += S.top();V.push_back(str);S.pop();}if(S.top() == '(') S.pop(); i++;} else {while(!S.empty() && initial <= level(S.top()) && level(S.top()) != 5) {string str = "";str += S.top();V.push_back(str);S.pop();}S.push(s[i]); i++;}}}}else{cout << "表达式出错" << endl;V.clear();return V;}}while(!S.empty()) {string str = ""; str += S.top();S.pop();V.push_back(str);}//for(int i = 0; i < V.size(); i++) cout << V[i] << "[]";return V;
}/*后缀表达式得到最终结果*/
double getValue(vector<string> V) {stack<double> S;for(int i = 0; i < V.size(); i++) {/*操作运算符*/if(V[i].length() == 1 && isOperate(V[i][0])) {double a = 0, b = 0;if(!S.empty()) {a = S.top(); S.pop();}else return INT_MAX;if(!S.empty()) {b = S.top(); S.pop();}else return INT_MAX;switch(V[i][0]) {case '+':S.push(b+a);break;case '-':S.push(b-a);break;case '*':S.push(b*a);break;case '/':S.push(b/a);break;default:return INT_MAX;}}else {if(scd(V[i]) == INT_MAX) return INT_MAX;else S.push(scd(V[i]));}}if(S.empty()) return INT_MAX;double value = S.top();S.pop();return value;
}calculator::~calculator()
{}
如果有问题,请先 关注 + 点赞 + 收藏, 再联系 1016824906
源码链接 https://download.csdn.net/download/zycxnanwang/11224121