一、描述
只有简单的加减乘除功能,界面分布如下
二、代码
这个是MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QString calculate(const QString &exp);
private slots:
void on_btn_clicked();
void on_operator_clicked();
void on_result_clicked();
void on_del_clicked();
private:
Ui::MainWindow *ui;
QString expression;
};
#endif // MAINWINDOW_H
这个是MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStack>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->btn0,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->btn1,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->btn2,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->btn3,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->butn4,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->btn5,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->btn6,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->btn7,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->btn8,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->btn9,&QPushButton::clicked,this,&MainWindow::on_btn_clicked);
connect(ui->add,&QPushButton::clicked,this,&MainWindow::on_operator_clicked);
connect(ui->sub,&QPushButton::clicked,this,&MainWindow::on_operator_clicked);
connect(ui->mul,&QPushButton::clicked,this,&MainWindow::on_operator_clicked);
connect(ui->div,&QPushButton::clicked,this,&MainWindow::on_operator_clicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_btn_clicked()
{
QPushButton *button=qobject_cast<QPushButton*>(sender());
expression+=button->text();
ui->show->setText(expression);
}
void MainWindow::on_operator_clicked()
{
QPushButton* button=qobject_cast<QPushButton*>(sender());
if((expression.back()=='1')||(expression.back()=='2')||(expression.back()=='3')||(expression.back()=='4')||(expression.back()=='5')||(expression.back()=='6')||(expression.back()=='7')||(expression.back()=='8')||(expression.back()=='9'))
{
expression+=button->text();
ui->show->setText(expression);
}
}
//确定运算符优先级的函数
int precedence(QChar op){
if((op=='+')||(op=='-')){
return 1;
}else if((op=='*')||(op=='/')){
return 2;
}
return 0;
}
//真的在计算的那部分
int realCacul(QString op,int a,int b){
switch(op[0].toLatin1()){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return b!=0?a/b:0;
}
return 0;
}
void MainWindow::on_result_clicked()
{
if((expression.back()=='1')||(expression.back()=='2')||(expression.back()=='3')||(expression.back()=='4')||(expression.back()=='5')||(expression.back()=='6')||(expression.back()=='7')||(expression.back()=='8')||(expression.back()=='9'))
{
//下方的结果栏res显示计算结果
ui->res->setText(calculate(expression));
qDebug()<<calculate(expression);
//上方的show显示栏显示公式
expression+=ui->result->text();
ui->show->setText(expression);
}
}
//运算的主题结构
QString MainWindow::calculate(const QString &exp){
QStack<QChar> operators;//运算符栈
QStack<int> values;//数值栈
QString numStr;//暂存数字
//拆解表达式
for(int i=0;i<exp.length();i++){
QChar ch = exp[i];
if(ch.isDigit()){
//如果是数字
numStr+=ch;//拼接数字
}else{
//如果是符号
if(!numStr.isEmpty()){
//把上一个数字压入数字栈
values.push(numStr.toInt());
numStr.clear();
}
//检查当前运算符和栈顶元素的优先级
if(!operators.isEmpty()&&(precedence(operators.top())>precedence(ch))){
//运算符栈顶元素优先级大于当前运算符
int val2=values.pop();
int val1=values.pop();
values.push(realCacul(operators.pop(),val1,val2));
}
operators.push(ch);
}
}
//处理最后一个数字
if(!numStr.isEmpty()){
values.push((numStr.toInt()));
}
//处理剩余运算符
while(!operators.isEmpty()){
int val2=values.pop();
int val1=values.pop();
values.push(realCacul(operators.pop(),val1,val2));
}
//返回结果
return QString::number(values.top());
}
void MainWindow::on_del_clicked()
{
expression.removeLast();
ui->show->setText(expression);
}
这是main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}