目錄
1 界面設計
2 思路簡介
3 代碼
目錄
1 界面設計
?2 思路簡介
3 代碼
3.1 widget.h
3.2 widget.c
4 完整代碼
? ? ? ? 在這里主要記載了如何使用Qt creator完成一個計算器的功能。該計算器可以實現正常的加減乘除以及括號操作,能實現簡單的計算器功能。
1 界面設計
該計算器的界面設計如下所示:
2 思路簡介
????????1. 中綴表達式的構建
????????將按鍵輸入字符轉換為字符串的形式。
? ? ? ? 比如:中綴表達式3+2+34+(6-3*5);
? ? ? ? 那么可以定義一個字符數組char Chars[1024];存儲,之后使用QString::fromUtf8(this->Chars);將該字符數組轉換為LineEdit可以顯示的類型。
????????2.?中綴表達式轉變為后綴表達式
????????直接按照字符將中綴轉變為后綴表達式,在進行計算時,再轉換為數據和符號。這里在將中綴表達式轉變為后綴表達式時,把每個數都使用&進行分割,方便后續計算。比如32+21轉換為后綴表達式就是32&&21+。
? ? ? ? 3.?使用后綴表達式進行計算
3 代碼
3.1 widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void Fb_Change(); // 中綴轉換為后綴表達式void Clear();
public:int i,j;private slots:void on_but_one_clicked();void on_but_zero_clicked();void on_but_two_clicked();void on_but_three_clicked();void on_but_four_clicked();void on_but_five_clicked();void on_but_six_clicked();void on_but_seven_clicked();void on_but_eight_clicked();void on_but_nine_clicked();void on_but_add_clicked();void on_but_sub_clicked();void on_but_mul_clicked();void on_but_div_clicked();void on_but_leftbrk_clicked();void on_but_rightbrk_clicked();void on_but_cls_clicked();void on_but_bit_clicked();void on_but_eql_clicked();void on_but_close_clicked();private:Ui::Widget *ui;int Data[128]; // data stackchar suffix[128]; // 后綴表達式 stackchar sign[128]; // 符號棧char Chars[1024]; // zhong綴表達式字符數組int data_sp = 0; // 數據棧頂指針int suffix_sp = 0; // 后綴棧頂指針int sign_sp = 0; // 符號棧頂指針int char_sp = 0; //int Operation_end = 0; // 運算結束標志位,1:運算結束
};
#endif // WIDGET_H
3.2 widget.c
#include "widget.h"
#include "ui_widget.h"
#include "qdebug.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_but_one_clicked()
{this->Chars[char_sp++] = '1';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_zero_clicked()
{this->Chars[char_sp++] = '0';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_two_clicked()
{this->Chars[char_sp++] = '2';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_three_clicked()
{this->Chars[char_sp++] = '3';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_four_clicked()
{this->Chars[char_sp++] = '4';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_five_clicked()
{this->Chars[char_sp++] = '5';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_six_clicked()
{this->Chars[char_sp++] = '6';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_seven_clicked()
{this->Chars[char_sp++] = '7';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_eight_clicked()
{this->Chars[char_sp++] = '8';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_nine_clicked()
{this->Chars[char_sp++] = '9';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_add_clicked()
{this->Chars[char_sp++] = '+';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_sub_clicked()
{this->Chars[char_sp++] = '-';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_mul_clicked()
{this->Chars[char_sp++] = '*';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_div_clicked()
{this->Chars[char_sp++] = '/';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_leftbrk_clicked()
{this->Chars[char_sp++] = '(';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_rightbrk_clicked()
{this->Chars[char_sp++] = ')';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));
}void Widget::on_but_cls_clicked()
{Clear();
}void Widget::on_but_bit_clicked()
{if(Operation_end == 0) // 沒有運算結束{this->Chars[--char_sp] = ' ';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars));}else {// 運算結束Clear();}
}void Widget::on_but_eql_clicked()
{Fb_Change();
}
void Widget::Clear()
{this->char_sp = 0;ui->lineEdit->clear();for(i=0; i<sign_sp; i++){this->sign[i] = ' ';}sign[0] ='\0';this->sign_sp = 0;for(i=0; i<suffix_sp; i++){this->suffix[i] = ' ';}this->suffix_sp = 0;suffix[0] ='\0';for(i=0; i<data_sp; i++){this->Data[i] = 0;}this->data_sp = 0;Operation_end = 0; // 運算結束標志位
}// 中綴轉換為后綴表達式
void Widget::Fb_Change()
{int font=0;int flag = 0;i = char_sp;j = 0;int count = 0;// 12*4+34/5-(56=67*4)+32 => 12 4 * 34 5 / 56 67 4 * + - 32 + +qDebug() << "1";while(i--) // 總共字符個數{if(isdigit(this->Chars[j])) // 如果是數字字符{if(flag == 0){suffix[suffix_sp++] = this->Chars[j]; // !j++;}else{suffix[suffix_sp++] = '&'; // 主要是為了正確分割數據, 和flag配合suffix[suffix_sp++] = this->Chars[j]; // !j++;flag = 0;}continue;}if((sign_sp == 0 || sign[sign_sp-1] == '(') && this->Chars[j] != ')') // 如果符hao棧為空或者棧頂元素為'('{qDebug() << "null" <<endl;suffix[suffix_sp++] = '&'; // 主要是為了正確分割數據, 和flag配合sign[sign_sp++] = this->Chars[j]; // !j++;flag = 1; // 主要是為了正確分割數據continue;}//if((this->Chars[j] == '*' || this->Chars[j] == '/') && (sign[sign_sp-1] == '-' || sign[sign_sp-1] == '+')){sign[sign_sp++] = this->Chars[j]; // !j++;flag = 1; //continue;}if((this->Chars[j] == '*' || this->Chars[j] == '/') && (sign[sign_sp-1] == '*' || sign[sign_sp-1] == '/')){suffix[suffix_sp++] = '&'; // 主要是為了正確分割數據, 和flag配合suffix[suffix_sp++] = sign[--sign_sp];sign[sign_sp++] = this->Chars[j];j++;flag = 1; // 主要是為了正確分割數據continue;}if(this->Chars[j] == '+' || this->Chars[j] == '-'){suffix[suffix_sp++] = '&'; // 主要是為了正確分割數據, 和flag配合suffix[suffix_sp++] = sign[--sign_sp];sign[sign_sp++] = this->Chars[j];j++;flag = 1; //continue;}if(this->Chars[j] == '('){sign[sign_sp++] = this->Chars[j]; // !j++;flag = 1; //continue;}if(this->Chars[j] == ')'){while(sign[--sign_sp] != '('){suffix[suffix_sp++] = '&'; // 主要是為了正確分割數據, 和flag配合suffix[suffix_sp++] = sign[sign_sp];}sign[sign_sp] = ' ';j++;flag = 1; //continue;}}while(sign_sp--){suffix[suffix_sp++] = sign[sign_sp];}suffix[suffix_sp] = '\0';qDebug()<< suffix;// suffix computeint arg_01, arg_02;for(i=0; i < suffix_sp; i++){if(suffix[i] >= '0' && suffix[i] <= '9'){font = font*count*10 + ((int)suffix[i] - 48); // 252count = 1;continue;}if(suffix[i] == '&'){if(count == 1) // 說明取過數{Data[data_sp++] = font;font = 0;}count = 0;continue;}if(suffix[i] == '+'){if(count == 1) // 說明取過數{Data[data_sp++] = font;font = 0;}arg_01 = Data[--data_sp]; //arg_02 = Data[--data_sp]; //Data[data_sp++] = arg_01+arg_02;qDebug() << Data[data_sp - 1];count = 0;continue;}if(suffix[i] == '-'){if(count == 1) // 說明取過數{Data[data_sp++] = font;font = 0;}arg_01 = Data[--data_sp]; //arg_02 = Data[--data_sp]; //Data[data_sp++] = arg_02 - arg_01;count = 0;continue;}if(suffix[i] == '*'){if(count == 1) // 說明取過數{Data[data_sp++] = font;font = 0;}arg_01 = Data[--data_sp]; //arg_02 = Data[--data_sp]; //Data[data_sp++] = arg_01 * arg_02;count = 0;continue;}if(suffix[i] == '/'){if(count == 1) // 說明取過數{Data[data_sp++] = font;font = 0;}arg_01 = Data[--data_sp]; //arg_02 = Data[--data_sp]; //Data[data_sp++] = arg_02 / arg_01;count = 0;continue;}}qDebug() << Data[0];ui->lineEdit->clear();this->Chars[char_sp++] = '=';Chars[char_sp] ='\0';ui->lineEdit->setText(QString::fromUtf8(this->Chars)+QString::number(Data[0]));Operation_end = 1; // 運算結束標志位}
// 237 238 236void Widget::on_but_close_clicked()
{this->close(); // close window
}
4 完整代碼
https://download.csdn.net/download/qq_51458770/89492760