qt 计算器实现(中缀转后缀,后缀计算)

来源:互联网 发布:矩阵潜袭扩展和循环 编辑:程序博客网 时间:2024/05/16 19:47

我先把界面贴出来


界面就是这样子的,当然也可以不是这样子的,自己设计,怎么好看怎么来

我来简介下按钮的对象 0到9 就是

pushButton9,
pushButton8等等
我先把界面的代码贴出来
其实蛮简单的,就是让其生成正确的中缀,然后进行中缀转后缀处理。
关键是如何是生成正确的中缀。处理好0到9和括号还有+-*/等直接的关系。就是一个逻辑
1.数字不能出现两个小数点
2.不能同时出现两个操作符。比如++。-+。等
3.括号要匹配
4.操作符之间的输入要正确 等#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "kuohao_stack.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();    QString all;//记录全部其信息     QString only_num;//记录数字其信息     QString x(QString s);//我测试用的,没啥用private slots:     void on_pushButton1_clicked();     void on_pushButton2_clicked();     void on_pushButton3_clicked();     void on_pushButton4_clicked();     void on_pushButton5_clicked();     void on_pushButton6_clicked();     void on_pushButton7_clicked();     void on_pushButton8_clicked();     void on_pushButton9_clicked();     void on_pushButton0_clicked();     void on_pushButton_dot_clicked();     void on_pushButton_add_clicked();     void on_pushButton_sub_clicked();     void on_pushButton_mul_clicked();     void on_pushButton_div_clicked();     void on_pushButton_4_clicked();     void on_pushButton_3_clicked();     void on_pushButton_clicked();     void on_pushButton_2_clicked();     void on_pushButton_res_clicked();     //void on_pushButton_close_clicked();private:    Ui::MainWindow *ui;};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit->setReadOnly(true);
    ui->lineEdit->setAlignment(Qt::AlignRight);
     ui->lineEdit_2->setAlignment(Qt::AlignRight);
   // ui->lineEdit_2->setStyleSheet("{border-width:0;border-style:outset;font: 20pt}");//除边框
   // ui->lineEdit->setStyleSheet("{border-width:0;border-style:outset;font: 20pt}");
}
QString MainWindow::x(QString s)
{
    return s;
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_pushButton1_clicked()
{
    all=ui->lineEdit->text();//先保存输入的
    all+="1" ;              //然后再增加
    only_num+="1";       //这个是保持数字的变量 为了让其不出现两个小数点
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton2_clicked()
{
    all=ui->lineEdit->text();
    all+="2" ;
    only_num+="2";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton3_clicked()
{
    all=ui->lineEdit->text();
    all+="3" ;
    only_num+="3";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton4_clicked()
{
    all=ui->lineEdit->text();
    all+="4" ;
    only_num+="4";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton5_clicked()
{
    all=ui->lineEdit->text();
    all+="5" ;
    only_num+="5";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton6_clicked()
{
    all=ui->lineEdit->text();
    all+="6" ;
    only_num+="6";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton7_clicked()
{
    all=ui->lineEdit->text();
    all+="7" ;
    only_num+="7";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton8_clicked()
{
    all=ui->lineEdit->text();
    all+="8" ;
    only_num+="8";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton9_clicked()
{
    all=ui->lineEdit->text();
    all+="9" ;
    only_num+="9";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton0_clicked()
{
    all=ui->lineEdit->text();
    all+="0" ;
    only_num+="0";
    ui->lineEdit->setText(all);
    ui->lineEdit_2->setText(all);
}
void MainWindow::on_pushButton_dot_clicked()
{
    all=ui->lineEdit->text();
     if(only_num!=""&&!ui->lineEdit->text().isEmpty()&&only_num.indexOf('.')==-1&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='(')
     {
      all+="." ;
      only_num+=".";
      ui->lineEdit->setText(all);
      ui->lineEdit_2->setText(all);
     }
     else
        {
        qDebug()<<"错误操作.";
     }
}
void MainWindow::on_pushButton_add_clicked()
{
    all=ui->lineEdit->text();
    if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('&&all[all.length()-1]!='.')
    {
        all+='+';
        ui->lineEdit->setText(all);
        ui->lineEdit_2->setText(all);
        only_num="";
    }
    else
    {
        qDebug()<<"错误操作+";
    }
}
void MainWindow::on_pushButton_sub_clicked()
{
    all=ui->lineEdit->text();
    if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('&&all[all.length()-1]!='.')
    {
        all+='-';
        ui->lineEdit->setText(all);
        ui->lineEdit_2->setText(all);
        only_num="";
    }
    else
    {
        qDebug()<<"错误操作-";
    }
}
void MainWindow::on_pushButton_mul_clicked()
{
    all=ui->lineEdit->text();
    if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('&&all[all.length()-1]!='.')
    {
        all+='*';
        ui->lineEdit->setText(all);
        ui->lineEdit_2->setText(all);
        only_num="";
    }
    else
    {
        qDebug()<<"错误操作*";
    }
}
void MainWindow::on_pushButton_div_clicked()
{
    all=ui->lineEdit->text();
    if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/'&&all[all.length()-1]!='('&&all[all.length()-1]!='.')
    {
        all+='/';
        ui->lineEdit->setText(all);
        ui->lineEdit_2->setText(all);
        only_num="";
    }
    else
    {
        qDebug()<<"错误操作/";
    }
}
void MainWindow::on_pushButton_4_clicked()//清除
{
    ui->lineEdit->setText("");
    ui->lineEdit_2->setText("");
    all="";
    only_num="";
}
void MainWindow::on_pushButton_3_clicked()//回退
{
    all=ui->lineEdit->text();
    if(all.length()!=0)
    {
        if(all[all.length()-1]<=57&&all[all.length()-1]>=48)
        {
            only_num[only_num.length()-1]=' ';
              all.remove(' ');
        }
         all[all.length()-1]=' ';
         all.remove(' ');
         ui->lineEdit->setText(all);
         ui->lineEdit_2->setText(all);
    }
    else
    {
        qDebug()<<"回退操作错误";
    }
   qDebug()<<only_num;
}
void MainWindow::on_pushButton_clicked()// (
{
    all=ui->lineEdit->text();
    //ui->lineEdit->setStyleSheet(QString(":focus{ background-color: red; }"));
    if(ui->lineEdit->text().isEmpty())
    {
        all+='(';
        ui->lineEdit->setText(all);
        ui->lineEdit_2->setText(all);
    }
    else if(all[all.length()-1]!='.'&&!(all[all.length()-1]<=57&&all[all.length()-1]>=48))
    {
        all+='(';
        ui->lineEdit->setText(all);
        ui->lineEdit_2->setText(all);
    }
    else
    {
        qDebug()<<"错误操作(";
        return;
    }
    kuohao_stack k;
    if(k.kuohao(k.l,all)!=1)
    {
        ui->pushButton_res->setEnabled(false);
    }
    else
        ui->pushButton_res->setEnabled(true);
}
void MainWindow::on_pushButton_2_clicked()// 
{
    all=ui->lineEdit->text();
    //ui->lineEdit->setStyleSheet(QString(":focus{ background-color: red; }"));
     if(!ui->lineEdit->text().isEmpty()&&all[all.length()-1]!='.'&&all[all.length()-1]!='+'&&all[all.length()-1]!='-'&&all[all.length()-1]!='*'&&all[all.length()-1]!='/')
    {
        all+=')';
        ui->lineEdit->setText(all);
        ui->lineEdit_2->setText(all);
    }
    else
    {
        qDebug()<<"错误操作)";
        return;
    }
    kuohao_stack k;
    if(k.kuohao(k.l,all)!=1&&all[all.length()-1]=='+'&&all[all.length()-1]=='-'&&all[all.length()-1]=='*'&&all[all.length()-1]=='/'&&all[all.length()-1]=='.')
    {
        ui->pushButton_res->setEnabled(false);
    }
    else
        ui->pushButton_res->setEnabled(true);
}
void MainWindow::on_pushButton_res_clicked()//结算 把中缀变后缀在然后再计算
{
    kuohao_stack k;
    QString s1;
    k.init(k.l);//
   s1=ui->lineEdit->text();
    qDebug()<<s1;
   double x=k.math(k.l,s1);
   qDebug()<<x;
   ui->lineEdit->setText(QString::number(x));
   all="";
   only_num=ui->lineEdit->text();
}
/*void MainWindow::on_pushButton_close_clicked()//关闭计算器
{
         QApplication* app;
               app->quit();
}
*/
然后是算法代码
#ifndef KUOHAO_STACK_H
#define KUOHAO_STACK_H
#include <QString>
typedef struct{
    //int max=10;
    char a[10];
    int top;
}slist_stack;
class kuohao_stack
{
public:
    kuohao_stack();
    slist_stack *l;
    void init(slist_stack *l);
   int kuohao(slist_stack *l,QString c);
   double math(slist_stack *l,QString c);//转后缀 再计算
   double readnumber(char f[],int *i);
   int is_operation(char op);
   int priority(char op);
};
#endif // KUOHAO_STACK_H
#include "kuohao_stack.h"
#include <QDebug>
kuohao_stack::kuohao_stack()
{
}
void kuohao_stack::init(slist_stack *l)
{
    l->top=0;
}
int kuohao_stack::is_operation(char op)
{
    switch(op)
    {
    case '+':
    case '-':
    case '*':
    case '/':return 1;
    default:return 0;
    }
}
int kuohao_stack::priority(char op)
{
    switch(op)
    {
    case '#':return -1;
    case '(':return 0;
    case '+':
    case '-':return 1;
    case '*':
    case '/':return 2;
    default:return -1;
    }
}
double kuohao_stack::readnumber(char f[], int *i)
{
    double x=0.0;
    int k=0;
    while(f[*i]>='0'&&f[*i]<='9')
    {
        x=x*10+(f[*i]-'0');
        (*i)++;
    }
    if(f[*i]=='.')
    {
        (*i)++;
        while(f[*i]>='0'&&f[*i]<='9')
        {
            x=x*10+(f[*i]-'0');
            (*i)++;
            k++;
        }
    }
    while(k!=0)
    {
        x=x/10.0;
        k=k-1;
    }
    return x;
}
int kuohao_stack::kuohao(slist_stack *l,QString c1)//括号匹配
{
    l->top=0;
    int i=0;
    std::string str = c1.toStdString();//把QString 转化为char数组
    const char* c= str.c_str();
     qDebug()<<c;
    while(i<c1.length())
    {
        if(c[i]=='(')
        {
            l->a[l->top++]=c[i];
        }
        if(c[i]==')')
        {
            l->top--;
        }
        i++;
    }
    if(l->top==0)
        return 1;
    else
        return -1;
}
double kuohao_stack::math(slist_stack *l, QString c1)//转后缀
{
    if(c1[c1.length()-1]=='/'||c1[c1.length()-1]=='*'||c1[c1.length()-1]=='.')
     {
        c1=QString(c1+"1#");
     }
    else  if(c1[c1.length()-1]=='+'||c1[c1.length()-1]=='-')
    {
        c1=QString(c1+"0#");
    }
    else
    {
        c1=QString(c1+"#");
    }
   int i=0,j=0;
    char opst[100],f[100];
    std::string str = c1.toStdString();
    const char* e= str.c_str();
   qDebug()<<e;
   int t1=0,t;
    opst[t1]='#';
    t1++;
    while(e[i]!='#')
    {
        if((e[i]>='0'&&e[i]<='9')||e[i]=='.')
            f[j++]=e[i];
        else if(e[i]=='(')
        {
            opst[t1]=e[i];
            t1++;
        }
        else if(e[i]==')')
        {
            t=t1-1;
            while(opst[t]!='(')
            {
                f[j++]=opst[--t1];
                t=t1-1;
                t1--;
            }
        }
        else if(is_operation(e[i]))
        {
            f[j++]=' ';
            while (priority(opst[t1-1])>=priority(e[i]))
                f[j++]=opst[--t1];
            opst[t1]=e[i];
            t1++;
        }
        i++;
    }
    while(t1)
        f[j++]=opst[--t1];
    //        后缀计算
    double obst[100];
    int t2=0;
    int i1=0;
    double x1,x2;
    while(f[i1]!='#')
    {
        if(f[i1]>='0'&&f[i1]<='9')
        {
            obst[t2]=readnumber(f,&i1);
            t2++;
        }
        else if(f[i1]==' ')
        {
            i1++;
        }
        else if(f[i1]=='+')
        {
             x2=obst[--t2];
             x1=obst[--t2];
             obst[t2]=x1+x2;
             t2++;
             i1++;
         }
        else if(f[i1]=='-')
        {
             x2=obst[--t2];
             x1=obst[--t2];
             obst[t2]=x1-x2;
             t2++;
             i1++;
         }
        else if(f[i1]=='*')
        {
             x2=obst[--t2];
             x1=obst[--t2];
             obst[t2]=x1*x2;
             t2++;
             i1++;
         }
        else if(f[i1]=='/')
        {
             x2=obst[--t2];
             x1=obst[--t2];
             if(x2==0)
             {
                  obst[t2]=0;
                  qDebug()<<"除数不能为O";
                   return 0;
             }
             else
             {
                 obst[t2]=x1/x2;
                 t2++;
                 i1++;
             }
         }
    }
     return obst[0];
}
要源代码的留邮箱号,不想挂在csdn的下载里

阅读全文
1 0
原创粉丝点击