迷你計算器設計-《嵌入式系統(tǒng)》課程設計說明書_第1頁
已閱讀1頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、<p>  《嵌入式系統(tǒng)》課程設計說明書</p><p><b>  迷你計算器設計</b></p><p><b>  院 、 部: </b></p><p>  學生姓名: </p><p>  指導教師: </p><p>  專

2、 業(yè): </p><p>  班 級: </p><p>  完成時間: </p><p>  湖南工學院嵌入式系統(tǒng)課程設計課題任務書</p><p><b>  摘 要</b></p><p>  計算器(calculator;counter)一般是指“電子

3、計算器”,計算器是能進行數(shù)學運算的手持機器,擁有集成電路芯片,其結(jié)構(gòu)簡單,比現(xiàn)代電腦結(jié)構(gòu)簡單得多,可以說是第一代的電子計算機(電腦)。計算器這一小小的程序機器實際上是從計算機中割裂出來的衍生品,雖然功能較單一,但因其操作模式的方便快捷和價格的低廉,攜帶方便等特點,已經(jīng)被廣泛應用于工程、學習、商業(yè)貿(mào)易等日常生活中,極大的方便了人們對于數(shù)字的整合運算,成為人們生活和辦公中的必備品之一,深得使用者的青睞。</p><p&g

4、t;  本次我們在課程設計中所做的是基于QTGUI的計算器的設計與實現(xiàn)。嵌Linux操作系統(tǒng)下有一個強大的圖形用戶界面工具包 Qt是一個跨平臺的C++圖形用戶界面應用程序框架。它提供給應用程序開發(fā)者建立藝術(shù)級的圖形用戶界面所需的所用功能。Qt是完全面向?qū)ο蟮暮苋菀讛U展并且允許真正地組件編程。且具備面向?qū)ο?、豐富的 API、強大的類等優(yōu)點這將為我們提供圖形化編程的便利。 </p><p>  關(guān)鍵詞 : Linux

5、、Qt、電子計算器、C++</p><p><b>  目 錄</b></p><p><b>  1 緒論1</b></p><p>  1.1 項目背景1</p><p>  1.2 項目內(nèi)容和要求1</p><p>  1.2.1 題目介紹1</

6、p><p>  1.2.2 題目要求1</p><p>  1.3 項目意義及特點1</p><p><b>  2 需求分析3</b></p><p>  2.1 需求分析一3</p><p>  2.2 可行性分析3</p><p><b> 

7、 3 系統(tǒng)設計5</b></p><p>  3.1 系統(tǒng)流程圖5</p><p>  3.2 模塊設計5</p><p>  3.2.1 基本功能模塊5</p><p>  3.2.2 附加功能模塊7</p><p>  4 系統(tǒng)運行和測試10</p><p&g

8、t;  4.1 搭建開發(fā)環(huán)境10</p><p>  4.2 運行及測試11</p><p><b>  參考文獻14</b></p><p><b>  致 謝15</b></p><p><b>  附 錄16</b></p><p&g

9、t;<b>  1 緒論</b></p><p><b>  1.1 項目背景</b></p><p>  隨著計算機的飛速發(fā)展,人類已經(jīng)進入信息化時代。信息技術(shù)發(fā)展日新月異, 計算已經(jīng)進入人們生活的各個領域, 在現(xiàn)代生活中不可或缺,大型復雜的計算是人腦所不能勝任的,而且較易出錯。以前的計算器只能進行簡單的加減乘除四則運算,而且只能進行單步運

10、算,如果遇到較長的算式時就得讓用戶一步一步輸入,浪費很多時間,還會可能遺漏數(shù)據(jù)內(nèi)容,讓用戶得多次輸入算式驗證,如果一次錯誤就得驗證多遍,浪費時間效率低下。隨著科技的發(fā)展,人們所學習的內(nèi)容越來越多,需求越來越廣泛。本文設計的計算器擴大了用戶的運算領域。并且考慮到用戶有時常用一些算式,提高了用戶的效率,方便了用戶的操作,本文設計中主要采用的技術(shù)為 Qt ,Qt 為設計可視化界面,通過軟件的設計可以快速設計出自己需要的界面,然后再到編寫各個按

11、鍵的槽函數(shù)與算法。</p><p>  1.2 項目內(nèi)容和要求</p><p>  1.2.1 題目介紹</p><p>  設計一個簡單功能的 QT 迷你計算器,具有普通計算窗口,滿足生活中簡單的需求,并設置算數(shù)優(yōu)先級。</p><p>  1.2.2 題目要求</p><p>  本次設計的計算器應具有以下功

12、能: </p><p>  能夠?qū)崿F(xiàn)常用的加減乘除功能; </p><p>  能夠?qū)崿F(xiàn)開方,乘方,返回的功能; </p><p>  定能夠?qū)崿F(xiàn)數(shù)值的記憶存儲功能 </p><p>  當輸入錯誤時,輸出錯誤; </p><p>  可以一鍵回復計算器到初始狀態(tài).</p><p>  1.

13、3 項目意義及特點</p><p>  我們?nèi)粘I畹拈_支,大額數(shù)字或是多倍小數(shù)的計算都需要計算器的幫助,處理數(shù)字的開方、正余弦都離不開計算器。雖然計算器現(xiàn)在價格比較低廉,但是功能過于簡單的不能滿足個人需求,功能多的價格昂貴,操作不便不說,很多功能根本用不到。所以,我們可以運用自己所學的知識設計一款滿足日常需求的簡易計算器。</p><p>  在本次課程設計中比較好的把C++與Qt結(jié)合

14、起來使用。Qt作為面向?qū)ο蟮?lt;/p><p>  軟件開發(fā)工具它使用信號Signal/槽slot機制來進行對象間的通信。信號/槽機制是Qt的一個中心特征并且也許是Qt與其它工具包的最不相同的部分。這樣便解決了我們在用戶界面上的操作如單擊某個按鈕與內(nèi)部對象之間的信號傳輸。Qt運行速度快、執(zhí)行效率高再加上它提供了一組更容易理解的GUI類信號與槽易使用它所擁有的插入體系結(jié)構(gòu)使得我們可以將代碼加載到一個應用中而無需進行

15、重新編譯或重鏈接等優(yōu)點為我們本次設計增色不少能使圖形界面看起來更加舒服使用起來更加靈活。 </p><p><b>  2 需求分析</b></p><p>  2.1 需求分析一</p><p>  在程序設計中,通過設計、編制、調(diào)試一個模擬計算器的程序,加深對語法及語義分析原理的理解,并實現(xiàn)對命令語句的靈活應用 在程序設計中,可以用兩種

16、方法解決問題: 一是傳統(tǒng)的結(jié)構(gòu)化程序設計方法,二是更先進的面向?qū)ο蟪绦蛟O計方法。而在面向?qū)ο蟪绦蛟O計中關(guān)鍵是如何將問題域中的實體 (即日常所見的概念) 抽取出來,作為 C++程序中的類,而屬性與行為作為類的兩類要素通常是必不可少的,甚至還應考慮類必須滿足的約束。</p><p>  我們?nèi)粘I畹拈_支,大額數(shù)字或是多倍小數(shù)的計算都需要計算器的幫助,處理數(shù)字的開方、正余弦都離不開計算器。雖然現(xiàn)在的計算器價格比較低廉

17、,但是功能過于簡單的不能滿足個人需求,功能多的價格較貴,操作不便不說,很多功能根本用不到。所以,我們想到可不可以用自己的所學為自己設計開發(fā)一個屬于自己的簡單計算器來完成日常生活的需求。</p><p>  計算器是日常生活中十分便捷有效的工具,能實現(xiàn)加、減、乘、除、 開方、求倒數(shù)等簡單運算的工具。要實現(xiàn)計算功能,可以用 C++和 Qt 的知識編寫程序來解決此問題。該計算器大大的降低了數(shù)字計算的難度及提高了計算的準

18、確度和精確度。該計算器使用非常簡單和方便,對廣大中小學生的學習有巨大幫助作用,也對在職人員的工作有點幫助作用。本文的程序設計設計工作環(huán)境為 Linux +QT Creator,在程序設計中,采用了結(jié)構(gòu)化與面向?qū)ο髢煞N解決問題的方法。</p><p>  2.2 可行性分析</p><p>  可行性分析計算器是日常生活中非常便捷有效的工具,它具有普通計算和科學計算, 能實現(xiàn)加減乘除等普通

19、功能,還可以實現(xiàn)算是運算,并且可以進行進制裝換,不再局限于十進制,他大大的提高了我們的效率,節(jié)省了時間,可促進科技的發(fā)展,還可以用來存儲算式,可以方便下次使用,采用 Qt 編寫, Qt designer設計的界面美觀,還可以用拖拽功能進行設計控件的位置、大小、屬性、結(jié)構(gòu)等功能,這樣在編寫代碼時就不用浪費時間對控件進行聲明等代碼了。這降低了 程序員的難度,提高了程序員的效率,并且上手快,具有一定的可行性。技術(shù)經(jīng)濟分析是研究技術(shù)領域的經(jīng)濟問

20、題和經(jīng)濟規(guī)律的科學,是研究一定技術(shù)條件下如何提高經(jīng)濟效果的科學,是技術(shù)與經(jīng)濟的交叉。在技術(shù)上,主要是采用 linux, 可以進行復雜的數(shù)據(jù)庫操作,進行算是的增、 刪、 改、 查等功能。用 Qt 編寫, 有些類似 C++,但大多數(shù)都是 Qt 封裝好的函數(shù)。 在 linux 中安裝 Qt 軟件, 配置環(huán)境變量,并安裝 Qt 插件。從而用 Qt 進行制作界面,做出的效果既美觀又快捷方便。使用 Qt 具有良好美觀的界面,必要的信息存儲和和較好的

21、健壯性,使用人員能夠快捷</p><p><b>  3 系統(tǒng)設計</b></p><p>  3.1 系統(tǒng)流程圖</p><p>  系統(tǒng)流程圖如下所示:</p><p><b>  圖1: 系統(tǒng)流程圖</b></p><p><b>  3.2 模塊設計&

22、lt;/b></p><p>  3.2.1 基本功能模塊</p><p>  1)當用戶單擊"+"或"-"按鈕時,系統(tǒng)將會調(diào)用additiveOperatorClicked()</p><p>  槽,additiveOperatorClicked()實現(xiàn)代碼如下:</p><p>  voi

23、d Widget::additiveOperatorClicked()</p><p><b>  {</b></p><p>  QPushButton *clickedButton = qobject_cast<QPushButto*>(sender());</p><p>  QString clickedOperator

24、= clickedButton->text();</p><p>  double operand = ui->display->text().toDouble();</p><p>  if (!pendingMultiplicativeOperator.isEmpty())</p><p><b>  {</b></

25、p><p>  if (!calculate(operand, pendingMultiplicativeOperator))</p><p><b>  {</b></p><p>  abortOperation();</p><p><b>  return;</b></p><

26、;p><b>  }</b></p><p>  ui-> display->setText(QString::number(factorSoFar));</p><p>  operand = factorSoFar;</p><p>  factorSoFar = 0.0;</p><p>  pe

27、ndingMultiplicativeOperator.clear();</p><p><b>  }</b></p><p>  if (!pendingAdditiveOperator.isEmpty())</p><p><b>  {</b></p><p>  if (!calculat

28、e(operand, pendingAdditiveOperator))</p><p><b>  {</b></p><p>  abortOperation();</p><p><b>  return;</b></p><p><b>  }</b></p>

29、;<p>  ui->display->setText(QString::number(sumSoFar));</p><p><b>  } else {</b></p><p>  sumSoFar = operand;</p><p><b>  }</b></p><p

30、>  pendingAdditiveOperator = clickedOperator;</p><p>  waitingForOperand = true;</p><p><b>  } </b></p><p>  進入這個函數(shù)后,會根據(jù)</p><p>  QPushButton *clickedB

31、utton = qobject_cast<QPushButto*>(sender());</p><p>  這句代碼實現(xiàn)區(qū)分+還是-,并且判斷存儲前運算符變量中是否有值,如果有則將前面的值先算出。如果沒有,則將第一個值存入,并將運算符存入。并且繼續(xù)等待接下來的按鈕,或者等號。</p><p>  2)當我們單擊"×"或"÷&q

32、uot;按鈕時,系統(tǒng)將調(diào)用</p><p>  void Widget::multiplicativeOperatorClicked()</p><p><b>  {</b></p><p>  QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());&

33、lt;/p><p>  QString clickedOperator = clickedButton->text();</p><p>  double operand = ui->display->text().toDouble();</p><p>  if (!pendingMultiplicativeOperator.isEmpty())&l

34、t;/p><p><b>  {</b></p><p>  if (!calculate(operand, pendingMultiplicativeOperator))</p><p><b>  {</b></p><p>  abortOperation();</p><p&

35、gt;<b>  return;</b></p><p><b>  }</b></p><p>  ui->display->setText(QString::number(factorSoFar));</p><p><b>  } else</b></p><p&

36、gt;<b>  {</b></p><p>  factorSoFar = operand;</p><p><b>  }</b></p><p>  pendingMultiplicativeOperator = clickedOperator;</p><p>  waitingForOpe

37、rand = true;</p><p><b>  }</b></p><p>  由于乘除的優(yōu)先級比加減高,當我們進行混合運算,前面是加減法,再進行乘或除時,比如1+2*3,這是會計算2*3=6,將6存入。此時計算公式相當于1+6。</p><p>  3.2.2 附加功能模塊</p><p>  1)程序中bac

38、kspaceClicked()用來實現(xiàn)退格功能.它會移除顯示的數(shù)值的最后一位.如果顯示屏中為空字符串,按下退格鍵將會顯示0.waitingForOperand被設置為0. 退格功能實現(xiàn)代碼如下: </p><p>  void Calculator::backspaceClicked() </p><p><b>  { </b></p><p&g

39、t;  if (waitingForOperand) </p><p><b>  return; </b></p><p>  QString text = display->text(); </p><p>  text.chop(1); </p><p>  if (text.isEmpty()) { <

40、;/p><p>  text = "0"; </p><p>  waitingForOperand = true; </p><p><b>  } </b></p><p>  display->setText(text); </p><p><b>  } &

41、lt;/b></p><p>  Clear()函數(shù)槽的功能相當于若干次backspaceClicked()的功能,它會一次清除顯示屏中的數(shù)值.功能實現(xiàn)代碼如下: </p><p>  void Calculator::clear() </p><p><b>  { </b></p><p>  if (wait

42、ingForOperand) </p><p><b>  return; </b></p><p>  display->setText("0"); </p><p>  waitingForOperand = true; </p><p><b>  } </b><

43、;/p><p>  clearAll()函數(shù)會實現(xiàn)計算器的初始化狀態(tài),代碼如下:</p><p>  void Calculator::clearAll() </p><p><b>  { </b></p><p>  sumSoFar = 0.0; </p><p>  factorSoFar =

44、 0.0; </p><p>  pendingAdditiveOperator.clear(); </p><p>  pendingMultiplicativeOperator.clear(); </p><p>  display->setText("0"); </p><p>  waitingForOper

45、and = true; </p><p><b>  } </b></p><p>  2)界面中sqrt和x^2是通過直接對界面設置值的方式實現(xiàn),其代碼如下所示</p><p>  void Widget::sqrClicked()</p><p><b>  {</b></p>&

46、lt;p>  double sqr = ui->display->text().toDouble();</p><p>  ui->display->setText(QString::number(sqrt(sqr)));</p><p>  waitingForOperand = true;</p><p><b>  }&

47、lt;/b></p><p>  void Widget::squareClicked()</p><p><b>  {</b></p><p>  double sqr = ui->display->text().toDouble();</p><p>  ui->display->se

48、tText(QString::number(sqr*sqr));</p><p>  waitingForOperand = true;</p><p><b>  }</b></p><p><b>  3)記憶存儲功能</b></p><p><b>  功能實現(xiàn)代碼如下:</b

49、></p><p>  void Calculator::clearMemory() </p><p><b>  { </b></p><p>  sumInMemory = 0.0; </p><p><b>  } </b></p><p>  void Calc

50、ulator::readMemory() </p><p><b>  { </b></p><p>  display->setText(QString::number(sumInMemory)); </p><p>  waitingForOperand = true; </p><p><b>  

51、} </b></p><p>  void Calculator::setMemory() </p><p><b>  { </b></p><p>  equalClicked(); </p><p>  sumInMemory = display->text().toDouble(); </

52、p><p><b>  } </b></p><p>  void Calculator::addToMemory() </p><p><b>  { </b></p><p>  equalClicked(); </p><p>  sumInMemory += displa

53、y->text().toDouble(); </p><p><b>  } </b></p><p>  clearMemory()函數(shù)可以清除存儲的數(shù)值,readMemory()函數(shù)為顯示存儲的數(shù)</p><p>  值.setMemory()函數(shù)可以用當前顯示的數(shù)值代替存儲的數(shù)值,即設置數(shù)值功</p><p>

54、;  能,addToMemory(0函數(shù)可以把已經(jīng)存儲的數(shù)值加上當前顯示的值并存儲.</p><p>  4 系統(tǒng)運行和測試</p><p>  4.1 搭建開發(fā)環(huán)境</p><p>  1、準備安裝軟件包:</p><p>  啟動RedHat 9.0的圖形界面,以root身份登陸在文本模式下,輸入命令startx啟動圖形界面。進入Re

55、dHat 9.0圖形界面后,打開一個終端窗口(Terminal),點擊【紅帽System ToolsTerminal】啟動終端窗口。輸入以下5條命令:</p><p> ?、?cd /pxa270_linux/Qt </p><p> ?、?cp qt-embedded-3.3.0.tar.gz tmake-1.11.tar.gz export.sh /home -arf

56、 </p><p> ?、?cd /home </p><p>  ④ tar zvxf qt-embedded-3.3.0.tar.gz </p><p> ?、?tar zvxf tmake-1.11.tar.gz </p><p>  2、建立QTE開發(fā)環(huán)境:</p><p>  

57、在上面打開的同一個終端(Terminal)中,輸入以下4條命令來搭建整個QTE開發(fā)環(huán)境:</p><p> ?、?source export.sh </p><p> ?、?cd qt-embedded-3.3.0 </p><p>  ③ ./configure –xplatform linux–arm–g++ -depths

58、 4,8,16,32 </p><p>  在configure過程中,會出現(xiàn)如下打印的信息,請您進行如下對話選擇:</p><p>  This is the QT/Embedded Free Edition.</p><p>  You are licensed to use this software under the terms of the GNU Ge

59、neral Public License (GPL).</p><p>  Type 'G' to view the GNU General Public License.</p><p>  Type 'yes' to accept this license offer.</p><p>  Type 'no' to

60、 decline this license offer.</p><p>  Do you accept the terms of the license?</p><p>  輸入: yes 回車</p><p>  回車之后,系統(tǒng)就會開始配置,并生成相應的Makefile文件。當出現(xiàn)下列信息是,則表示配置系統(tǒng)完成。</p><p>  

61、Qt is now configured for building. Just run /usr/bin/gmake.</p><p>  To reconfigure, run /usr/bin/gmake confclean and configure.</p><p>  當生成Makefile之后,在上面同一個終端窗口下輸入第4條命令make對qt-embedded-3.3.0的源

62、碼開始進行編譯。</p><p><b> ?、?make </b></p><p>  若編譯過程中沒有出現(xiàn)任何error,則會有如下提示:</p><p>  The Qt library is now built in ./lib</p><p>  The Qt examples are built in the

63、 directories in ./examples</p><p>  The Qt tutorials are built in the directories in ./tutorial</p><p>  Note: be sure to set $QTDIR to point to here or to wherever you move these directories.&l

64、t;/p><p>  Enjoy! - the Trolltech team</p><p>  這樣便搭建好了QT編譯環(huán)境了,Qt Designer界面如圖5所示:</p><p><b>  圖5: Qt界面</b></p><p><b>  4.2 運行及測試</b></p>

65、<p>  在arm板下,/home目錄中先執(zhí)行source qtconf.sh運行這個腳本后,在arm上配置qt,加載qt運行的各類庫文件。</p><p><b>  如圖6所示:</b></p><p><b>  圖6</b></p><p>  加載完QT運行所需要的庫文件后即可運行qt文件。</

66、p><p>  在命令行輸入./cal,運行結(jié)果如圖7所示.</p><p><b>  圖7</b></p><p>  運行可執(zhí)行文件cal后,在arm板上顯示如圖8所示:</p><p><b>  圖8</b></p><p>  輸入1+2*3,計算器顯示如圖9所示:

67、</p><p><b>  圖9</b></p><p>  因為*的優(yōu)先級大于+所以先計算2*3,然后計算1+6,結(jié)果為7</p><p>  當輸入1/0的時候界面顯示如圖10所示:</p><p><b>  圖10</b></p><p>  輸入1/0,此時0為分

68、母,公式錯誤,此時計算器輸出###,報錯。</p><p>  繼續(xù)執(zhí)行多次運算,計算器顯示皆無誤.關(guān)閉計算器,重啟再執(zhí)行運算,運算也無誤,故此可斷定程序設計正確.</p><p><b>  參考文獻</b></p><p>  [1]張石,ARM嵌入式系統(tǒng)教程[M] 。北京:機械工業(yè)出版社,2012</p><p>

69、  [2]曹忠明,程姚根。從實踐中學嵌入式Linux操作系統(tǒng)[M]。北京:電子工業(yè)出版社,2012</p><p>  [3]宋寶華,Linux設備驅(qū)動開發(fā)詳解(第二版)[M]。北京:人民郵電出版社,2010。</p><p>  [4]韋東山,嵌入式Linux應用開發(fā)完全手冊[M]。北京:人民郵電出版社,2008</p><p>  [5]陸文周,Qt5開發(fā)及實例

70、[M]。北京:電子工業(yè)出版社,2015</p><p>  [6]Stephen Prata,C Primer Plus[M]。北京:人民郵電出版社,2005</p><p>  [7]皺思鐵,嵌入式Linux 設計與應用 [M] 。北京:清華大學出版社,2002</p><p>  [8]閆放鶯,基于嵌入式Linux 軟件平臺技術(shù)的研究[D]

71、。西安:西北大學,2006</p><p><b>  致 謝</b></p><p>  經(jīng)過兩周的努力,在組員的互相協(xié)助下我們完成了該課程設計.雖然這次課程設計,充分利用了各種資源.有從網(wǎng)上下載的Qt教程,也有視頻教程.還有從圖書館借來的相應參考書與光盤.以及研究生師兄師姐的幫忙.雖然是首次接觸Linux系統(tǒng)下的開發(fā)以及Qt.其所獨有的信號與槽機制也是第一次接觸

72、剛開始理解的確很吃力。但這次設計總的來說對我自己很有意義因為是剛接觸嵌入式編程對于這次設計自己把它視做一次挑戰(zhàn)自己查閱資料自己解決問題這樣的過程中給了自己很大的成就感與信心。當然這次課程設計也鍛煉了自己分析實現(xiàn)方面的能力。在學習理論知識的同時也能夠自己動手去實現(xiàn)加深了自己對嵌入式的理解。 </p><p>  這次的簡易計算機的編寫,能實現(xiàn)基本的加減乘除算法。通過此次的QT學習以及上學期的C++學習,深刻的了解到

73、設計程序并不是一件簡單的事情。而且這些學習只是讓我了解到編程中的皮毛中的皮毛。并且通過網(wǎng)上了解到QT的強大功能;更使我對編程有了極大的興趣;雖然現(xiàn)在本人的技術(shù)及知識還很貧乏,但是相信通過現(xiàn)在及日后的學習一定可以達到自己想要達到的水平;就這次的課程設計報告來說,從最初的相當陌生到現(xiàn)在的可以理解使用是一個學習的過程,激發(fā)了自己的學習興趣。再次感謝給予我們幫助的同學和老師。</p><p><b>  附

74、錄</b></p><p><b>  附 錄:程序清單</b></p><p><b>  Widget.h:</b></p><p>  #ifndef WIDGET_H</p><p>  #define WIDGET_H</p><p>  #inclu

75、de <QWidget></p><p>  #include <QPushButton></p><p>  #include <cmath></p><p>  #include <QString></p><p>  #include <QDebug></p>&

76、lt;p>  namespace Ui {</p><p>  class Widget;</p><p><b>  }</b></p><p>  class Widget : public QWidget</p><p><b>  {</b></p><p>&

77、lt;b>  Q_OBJECT</b></p><p><b>  public:</b></p><p>  explicit Widget(QWidget *parent = 0);</p><p>  ~Widget();</p><p><b>  private:</b>

78、</p><p>  Ui::Widget *ui;</p><p>  double sumInMemory;</p><p>  double sumSoFar;</p><p>  double factorSoFar;</p><p>  bool waitingForOperand;</p>&

79、lt;p>  QString pendingAdditiveOperator;</p><p>  QString pendingMultiplicativeOperator;</p><p>  public slots:</p><p>  void digitClicked();</p><p>  void clearall()

80、;</p><p>  void point();</p><p>  void additiveOperatorClicked();</p><p>  void multiplicativeOperatorClicked();</p><p>  void abortOperation();</p><p>  v

81、oid equalClicked();</p><p>  void sqrClicked();</p><p>  void squareClicked();</p><p>  void backspaceClicked();</p><p>  bool calculate(double rightOperand, const QStr

82、ing &pendingOperator);</p><p><b>  };</b></p><p>  #endif // WIDGET_H</p><p>  Widget.cpp:</p><p>  #include "widget.h"</p><p>  

83、#include "ui_widget.h"</p><p>  Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)</p><p><b>  {</b></p><p>  this->move(190,60);</p>

84、<p>  ui->setupUi(this);</p><p>  sumInMemory = 0.0;</p><p>  sumSoFar = 0.0;</p><p>  factorSoFar = 0.0;</p><p>  waitingForOperand = true;</p><p&

85、gt;  pendingAdditiveOperator.clear();</p><p>  pendingMultiplicativeOperator.clear();</p><p>  ui->display->setText("0");</p><p>  connect(ui->bnt_0,SIGNAL(clicke

86、d()),this,SLOT(digitClicked()));</p><p>  connect(ui->bnt_1,SIGNAL(clicked()),this,SLOT(digitClicked()));</p><p>  connect(ui->bnt_2,SIGNAL(clicked()),this,SLOT(digitClicked()));</p>

87、<p>  connect(ui->bnt_3,SIGNAL(clicked()),this,SLOT(digitClicked()));</p><p>  connect(ui->bnt_4,SIGNAL(clicked()),this,SLOT(digitClicked()));</p><p>  connect(ui->bnt_5,SIGNAL(c

88、licked()),this,SLOT(digitClicked()));</p><p>  connect(ui->bnt_6,SIGNAL(clicked()),this,SLOT(digitClicked()));</p><p>  connect(ui->bnt_7,SIGNAL(clicked()),this,SLOT(digitClicked()));</

89、p><p>  connect(ui->bnt_8,SIGNAL(clicked()),this,SLOT(digitClicked()));</p><p>  connect(ui->bnt_9,SIGNAL(clicked()),this,SLOT(digitClicked()));</p><p>  connect(ui->bnt_c,SIG

90、NAL(clicked()),this,SLOT(clearall()));</p><p>  connect(ui->bnt_op,SIGNAL(clicked()),this,SLOT(point()));</p><p>  connect(ui->bnt_ad,SIGNAL(clicked()),this,SLOT(additiveOperatorClicked())

91、);</p><p>  connect(ui->bnt_su,SIGNAL(clicked()),this,SLOT(additiveOperatorClicked()));</p><p>  connect(ui->bnt_mu,SIGNAL(clicked()),this,SLOT(multiplicativeOperatorClicked()));</p>

92、<p>  connect(ui->bnt_di,SIGNAL(clicked()),this,SLOT(multiplicativeOperatorClicked()));</p><p>  connect(ui->bnt_eq,SIGNAL(clicked()),this,SLOT(equalClicked()));</p><p>  connect(ui

93、->bnt_sqr,SIGNAL(clicked()),this,SLOT(sqrClicked()));</p><p>  connect(ui->bnt_squ,SIGNAL(clicked()),this,SLOT(squareClicked()));</p><p>  connect(ui->bnt_back,SIGNAL(clicked()),this,SL

94、OT(backspaceClicked()));</p><p><b>  }</b></p><p>  Widget::~Widget()</p><p><b>  {</b></p><p>  delete ui;</p><p><b>  }<

95、/b></p><p>  void Widget::digitClicked()</p><p><b>  {</b></p><p>  QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());</p><p>  i

96、nt digitValue = clickedButton->text().toInt();</p><p>  if (ui->display->text() == "0" && digitValue == 0.0)</p><p><b>  return;</b></p><p>  

97、if (waitingForOperand)</p><p><b>  {</b></p><p>  ui->display->clear();</p><p>  waitingForOperand = false;</p><p><b>  }</b></p>&

98、lt;p>  ui->display->setText(ui->display->text() + QString::number(digitValue));</p><p><b>  }</b></p><p>  void Widget::clearall()</p><p><b>  {<

99、/b></p><p>  sumInMemory = 0.0;</p><p>  sumSoFar = 0.0;</p><p>  factorSoFar = 0.0;</p><p>  waitingForOperand = true;</p><p>  pendingAdditiveOperator

100、.clear();</p><p>  pendingMultiplicativeOperator.clear();</p><p>  ui->display->setText("0");</p><p><b>  }</b></p><p>  void Widget::point(

101、)</p><p><b>  {</b></p><p>  if (waitingForOperand)</p><p>  ui->display->setText("0");</p><p>  if (!ui->display->text().contains(&qu

102、ot;."))</p><p>  ui->display->setText(ui->display->text() + tr("."));</p><p>  waitingForOperand = false;</p><p><b>  }</b></p><p&g

103、t;  void Widget::additiveOperatorClicked()</p><p><b>  {</b></p><p>  QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());</p><p>  QString clicked

104、Operator = clickedButton->text();</p><p>  double operand = ui->display->text().toDouble();</p><p>  if (!pendingMultiplicativeOperator.isEmpty())</p><p><b>  {</b

105、></p><p>  if (!calculate(operand, pendingMultiplicativeOperator))</p><p><b>  {</b></p><p>  abortOperation();</p><p><b>  return;</b></p

106、><p><b>  }</b></p><p>  ui-> display->setText(QString::number(factorSoFar));</p><p>  operand = factorSoFar;</p><p>  factorSoFar = 0.0;</p><

107、p>  pendingMultiplicativeOperator.clear();</p><p><b>  }</b></p><p>  if (!pendingAdditiveOperator.isEmpty())</p><p><b>  {</b></p><p>  if (

108、!calculate(operand, pendingAdditiveOperator))</p><p><b>  {</b></p><p>  abortOperation();</p><p><b>  return;</b></p><p><b>  }</b>

109、</p><p>  ui->display->setText(QString::number(sumSoFar));</p><p><b>  } else {</b></p><p>  sumSoFar = operand;</p><p><b>  }</b></p&g

110、t;<p>  pendingAdditiveOperator = clickedOperator;</p><p>  waitingForOperand = true;</p><p><b>  }</b></p><p>  bool Widget::calculate(double rightOperand, const

111、 QString &pendingOperator)</p><p><b>  {</b></p><p>  if (pendingOperator == tr("+"))</p><p><b>  {</b></p><p>  sumSoFar += right

112、Operand;</p><p>  } else if (pendingOperator == tr("-"))</p><p><b>  {</b></p><p>  sumSoFar -= rightOperand;</p><p>  } else if (pendingOperator

113、== tr("*"))</p><p><b>  {</b></p><p>  factorSoFar *= rightOperand;</p><p>  } else if (pendingOperator == tr("/"))</p><p><b>  {&

114、lt;/b></p><p>  if (rightOperand == 0.0)</p><p><b>  {</b></p><p>  pendingAdditiveOperator.clear();</p><p>  pendingMultiplicativeOperator.clear();</

115、p><p>  sumSoFar = 0;</p><p>  factorSoFar = 0;</p><p>  sumInMemory = 0;</p><p>  return false;</p><p><b>  }</b></p><p>  factorSoF

116、ar /= rightOperand;</p><p><b>  }</b></p><p>  return true;</p><p><b>  }</b></p><p>  void Widget::multiplicativeOperatorClicked()</p>&

117、lt;p><b>  {</b></p><p>  QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());</p><p>  QString clickedOperator = clickedButton->text();</p><p>

118、;  double operand = ui->display->text().toDouble();</p><p>  if (!pendingMultiplicativeOperator.isEmpty())</p><p><b>  {</b></p><p>  if (!calculate(operand, pendi

119、ngMultiplicativeOperator))</p><p><b>  {</b></p><p>  abortOperation();</p><p><b>  return;</b></p><p><b>  }</b></p><p&g

120、t;  ui->display->setText(QString::number(factorSoFar));</p><p><b>  } else</b></p><p><b>  {</b></p><p>  factorSoFar = operand;</p><p>&l

121、t;b>  }</b></p><p>  pendingMultiplicativeOperator = clickedOperator;</p><p>  waitingForOperand = true;</p><p><b>  }</b></p><p>  void Widget::eq

122、ualClicked()</p><p><b>  {</b></p><p>  double operand = ui->display->text().toDouble();</p><p>  if (!pendingMultiplicativeOperator.isEmpty())</p><p>

123、;<b>  {</b></p><p>  if (!calculate(operand, pendingMultiplicativeOperator))</p><p><b>  {</b></p><p>  abortOperation();</p><p><b>  retu

124、rn;</b></p><p><b>  }</b></p><p>  operand = factorSoFar;</p><p>  factorSoFar = 0.0;</p><p>  pendingMultiplicativeOperator.clear();</p><p

125、><b>  }</b></p><p>  if (!pendingAdditiveOperator.isEmpty())</p><p><b>  {</b></p><p>  if (!calculate(operand, pendingAdditiveOperator))</p><p

126、><b>  {</b></p><p>  abortOperation();</p><p><b>  return;</b></p><p><b>  }</b></p><p>  pendingAdditiveOperator.clear();</p&

127、gt;<p><b>  } else</b></p><p><b>  {</b></p><p>  sumSoFar = operand;</p><p><b>  }</b></p><p>  ui->display->setText(Q

128、String::number(sumSoFar));</p><p>  sumSoFar = 0.0;</p><p>  waitingForOperand = true;</p><p><b>  }</b></p><p>  void Widget::sqrClicked()</p><p

129、><b>  {</b></p><p>  double sqr = ui->display->text().toDouble();</p><p>  ui->display->setText(QString::number(sqrt(sqr)));</p><p>  waitingForOperand =

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論