Qt creator實現一個簡單計算器

目錄

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37179.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37179.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hadoop版本演變、分布式集群搭建

Hadoop版本演變歷史 Hadoop發行版非常的多&#xff0c;有華為發行版、Intel發行版、Cloudera Hadoop(CDH)、Hortonworks Hadoop(HDP)&#xff0c;這些發行版都是基于Apache Hadoop衍生出來的。 目前Hadoop經歷了三個大的版本。 hadoop1.x&#xff1a;HDFSMapReduce hadoop2.x…

MySQL學習_python操作MySQL

用python連接數據庫分為以下幾個步驟 1.首先下載pymysql pip install pymysql2.創建數據 # 1.導入pymysql import pymysql # 2.連接MySQL conn pymysql.connect(host127.0.0.1,port3306,userroot,charsetutf8,dbunicom) cursor conn.cursor(cursorpymysql.cursors.DicCurso…

uniapp開發企業微信內部應用

最近一直忙著開發項目&#xff0c;終于1.0版本開發完成&#xff0c;抽時間自己總結下在項目開發中遇到的技術點。此次項目屬于自研產品&#xff0c;公司擴展業務&#xff0c;需要在企業微信中開發內部應用。因為工作中使用的是釘釘&#xff0c;很少使用企業微信&#xff0c;對于…

重新記錄做事的方向和內容(2024年6月28日19:50:38)

感覺自己沒必要這么焦慮&#xff0c;最后的結果無非就是自己又開始恢復到自己抽煙&#xff0c;喝酒&#xff0c;說臟話的一個狀態&#xff0c;自己那么糟糕自己都已經通過實事求是走出來了&#xff0c;現在難道自己還害怕什么&#xff1f; 如果順著這種封閉和沒有斷舍離的狀態…

【Qt C++實現繪制儀表盤】

要在Qt C中繪制儀表盤&#xff0c;您可以使用QChart、QSeries、QBarSeries、QPointSeries等類。以下是一個簡單的示例&#xff0c;演示如何使用這些類創建一個繪圖儀表盤&#xff1a; #include <QApplication> #include <QChart> #include <QChartView> #in…

06 Shell編程實戰——案例1

腳本編程步驟&#xff1a; 腳本編程一般分為4個步驟&#xff0c;即先確定需求&#xff0c;然后再確定你所要用到的語句&#xff0c; 需求分析&#xff1a;根據系統管理的需求&#xff0c;分析腳本要實現的功能、功能實現的層次、實現的命令與語句等&#xff1b;命令測試&…

Windows11下安裝多個JDK版本,并切換

Windows11下安裝多個JDK版本,并切換 前言步驟1、前期準備2、版本切換思考前言 一臺電腦可以同時安裝多個版本 jdk,建議兩個,最多不超三個。安裝多個JDK版本可能會占用較多的磁盤空間。此外,同時運行多個 JDK 版本可能會對系統性能產生一定的影響。 ??切換 JDK 有兩種方式…

ios swift5 視頻播放 播放視頻失敗 無法播放HEVC (H.265) 格式的視頻 H.264格式的可以播放

文章目錄 1.問題2.原因&#xff1a;iOS swift AVPlayerViewController無法播放HEVC (H.265) 格式的視頻3.解決方法用第三方框架MobileVLCKit來播放4.用MobileVLCKit寫的播放器4.1 兩個oc版本的4.2 兩個swiftUI版本的5.蘋果是支持HEVC (H.265) 格式的視頻&#xff0c;是硬件那邊…

css做旋轉星球可舉一反三

<!DOCTYPE html> <html lang"en"><head> <meta charset"UTF-8" /> <title>旋轉的星球</title> <style type"text/css">.box {/*position: relative;*/position: absolute;width: 139px;height: 139p…

計算文本相似度的幾種方法

計算文本相似度的幾種方法 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們來探討一下計算文本相似度的幾種方法。文本相似度在自然語言處理&#xff08…

算法訓練 | 動態規劃Part10 | 300.最長遞增子序列、674.最長連續遞增序列、718.最長重復子數組

目錄 300.最長遞增子序列 動態規劃法 674.最長連續遞增序列 動態規劃法 718.最長重復子數組 動態規劃法 300.最長遞增子序列 題目鏈接&#xff1a;300. 最長遞增子序列 - 力扣&#xff08;LeetCode&#xff09; 文章講解&#xff1a;代碼隨想錄 動態規劃法 “子序列是…

基于java語言+springboot技術架構開發的 互聯網智能3D導診系統源碼支持微信小程序、APP 醫院AI智能導診系統源碼

基于java語言springboot技術架構開發的 互聯網智能3D導診系統源碼支持微信小程序、APP 醫院AI智能導診系統源碼 一、智慧導診系統開發原理 導診系統從原理上大致可分為基于規則模板和基于數據模型兩類。 1、基于規則推理的方法通過人工建立癥狀、疾病和科室之間的對應規則實現…

Java反射API詳解與應用場景

一、Java反射API簡介: 一、什么是反射: 反射是一種強大的工具,它允許我們在運行時檢查類、方法和字段的信息,甚至允許我們動態的調用特定類的方法或改變字段的值。編程語言中的反射機制通常用于從類、對象或方法中檢索元數據,或者更特別的說,從代碼本身中獲取信息。這就…

【51單片機入門】點亮數碼管

文章目錄 前言仿真圖如何去繪制一個數字示例代碼選擇某個數碼管顯示某個數字 示例代碼總結 前言 在嵌入式系統的世界中&#xff0c;單片機扮演著至關重要的角色。51單片機&#xff0c;作為最早的微控制器之一&#xff0c;至今仍被廣泛應用在各種設備中。本文將介紹如何使用51單…

幾種linux開機自啟腳本的方法

幾種linux開機自啟腳本的方法 1. 腳本添加到init.d目錄中2. 創建服務service&#xff08;推薦&#xff09;3. /etc/profile & /etc/profile.d&#xff08;不推薦&#xff09;4. /etc/rc.local 本文以啟動jenkins節點為例&#xff0c;需要持久連接&#xff0c;實現開機自啟 …

js或ts中對象如何循環遍歷獲取名字和值

數組循環有多種方法&#xff0c;但是對象循環還是會遇到一些問題 分開獲取key或value let names{name:kaka,age:12}獲取key值代碼&#xff1a; Object.keys(names).forEach(name>{console.log(name) })結果&#xff1a; 獲取value值代碼&#xff1a; Object.values(name…

多地高溫持續“熱力”爆表 約克VRF中央空調帶你清涼舒爽一夏

“出門5分鐘&#xff0c;流汗2小時”,夏季高溫天氣&#xff0c;怎一個“熱”字了得&#xff1f;6月以來&#xff0c;我國多地迎來高溫“炙烤”&#xff0c;全國出現40℃以上高溫的范圍持續增加&#xff0c;隨著中央氣象臺高溫預警持續拉響&#xff0c;人們都很納悶&#xff1a;…

谷歌瀏覽器報錯ERR_UNSAFF_PORT原因分析

部署了個測試靜態頁&#xff0c;用了10080端口。curl訪問沒問題&#xff0c;chrome瀏覽器訪問報錯 ERR_UNSAFF_PORT 查了一下&#xff0c;google對于部分端口在客戶端是直接攔截的。請求都不會到服務器 定義在這里 谷歌官網源碼&#xff1a;chromium.googlesource.com git…

Android 大話binder通信

戳藍字“牛曉偉”關注我哦&#xff01; 用心堅持輸出易讀、有趣、有深度、高質量、體系化的技術文章 由于 Android 大話binder通信(上) 和 Android 大話binder通信(下) 分為兩篇閱讀體驗不好&#xff0c;顧合并為一篇。 本文摘要 用故事的方式把binder通信的整個過程都描述…

【408考點之數據結構】棧:定義、特點、基本操作與應用

棧&#xff1a;定義、特點、基本操作與應用 棧是一種重要的線性數據結構&#xff0c;廣泛應用于計算機科學和編程中。本文將介紹棧的定義、特點、基本操作以及常見應用。 棧的定義 棧&#xff08;Stack&#xff09;是一種特殊的線性表&#xff0c;只允許在表的一端進行插入和…