1. 程式人生 > >Qt實踐——簡易計算器

Qt實踐——簡易計算器

這個計算器實現了帶括號的加減乘除浮點數運算,但由於時間問題,我沒有新增浮點數的大數類,只是實現了一個簡易計算器。下面上程式:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QLineEdit>

class MainWindow : public QMainWindow
{
    Q_OBJECT
protected:
    double result;
    QLineEdit *data;
    QPushButton *button_0;
    QPushButton *button_1;
    QPushButton *button_2;
    QPushButton *button_3;
    QPushButton *button_4;
    QPushButton *button_5;
    QPushButton *button_6;
    QPushButton *button_7;
    QPushButton *button_8;
    QPushButton *button_9;
    QPushButton *button_ce;
    QPushButton *button_point;
    QPushButton *button_lbracket;
    QPushButton *button_rbracket;
    QPushButton *button_delete;
    QPushButton *button_jia;
    QPushButton *button_jian;
    QPushButton *button_cheng;
    QPushButton *button_chu;
    QPushButton *button_result;
    QString s;

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

public:
    void layout();
    void operation();
    void init();
private slots:
    void button_0_clicked();
    void button_1_clicked();
    void button_2_clicked();
    void button_3_clicked();
    void button_4_clicked();
    void button_5_clicked();
    void button_6_clicked();
    void button_7_clicked();
    void button_8_clicked();
    void button_9_clicked();
    void button_ce_clicked();
    void button_point_clicked();
    void button_lbracket_clicked();
    void button_rbracket_clicked();
    void button_delete_clicked();
    void button_result_clicked();
    void button_cheng_clicked();
    void button_chu_clicked();
    void button_jia_clicked();
    void button_jian_clicked();
};


#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QPushButton>
#include <QLineEdit>
#include <QGridLayout>
#include <stack>
#include <iostream>
using namespace std;

char infix[1000],suffix[1000];
int k=0;
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
}

void MainWindow::layout()
{
    QWidget *centerWindow = new QWidget;
    this->setCentralWidget(centerWindow);

    s = "";
    init();
    data = new QLineEdit("");

    button_0 = new QPushButton("0");
    button_1 = new QPushButton("1");
    button_2 = new QPushButton("2");
    button_3 = new QPushButton("3");
    button_4 = new QPushButton("4");
    button_5 = new QPushButton("5");
    button_6 = new QPushButton("6");
    button_7 = new QPushButton("7");
    button_8 = new QPushButton("8");
    button_9 = new QPushButton("9");
    button_ce = new QPushButton("CE");
    button_point = new QPushButton(".");
    button_lbracket = new QPushButton("(");
    button_rbracket = new QPushButton(")");
    button_delete = new QPushButton("<-");
    button_jia = new QPushButton("+");
    button_jian = new QPushButton("-");
    button_cheng = new QPushButton("*");
    button_chu = new QPushButton("/");
    button_result = new QPushButton("=");

    data->setFixedHeight(30);
    button_0->setMinimumHeight(50);
    button_1->setMinimumHeight(50);
    button_2->setMinimumHeight(50);
    button_3->setMinimumHeight(50);
    button_4->setMinimumHeight(50);
    button_5->setMinimumHeight(50);
    button_6->setMinimumHeight(50);
    button_7->setMinimumHeight(50);
    button_8->setMinimumHeight(50);
    button_9->setMinimumHeight(50);
    button_ce->setMinimumHeight(50);
    button_point->setMinimumHeight(50);
    button_lbracket->setMinimumHeight(50);
    button_rbracket->setMinimumHeight(50);
    button_delete->setMinimumHeight(50);
    button_jia->setMinimumHeight(50);
    button_jian->setMinimumHeight(50);
    button_cheng->setMinimumHeight(50);
    button_chu->setMinimumHeight(50);
    button_result->setMinimumHeight(50);

    //連線訊號
    connect(button_0,SIGNAL(clicked(bool)),this,SLOT(button_0_clicked()));
    connect(button_1,SIGNAL(clicked(bool)),this,SLOT(button_1_clicked()));
    connect(button_2,SIGNAL(clicked(bool)),this,SLOT(button_2_clicked()));
    connect(button_3,SIGNAL(clicked(bool)),this,SLOT(button_3_clicked()));
    connect(button_4,SIGNAL(clicked(bool)),this,SLOT(button_4_clicked()));
    connect(button_5,SIGNAL(clicked(bool)),this,SLOT(button_5_clicked()));
    connect(button_6,SIGNAL(clicked(bool)),this,SLOT(button_6_clicked()));
    connect(button_7,SIGNAL(clicked(bool)),this,SLOT(button_7_clicked()));
    connect(button_8,SIGNAL(clicked(bool)),this,SLOT(button_8_clicked()));
    connect(button_9,SIGNAL(clicked(bool)),this,SLOT(button_9_clicked()));
    connect(button_ce,SIGNAL(clicked(bool)),this,SLOT(button_ce_clicked()));
    connect(button_point,SIGNAL(clicked(bool)),this,SLOT(button_point_clicked()));
    connect(button_lbracket,SIGNAL(clicked(bool)),this,SLOT(button_lbracket_clicked()));
    connect(button_rbracket,SIGNAL(clicked(bool)),this,SLOT(button_rbracket_clicked()));
    connect(button_delete,SIGNAL(clicked(bool)),this,SLOT(button_delete_clicked()));
    connect(button_jia,SIGNAL(clicked(bool)),this,SLOT(button_jia_clicked()));
    connect(button_jian,SIGNAL(clicked(bool)),this,SLOT(button_jian_clicked()));
    connect(button_cheng,SIGNAL(clicked(bool)),this,SLOT(button_cheng_clicked()));
    connect(button_chu,SIGNAL(clicked(bool)),this,SLOT(button_chu_clicked()));
    connect(button_result,SIGNAL(clicked(bool)),this,SLOT(button_result_clicked()));

    QGridLayout * layout = new QGridLayout;

    layout->addWidget(data,1,1,1,4,Qt::Alignment());

    layout->addWidget(button_ce,2,1,Qt::Alignment());
    layout->addWidget(button_delete,2,2,Qt::Alignment());
    layout->addWidget(button_lbracket,2,3,Qt::Alignment());
    layout->addWidget(button_rbracket,2,4,Qt::Alignment());

    layout->addWidget(button_1,3,1,Qt::Alignment());
    layout->addWidget(button_2,3,2,Qt::Alignment());
    layout->addWidget(button_3,3,3,Qt::Alignment());
    layout->addWidget(button_jia,3,4,Qt::Alignment());

    layout->addWidget(button_4,4,1,Qt::Alignment());
    layout->addWidget(button_5,4,2,Qt::Alignment());
    layout->addWidget(button_6,4,3,Qt::Alignment());
    layout->addWidget(button_jian,4,4,Qt::Alignment());

    layout->addWidget(button_7,5,1,Qt::Alignment());
    layout->addWidget(button_8,5,2,Qt::Alignment());
    layout->addWidget(button_9,5,3,Qt::Alignment());
    layout->addWidget(button_cheng,5,4,Qt::Alignment());

    layout->addWidget(button_result,6,1,Qt::Alignment());
    layout->addWidget(button_0,6,2,Qt::Alignment());
    layout->addWidget(button_point,6,3,Qt::Alignment());
    layout->addWidget(button_chu,6,4,Qt::Alignment());

    layout->setMargin(12);
    centerWindow->setLayout(layout);
}

MainWindow::~MainWindow()
{

}

void MainWindow::init()
{
    s = "";
}
//符號優先順序判斷
int mycmp(char a, char b) {
    if(b == '(')
        return 1;//左括號直接入棧
    else if((b == '*' || b == '/') &&(a == '+' || a == '-' || a == '('))
        return 1;//*、/優先順序高於+、-、(,入棧
    else if((b == '+' || b == '-') && (a == '('))
        return 1;//+、-優先順序高於(,入棧
    else
        return 0;
}
//中綴表示式轉字尾表示式
void infix_to_suffix(char* infix, char* suffix)
{
    int i, j=0, top=0;
    char stack[1000];//儲存運算子的棧

    for(i=0; infix[i]!='\0'; i++) {
        if((infix[i] >= '0' && infix[i] <= '9')||infix[i] == '.' ) {
            suffix[j++] = infix[i];//運算元則直接輸出
        } else {
            if(i != 0 && ((infix[i-1] >= '0' && infix[i-1] <= '9')||infix[i] == '.') )
            {
                suffix[j++] = ' ';//運算元後補充空格分割
            }
            if(infix[i] == ')') {
                //遇到右括號則一直彈出直到左括號,但左括號不輸出
                while(stack[top-1] != '(') {
                    suffix[j++] = stack[--top];
                    suffix[j++] = ' ';
                }
                top--;
            } else if(top == 0 || mycmp(stack[top-1], infix[i])) {
                //棧為空或當前操作符的優先順序高於棧頂操作符,當前操作符入棧
                stack[top++] = infix[i];
            } else {
                //當前操作符優先順序等於或低於棧頂操作符則彈出棧頂
                while(!mycmp(stack[top-1], infix[i])) {
                    suffix[j++] = stack[--top];
                    suffix[j++] = ' ';
                    if(top == 0)
                        break;
                }
                stack[top++] = infix[i];//當前操作符入棧
            }
        }
    }
    //補充空格分割
    if(suffix[j-1] != ' ') {
        suffix[j++] = ' ';
    }
    //如果操作符棧不為空,彈出所有操作符
    while(top != 0) {
        suffix[j++] = stack[--top];
        suffix[j++] = ' ';
    }
    suffix[j] = '\0';
}
//字尾表示式求值
double suffix_value(char* suffix)
{
    int i;
    double stack[1000];
    int top = 0;
    double value = 0.0;
    double temp = 0.0;
    double exp = 0.1;
    for(i=0; suffix[i] != '\0'; i++)
    {
        if(suffix[i] >= '0' && suffix[i] <= '9')
        {
            while(suffix[i] >= '0' && suffix[i] <= '9')
            {
                value = value*10 + suffix[i] - '0';
                i++;
            }
            i--;
        }
        else if(suffix[i] == '.')
        {
            i++;
            while(suffix[i] >= '0' && suffix[i] <= '9')
            {
                temp = temp + (suffix[i] - '0') * exp;
                i++;
                exp = exp * 0.1;
            }
            i--;
            value = value + temp;
        }
        else if(suffix[i] == ' ')
        {
            //運算元入棧
            stack[top++] = value;
            value = 0;
            temp = 0;
            exp = 0.1;
        }
        else
        {
            //根據操作符,對棧頂兩個運算元進行計算並得到結果
            switch(suffix[i])
            {
                case '+': value = stack[top-2] + stack[top-1];break;
                case '-': value = stack[top-2] - stack[top-1];break;
                case '*': value = stack[top-2] * stack[top-1];break;
                case '/': value = stack[top-2] / stack[top-1];break;
                default: break;
            }
            top -= 2;
        }
    }

    return stack[0];
}

void MainWindow::operation()
{
    infix_to_suffix(infix, suffix);
    result =  suffix_value(suffix);
    s = QString::number(result,10.0);
}

void getnum(char num)
{
    infix[k++]=num;
}
void MainWindow::button_0_clicked()
{
    s += "0";
    data->setText(s);
    getnum('0');
}

void MainWindow::button_1_clicked()
{
    s += "1";
    data->setText(s);
    getnum('1');
}

void MainWindow::button_2_clicked()
{
    s += "2";
    data->setText(s);
    getnum('2');
}

void MainWindow::button_3_clicked()
{
    s += "3";
    data->setText(s);
    getnum('3');
}

void MainWindow::button_4_clicked()
{
    s += "4";
    data->setText(s);
    getnum('4');
}

void MainWindow::button_5_clicked()
{
    s += "5";
    data->setText(s);
    getnum('5');
}

void MainWindow::button_6_clicked()
{
    s += "6";
    data->setText(s);
    getnum('6');
}

void MainWindow::button_7_clicked()
{
    s += "7";
    data->setText(s);
    getnum('7');
}

void MainWindow::button_8_clicked()
{
    s += "8";
    data->setText(s);
    getnum('8');
}

void MainWindow::button_9_clicked()
{
    s += "9";
    data->setText(s);
    getnum('9');
}

void MainWindow::button_ce_clicked()
{
    s = "";
    data->setText("");
    //初始化資料
    init();
    memset(infix,0,1000);
    memset(suffix,0,1000);
    k = 0;
}

void MainWindow::button_point_clicked()
{
    s += ".";
    data->setText(s);
    getnum('.');
}

void MainWindow::button_lbracket_clicked()
{
    s += "(";
    data->setText(s);
    getnum('(');
}

void MainWindow::button_rbracket_clicked()
{
    s += ")";
    data->setText(s);
    getnum(')');
}

void MainWindow::button_delete_clicked()
{
    s=s.left(s.length()-1);
    data->setText(s);
    k--;
}

void MainWindow::button_jia_clicked()
{
    s += "+";
    data->setText(s);
    getnum('+');
}

void MainWindow::button_jian_clicked()
{
    s += "-";
    data->setText(s);
    getnum('-');
}

void MainWindow::button_cheng_clicked()
{
    s += "*";
    data->setText(s);
    getnum('*');
}

void MainWindow::button_chu_clicked()
{
    s += "/";
    data->setText(s);
    getnum('/');
}

void MainWindow::button_result_clicked()
{
    infix[k]='\0';
    operation();
    QString a = QString::number(result,10.0);
    data->setText(a);
}

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.setFixedSize(500,500);
    w.setWindowTitle("計算器");
    w.layout();
    return a.exec();
}

最終實現結果為: