国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于QT的計(jì)算器的實(shí)現(xiàn)

2018-12-22 10:55:14張會(huì)
電腦知識(shí)與技術(shù) 2018年32期
關(guān)鍵詞:計(jì)算器

張會(huì)

摘要:該文利用 Qt框架,應(yīng)用Qt信號(hào)槽機(jī)制實(shí)現(xiàn)了一個(gè)帶括號(hào)的加減乘除的四則混合運(yùn)算功能的計(jì)算器。該計(jì)算器是一個(gè)集繼承、圖形界面、事件處理等面向?qū)ο缶幊讨R(shí)的綜合應(yīng)用的實(shí)例程序。

關(guān)鍵詞:Qt;后綴表達(dá)式; 計(jì)算器;C++

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)32-0276-03

1 背景

Windows系統(tǒng)的“標(biāo)準(zhǔn)計(jì)算器”只能實(shí)現(xiàn)不判斷優(yōu)先級(jí)的簡(jiǎn)單的加減乘除計(jì)算,而不能正確實(shí)現(xiàn)帶括號(hào)的四則混合計(jì)算,該文利用Qt圖形庫(kù),采用C++語(yǔ)法規(guī)則,在Qt Creator集成開發(fā)環(huán)境下,實(shí)現(xiàn)了一個(gè)基于Qt的計(jì)算器,此計(jì)算器能幫助學(xué)生進(jìn)一步理解C++中的面向?qū)ο蟪绦蛟O(shè)計(jì)思想。

2 Qt的特點(diǎn)

Qt被用于高性能的跨平臺(tái)軟件開發(fā),它是一個(gè)標(biāo)準(zhǔn)的技術(shù)成熟的C++框架,Qt不僅擁有擴(kuò)展的C++類庫(kù),還提供了大量可用來(lái)快速編寫應(yīng)用程序的工具[1] ,Qt是采用C++實(shí)現(xiàn)的框架。 Qt Creator是一款新的輕量級(jí)集成開發(fā)環(huán)境(IDE), IDE支持跨平臺(tái)運(yùn)行,支持的系統(tǒng)包括 Mac OS X 、Linux( 32 位 及 64 位) 以及Windows等系統(tǒng)。Qt Creator的設(shè)計(jì)目標(biāo)是方便開發(fā)人員利用 Qt這個(gè)應(yīng)用程序框架更加快速、輕易地完成相關(guān)開發(fā)任務(wù)[2]。

3 功能設(shè)計(jì)

計(jì)算器主要實(shí)現(xiàn)了以下功能:

1)輸入包含括號(hào)的四則混合運(yùn)算計(jì)算式。

2)單擊等號(hào)按鈕自動(dòng)按先計(jì)算乘除再計(jì)算加減,有括號(hào)先計(jì)算括號(hào)的計(jì)算原則進(jìn)行四則混合運(yùn)算功能。

3)退格功能, 單擊退格按鈕,實(shí)現(xiàn)把輸入的計(jì)算表達(dá)式最后一個(gè)數(shù)字或運(yùn)算符刪除,以實(shí)現(xiàn)對(duì)錯(cuò)誤輸入的內(nèi)容刪除后進(jìn)行修改。

4)清空功能,單擊C清空按鈕,可以直接將輸入的所有內(nèi)容清除掉,而不需要用退格鍵逐一刪除,

5)小數(shù)點(diǎn)只能輸入一次,當(dāng)一個(gè)小數(shù)已經(jīng)輸入了一個(gè)小數(shù)點(diǎn)后,此數(shù)無(wú)法再輸入一個(gè)小數(shù)點(diǎn),從而保證小數(shù)點(diǎn)在一個(gè)小數(shù)中的唯一性。

6)計(jì)算完一次結(jié)果后,當(dāng)重新輸入計(jì)算表達(dá)式想實(shí)現(xiàn)再次計(jì)算時(shí),會(huì)自動(dòng)把前一次的結(jié)果直接清除掉,而不需要單擊清空按鈕清除上次計(jì)算結(jié)果后再計(jì)算。

7)計(jì)算器的健壯性, 如對(duì)除數(shù)是否為0進(jìn)行判斷。

8)具有較好的人機(jī)交互界面, 如單擊C清空按鈕及剛運(yùn)行計(jì)算器時(shí),單行文本框內(nèi)顯示“0” 。

4 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

4.1 界面設(shè)計(jì)

通過(guò)在Qt Creater環(huán)境中新建一個(gè)Qt Widgets Application應(yīng)用程序,并新建一個(gè)繼承于QMainWindow類的Computer窗口類,在Qt Creater界面設(shè)計(jì)器中加入一個(gè)單行文本框QLineEdit控件computEdit對(duì)象及5行4列的20個(gè)QPushButton按鈕控件,每個(gè)按鈕對(duì)象的text屬性設(shè)置為0-9數(shù)字、+-*/運(yùn)算符、左右括號(hào)、退格、C、小數(shù)點(diǎn)和=值,界面效果如圖1所示。

4.2 成員變量的定義

其中expression用于存放通過(guò)按鈕所輸入的計(jì)算表達(dá)式,如圖1中的computEidt對(duì)象中的:4*(3-2*3)-10/2.5=。resultExpression用于存放包含計(jì)算結(jié)果的表達(dá)式,如圖1中的computEidt對(duì)象中的4*(3-2*3)-10/2.5=-16。把expression中的中綴表達(dá)式轉(zhuǎn)換為后綴表達(dá)式后存放于list變量中。利用棧的先進(jìn)后出的原則把運(yùn)算符及后綴表達(dá)式中的各運(yùn)算暫數(shù)放于stack變量中。

4.3 計(jì)算表達(dá)式的生成

而在Qt中為了能實(shí)現(xiàn)事件處理如鼠標(biāo)左鍵單擊事件,可以通過(guò)對(duì)控件的信號(hào)函數(shù)添加槽函數(shù),當(dāng)單擊圖1的各按鈕時(shí),會(huì)發(fā)出一個(gè)click信號(hào),再在各按鈕的click信號(hào)函數(shù)上添加on_xxxButton_clicked()槽函數(shù)來(lái)實(shí)現(xiàn)把數(shù)字、括號(hào)、+-*/.按鈕上的text連接到expression中,再把連接了文本的expression通過(guò)setText(expression)把新生成的expression置于單行文本框computEdit中,以實(shí)現(xiàn)單擊按鈕在computEdit文本框中有相應(yīng)數(shù)字或運(yùn)算符連接追加在其后。如下給出數(shù)字1按鈕的click信號(hào)函數(shù)的槽函數(shù)的代碼,其他按鈕的槽函數(shù)類似。代碼如下:

4.4 計(jì)算功能的實(shí)現(xiàn)

計(jì)算帶括號(hào)的式子,關(guān)鍵是要遵循四則混合運(yùn)算法則:先乘除后加減,有括號(hào)要先計(jì)算括號(hào)內(nèi)表達(dá)式,括號(hào)里的表達(dá)式也要遵循這一原則[3]。要實(shí)現(xiàn)這種復(fù)雜的四則混合運(yùn)算,在文中首先通過(guò)trans()方法將expression中的中綴表達(dá)式轉(zhuǎn)換成為后綴表達(dá)式,再使用comput()方法將存放在list中的后綴表達(dá)式進(jìn)行計(jì)算得到最終的計(jì)算結(jié)果。因此在computEdit中輸入了計(jì)算表達(dá)式后,當(dāng)單擊“=”按鈕時(shí),在computEdit中將會(huì)顯示如圖1中所示的計(jì)算結(jié)果,在“=”按鈕的槽函數(shù)中通過(guò)調(diào)用trans()和comput()自動(dòng)實(shí)現(xiàn)四則混合計(jì)算。計(jì)算完后,清空stack,list,expression三個(gè)變量中的值,以便再次計(jì)算,若不清空,則這個(gè)三個(gè)變量將會(huì)把上一次的計(jì)算結(jié)果值進(jìn)行二次計(jì)算?!?”按鈕代碼如下:

1)trans()方法算法描述及實(shí)現(xiàn)

輸入的計(jì)算表達(dá)式存放于expression中,expression中包含數(shù)字及運(yùn)算符,依次取出expression中的字符,若expression開始字符不是運(yùn)算符而是數(shù)字字符串時(shí)則將數(shù)字字符串取出暫存于temp中。若expression中的開始字符是運(yùn)算符,則首先將暫存于temp中的數(shù)字字符串追加入list中,再分析expression中的第一個(gè)運(yùn)算符是 “*、/、(”則將高優(yōu)先級(jí)的運(yùn)算符直接入stack棧。若是“)”則把棧中的運(yùn)算符依次出棧并追加到list后面,形成后綴表達(dá)式,直到“(”出棧,但“(”不追加在list后面,從而達(dá)到將“()”在后綴表達(dá)式中刪除的目的,再在expression中將起始位置處的“)”刪除。若是“+、-”,則先將stack中的運(yùn)算符依次出棧并追加在list中,直到棧為空,之后再將“+、-”入棧,并移除expression中的首字符。以此方式直到expression為空后,若棧中還有運(yùn)算符則依次將棧中的運(yùn)算符出棧追加在list后面。如有中綴計(jì)算表達(dá)式為:“4*(3-2*3)-10/2.5”,經(jīng)過(guò)上述算法處理后形成于list中的后綴表達(dá)式為:“4 3 2 3 * - * 10 2.5 / -”。代碼實(shí)現(xiàn)如下:

2)comput()方法算法描述及實(shí)現(xiàn)

將tans()方法生成的list中存放的元素依次取出入棧stack變量,一旦在入棧的過(guò)程中遇到運(yùn)算符,則將棧頂數(shù)字字符串出棧后轉(zhuǎn)換成數(shù)字后進(jìn)行計(jì)算,為保證計(jì)算的先后順序,將棧頂元素取出的元素順序置于operand2,operand1中,再使用從list中取出的運(yùn)算符進(jìn)行計(jì)算,并將計(jì)算的中間結(jié)果result入棧,以備下次計(jì)算。以此為循環(huán),直到list為空。

4.5 退格按鈕的實(shí)現(xiàn)

在輸入計(jì)算表達(dá)式時(shí),有可能會(huì)誤輸入,退格功能是用于從所輸入的表達(dá)式中的最后一位開始,每按一次退格鍵,依次從后向前逐個(gè)刪除輸入的數(shù)字或運(yùn)算符。在設(shè)計(jì)算法時(shí),首先判斷表達(dá)式中的長(zhǎng)度是否為1,若為1,則將computEdit中的值置為0,同時(shí)使用remove()方法將expression中的唯一這一位字符移除;若computEdit中的表達(dá)式長(zhǎng)度不為1,同時(shí)expression不為空,則使用remove()方法先將expression中的最后一位移除,再將expression用setText()置于computEdit中,從而顯示刪除后的計(jì)算表達(dá)式。代碼如下:

4.6 清空按鈕的實(shí)現(xiàn)

清空的目的是直接清除compuEdit中的所有內(nèi)容,以便重新輸入計(jì)算表達(dá)式并計(jì)算,因此在實(shí)現(xiàn)清空按鈕的功能時(shí),只需要將expression,list,stack置空,將computEdit控件中的內(nèi)容置為0即可,代碼如下:

5 結(jié)束語(yǔ)

該文通過(guò)使用Qt應(yīng)用框架實(shí)現(xiàn)了人機(jī)交互界面的計(jì)算器,采用Qt信號(hào)槽機(jī)制實(shí)現(xiàn)計(jì)算器的加減乘除及帶括號(hào)的四則混合運(yùn)算功能。該程序是一個(gè)集繼承、圖形界面、事件處理等面向?qū)ο缶幊讨R(shí)的綜合應(yīng)用的實(shí)例程序,通過(guò)對(duì)該程序的理解及掌握,能更好地培養(yǎng)《C++程序設(shè)計(jì)》初學(xué)者面向?qū)ο缶幊趟季S及編程興趣。

參考文獻(xiàn):

[1] Monteiro F R, Garcia M A P, Cordeiro L C, et al. Boundedmodel checkin gof C++ program sbasedon the Qtcross‐platform frame work[J]. Software Testing Verification & Reli-ability, 2017,5: 179-180.

[2] Saleem K, Bellahsene Z, Hunt E. PORSCHE Performance ORiented SCHEma mediation [J]. Information Systems, 2008, 33(78): 637-657.

[3] 楊建武, 李蓉. 基于編譯原理的表達(dá)式計(jì)算器設(shè)計(jì)[J]. 現(xiàn)代計(jì)算機(jī), 2009(7): 151-153.

[4] 王彩霞. 一種帶括號(hào)和優(yōu)先級(jí)的四則運(yùn)算計(jì)算器的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2014(16): 3798-3802.

【通聯(lián)編輯:謝媛媛】

猜你喜歡
計(jì)算器
無(wú)敵女生(12)
壞了的計(jì)算器
[計(jì)算器不是萬(wàn)能的]
計(jì)算器
高中數(shù)學(xué)教學(xué)中應(yīng)用圖形計(jì)算器的實(shí)踐探索
一個(gè)損壞的計(jì)算器
讀寫算(中)(2015年10期)2015-11-07 07:24:10
一個(gè)損壞的計(jì)算器
計(jì)算器游戲
計(jì)算器
猜電話號(hào)碼
阳城县| 手游| 泉州市| 海口市| 大英县| 龙岩市| 开化县| 大悟县| 灵台县| 新乡县| 大同县| 黔东| 阿巴嘎旗| 永福县| 白玉县| 合川市| 格尔木市| 宣化县| 工布江达县| 龙井市| 中卫市| 武隆县| 遂昌县| 耿马| 定边县| 仙游县| 鹤庆县| 获嘉县| 奇台县| 修武县| 苍梧县| 酉阳| 祥云县| 灵武市| 黄大仙区| 沅陵县| 房山区| 鲜城| 洛隆县| 新田县| 安陆市|