项目一源代码

.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();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值