.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMessageBox>
#include "dialog_history.h"
#include<cmath>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_button_9_clicked();
void on_button_0_clicked();
void on_button_dian_clicked();
void on_button_chu_clicked();
void on_button_den_clicked();
void on_button_2_clicked();
void on_button_1_clicked();
void on_button_3_clicked();
void on_button_4_clicked();
void on_button_5_clicked();
void on_button_6_clicked();
void on_button_7_clicked();
void on_button_8_clicked();
void on_button_cheng_clicked();
void on_button_jian_clicked();
void on_button_jia_clicked();
void on_button_clear_clicked();
void on_button_delete_clicked();
void on_button_zuo_clicked();
void on_button_you_clicked();
void on_button_history_clicked();
private:
Ui::Widget *ui;
Dialog_history h;
};
#endif // WIDGET_H
.cpp
#include<iostream>
#include<string>
#include<stack>
#include<math.h>
#include<cmath>
#include<stdlib.h>
using namespace std;
//优先级
int operate(char ch){
if(ch=='(') return 0;
else if(ch=='+'||ch=='-') return 1;
else if(ch=='*'||ch=='/'||ch=='%') return 2;
else return 4;
}
//计算
void calculate(char temp,stack<double>&Num){
double a=Num.top();Num.pop();
double innum;
double b=Num.top();Num.pop();
if(temp=='+')innum=b+a;
else if(temp=='-')innum=b-a;
else if(temp=='*')innum=b*a;
else if(temp=='/')innum=b/a;
Num.push(innum);
}
//中缀转后缀,双栈法
double twoStack(string str){
stack<double> Num;//存数字
stack<char> Ch;//存操作符
int i = 0, j;
int size = str.size();
string num;
char temp;
while (i < size) {
if (str[i] >= '0' && str[i] <= '9') {
j = i;
while ((j < size && str[j] >= '0' && str[j] <= '9') || str[j]=='.') { j++; }
//从下标i开始截取长度为j-i的字符
num = str.substr(i, j - i);
//atoi函数将字符串转换成浮点型数
Num.push(atoi(num.c_str()));
i = j;
}
else if(str[i]=='('||str[i]==')'){
if (str[i]=='(') Ch.push(str[i]);
else{
while(Ch.top()!='('){
temp=Ch.top();
Ch.pop();
calculate(temp, Num);
}
Ch.pop();//左括号出栈
}
i++;
}
else{
if (Ch.empty()) {
Ch.push(str[i]);
}
else {
while (!Ch.empty()) {
temp = Ch.top();
if (operate(temp) >= operate(str[i])) {
Ch.pop();
calculate(temp, Num);
}
else break;
}
Ch.push(str[i]);
}
i++;
}
}
while(!Ch.empty()){
temp=Ch.top();
Ch.pop();
calculate(temp,Num);
}
return Num.top();
}
*****************************************************************
#include "widget.h"
#include "ui_widget.h"
#include "calculate.cpp"
#include<QString>
int isright(string str);
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setFixedSize(this->size());
}
Widget::~Widget()
{
delete ui;
}
//存储算式
string str;
string his_str;
//连接信号与槽
void Widget::on_button_0_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"0");
str.push_back('0');
}
void Widget::on_button_1_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"1");
str.push_back('1');
}
void Widget::on_button_2_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"2");
str.push_back('2');
}
void Widget::on_button_3_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"3");
str.push_back('3');
}
void Widget::on_button_4_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"4");
str.push_back('4');
}
void Widget::on_button_5_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"5");
str.push_back('5');
}
void Widget::on_button_6_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"6");
str.push_back('6');
}
void Widget::on_button_7_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"7");
str.push_back('7');
}
void Widget::on_button_8_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"8");
str.push_back('8');
}
void Widget::on_button_9_clicked()
{
ui->lineEdit->setText(ui->lineEdit->text()+"9");
str.push_back('9');
}
void Widget::on_button_dian_clicked()
{
if(str.back()>='0'&&str.back()<='9')//运算符前面不能没有数、点前面只能是数
{
ui->lineEdit->setText(ui->lineEdit->text()+".");
str.push_back('.');
}
}
//加减乘除
void Widget::on_button_chu_clicked()
{
if(str.back()=='+'||str.back()=='-'||str.back()=='*'||str.back()=='/')
{
ui->lineEdit->backspace();
ui->lineEdit->setText(ui->lineEdit->text()+"÷");
str.pop_back();
str.push_back('/');
return;
}
if((str.back()>='0'&&str.back()<='9')||str.back()==')')
{//运算符前只能是数字或")"
ui->lineEdit->setText(ui->lineEdit->text()+"÷");
str.push_back('/');
}
}
void Widget::on_button_cheng_clicked()
{
if(str.back()=='+'||str.back()=='-'||str.back()=='*'||str.back()=='/')
{
ui->lineEdit->backspace();
ui->lineEdit->setText(ui->lineEdit->text()+"×");
str.pop_back();
str.push_back('*');
return;
}
if((str.back()>='0'&&str.back()<='9')||str.back()==')')
{
ui->lineEdit->setText(ui->lineEdit->text()+"×");
str.push_back('*');
}
}
void Widget::on_button_jian_clicked()
{
if(str.back()=='+'||str.back()=='-'||str.back()=='*'||str.back()=='/')
{
ui->lineEdit->backspace();
ui->lineEdit->setText(ui->lineEdit->text()+"-");
str.pop_back();
str.push_back('-');
return;
}
if((str.back()>='0'&&str.back()<='9')||str.back()==')')
{
ui->lineEdit->setText(ui->lineEdit->text()+"-");
str.push_back('-');
}
}
void Widget::on_button_jia_clicked()
{
if(str.back()=='+'||str.back()=='-'||str.back()=='*'||str.back()=='/')
{
ui->lineEdit->backspace();
ui->lineEdit->setText(ui->lineEdit->text()+"+");
str.pop_back();
str.push_back('+');
return;
}
if((str.back()>='0'&&str.back()<='9')||str.back()==')')
{
ui->lineEdit->setText(ui->lineEdit->text()+"+");
str.push_back('+');
}
}
void Widget::on_button_clear_clicked()
{
ui->label_out->setText("结果");
ui->lineEdit->clear();
str.clear();
}
void Widget::on_button_delete_clicked()
{
if(!str.empty())
{
ui->lineEdit->backspace();
str.pop_back();
}
}
void Widget::on_button_zuo_clicked()
{
if((str.back()>='0'&&str.back()<='9')||str.back()==')')return;
ui->lineEdit->setText(ui->lineEdit->text()+"(");
str.push_back('(');
}
void Widget::on_button_you_clicked()
{
if(!str.empty()&&str.back()!='(')
{
ui->lineEdit->setText(ui->lineEdit->text()+")");
str.push_back(')');
}
}
//等号
void Widget::on_button_den_clicked()
{
if(isright(str)==1){
return;
}
double result=twoStack(str);
//保存历史数据
QString qstr=ui->lineEdit->text();
ui->lineEdit->setText("");
ui->label_out->setText(QString::number(result));
his_str.append(qstr.toStdString()+"="+to_string(result)+'\n');
str.clear();
}
//校验
int isright(string str)
{
if(str.length()==0)return 1;
if(str.back()=='+'||str.back()=='-'||str.back()=='*'||str.back()=='/'||
str.back()=='.'||str.back()=='(')
{
QMessageBox box;
box.setText("运行错误");
box.exec();
return 1;
}
return 0;
}
//历史记录
void Widget::on_button_history_clicked()
{
h.setext(QString::fromStdString(his_str));
h.exec();
}