![面向?qū)ο蟪绦蛟O計實習報告_第1頁](http://file4.renrendoc.com/view/919594c69eabc283385b3cf6439255a0/919594c69eabc283385b3cf6439255a01.gif)
![面向?qū)ο蟪绦蛟O計實習報告_第2頁](http://file4.renrendoc.com/view/919594c69eabc283385b3cf6439255a0/919594c69eabc283385b3cf6439255a02.gif)
![面向?qū)ο蟪绦蛟O計實習報告_第3頁](http://file4.renrendoc.com/view/919594c69eabc283385b3cf6439255a0/919594c69eabc283385b3cf6439255a03.gif)
![面向?qū)ο蟪绦蛟O計實習報告_第4頁](http://file4.renrendoc.com/view/919594c69eabc283385b3cf6439255a0/919594c69eabc283385b3cf6439255a04.gif)
![面向?qū)ο蟪绦蛟O計實習報告_第5頁](http://file4.renrendoc.com/view/919594c69eabc283385b3cf6439255a0/919594c69eabc283385b3cf6439255a05.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
西北農(nóng)林科技大學信息工程學院面向?qū)ο蟪绦蛟O計PAGE西北農(nóng)林科技大學信息工程學院面向?qū)ο蟪绦蛟O計實習報告題目:簡易計算器的設計與實現(xiàn)學號2011013304姓名趙燕專業(yè)班級信管112班指導教師張志毅實踐日期2014-1-16目錄一、綜合訓練目的與要求 2二、綜合訓練任務 3(一)綜合任務 3(二)個人任務: 3三、總體設計 3(一)功能模塊圖 3(二)功能實現(xiàn) 3四、詳細設計說明 5(一)主窗口控制類 5(二)實現(xiàn)說明: 6五、調(diào)試與測試 9(一)使用說明書 9(二)調(diào)試結(jié)果 9六、實習日志 11七、實習總結(jié) 14八、附錄:核心代碼清單 14stack類 14calculatorWindow類 15calculatorWindow.cpp 17ButtonPress.cpp 19Calculator.cpp 21
一、綜合訓練目的與要求《面向?qū)ο蟪绦蛟O計》課程設計是實踐性教學環(huán)節(jié)之一,是《面向?qū)ο蟪绦蛟O計》課程的輔助教學課程。該課程設計要求學生綜合運用在《面向?qū)ο蟪绦蛟O計》課程中學到的面向?qū)ο蠹夹g(shù)與實際編程相結(jié)合,獨立完成一項較為完整、并具有一定實際功能的課程設計任務,同時加深學生對面向?qū)ο蠛虲++編程技術(shù)的理解和掌握,培養(yǎng)實際的應用程序開發(fā)能力。在課程設計過程中,使學生養(yǎng)成良好的程序設計風格,并掌握C++應用程序的設計開發(fā)過程和編程方法、測試方法。培養(yǎng)學生使用MFC或者QT設計程序,使學生學會使用他們?nèi)ラ_發(fā)軟件。二、綜合訓練任務(一)綜合任務設計一個計算器,要求如下:1、實現(xiàn)最大輸入十進制數(shù)字的四則運算(有正負數(shù)區(qū)分)。2、實現(xiàn)三角函數(shù)和反三角函數(shù)的計算、開方、次冪、求對數(shù)、取余等。3、設置輸入數(shù)值的最大長度,溢出報警。4、除法和乘法結(jié)果用科學計數(shù)法并保留到小數(shù)點后2位。(二)個人任務:1、學習qt使用,學習qt中信號和槽機制。2、在qt中實現(xiàn)代碼與界面的連接。三、總體設計(一)功能模塊圖功能設計如圖1,分為來個部分進制轉(zhuǎn)換和表達式計算。圖SEQ圖表\*ARABIC1計算器的功能(二)功能實現(xiàn)1、程序設計過程中分為兩個模塊,第一模塊為計算器界面的類CalculatorWindow,如圖2,包括各個按鈕的聲明以及函數(shù)運算的實現(xiàn),包括了倆個棧,分別為運算符棧和數(shù)字棧,以及各個實現(xiàn)函數(shù);第二個為stack類,如下圖3包括了各個判斷棧的情況的函數(shù)。具體的UML視圖如下所示:calculate():voidchangeHexadecimal(intnum):longintoperatorCompare(charstackOut,charstackIn):boolcalculate():voidchangeHexadecimal(intnum):longintoperatorCompare(charstackOut,charstackIn):boolpartCalculate(charoper):void;setStr():voidgetStr():stringnumButtonPress():voidoperateButtonPress():voidabortOperation():voidnumStack:stackoperatoerStack:stackstr:stringNumButton:QPushButtonOperateButton:QpushButtonOperateEdit;:QLineEdit圖2CalculatorWindow類CalculatorWindows[max_len]:char//棧的內(nèi)容保存在數(shù)組中top:int//棧頂clear():s[max_len]:char//棧的內(nèi)容保存在數(shù)組中top:int//棧頂clear():voidpush(charc):voidpop():charempty():boolfull():boolremove():voidStack圖3圖3stack類2、此程序設計主要運用了棧,利用棧后進先出的原理,建立兩個棧,數(shù)字棧和運算符棧,先將數(shù)據(jù)和運算符分別壓入這兩個棧,判斷棧內(nèi)和棧外運算符的優(yōu)先級,依據(jù)運算符的優(yōu)先級判斷是應再次壓入運算符,還是將數(shù)據(jù)和運算符彈出棧,在棧外進行運算,再將所得的結(jié)果壓入棧,繼續(xù)進行與計算,直至運算結(jié)束。3、建立工程文件視圖如圖4:圖4文件工程視圖四、詳細設計說明(一)主窗口控制類1、界面總共有26個按鈕,包括10個數(shù)字鍵按鈕、一個小數(shù)點按鈕、一個等號按鈕、12個運算符按鈕、一個清除按鈕、一個退格鍵、以及倆個括號按鍵,按照簡潔化布局風格,第一個元素為operateEdit文本框,后面采用四個面板設計firstLayout、secondLayout、thirdLayout、fourthtLayout,具體界面設計如下圖5所示:圖5計算器界面2、各個按鈕、按鈕功能以及所使用函數(shù)說明,如表1。表1按鈕功能表按鈕按鈕的槽函數(shù)功能zeroButtonzeroButtonPress()按鈕0oneButtononeButtonPress()按鈕1twoButtontwoButtonPress()按鈕2threeButtonthreeButtonPress()按鈕3fourButtonfourButtonPress()按鈕4fiveButtonfiveButtonPress()按鈕5sixButtonsixButtonPress()按鈕6sevenButtonsevenButtonPress()按鈕7eightButtoneightButtonPress()按鈕8nineButtonnineButtonPress()按鈕9decimalButtondecimalButtonPress()小數(shù)點clearButtonclearButtonPress()清空按鈕backspaceButtonbackspaceButtonPress()回退鍵addButtonaddButtonPress()加號鍵subButtonsubButtonPress()減號鍵divButtondivButtonPress()除號鍵mulButtonmulButtonPress()乘號鍵sinButtonsinButtonPress()Sin函數(shù)的計算cosButtoncosButtonPress()Cos函數(shù)的計算tanButtontanButtonPress()Tan函數(shù)的計算sqrtButtonsqrtButtonPress()開方powButtonpowButtonPress()平方equButtonequButtonPress()等號鍵binaryButtonbinaryButtonPress()從十進制到二進制的轉(zhuǎn)換octButtonoctButtonPress()從十進制到八進制的轉(zhuǎn)換hexButtonhexButtonPress()從十進制到十六進制的轉(zhuǎn)換rightPerButtonrightPerButtonPress()右括號leftPerButtonleftPerButtonPress()左括號(二)實現(xiàn)說明:1、除進制轉(zhuǎn)換按鈕、清除鍵、退格鍵和等號按鈕外,其他按鍵都只是簡單的輸入文本信息,具體函數(shù)如下:數(shù)字鍵按鍵響應事件函數(shù):操作符按鍵響應事件:2、進制轉(zhuǎn)換函按鈕調(diào)用了進制轉(zhuǎn)換函數(shù),由于八進制和二進制沒有特殊字符,轉(zhuǎn)換函數(shù)一樣,具體的函數(shù)算法如下:十進制到十六進制的轉(zhuǎn)換由于牽涉到字母,故比較麻煩,具體實現(xiàn)如下圖6:圖6十進制到十六進制轉(zhuǎn)換流程圖3、等號的實現(xiàn)是程序中最精華的部分,采用了棧的思想,主要運用了棧,利用棧后進先出的原理,建立兩個棧,數(shù)字棧和運算符棧,先將數(shù)據(jù)和運算符分別壓入這兩個棧,判斷棧內(nèi)和棧外運算符的優(yōu)先級,依據(jù)運算符的優(yōu)先級判斷是應再次壓入運算符,還是將數(shù)據(jù)和運算符彈出棧,在棧外進行運算,再將所得的結(jié)果壓入棧,繼續(xù)進行與計算,直至按等號運算結(jié)束。流程圖7如下:圖7計算表達式值得流程圖在此過程中涉及到優(yōu)先級的排序問題:(1)每個用函數(shù)或倒數(shù)的都是字表達式內(nèi)層向外層的方向輸出(括號的優(yōu)先級最大)(2)三角函數(shù)的站內(nèi)優(yōu)先級和棧外優(yōu)先級問題:(3)采用的優(yōu)先級時棧外比棧內(nèi)的大,3個三角函數(shù)運算符的棧內(nèi)優(yōu)先級相同、棧外優(yōu)先級也相同;三角函數(shù)的優(yōu)先級比加減法大,比乘除法大,比括號??;三角函數(shù)與倒數(shù);三角函數(shù)的棧外優(yōu)先級要低于倒數(shù)的棧內(nèi)優(yōu)先級;三角函數(shù)的棧內(nèi)優(yōu)先級要高于倒數(shù)的棧外優(yōu)先級(4)倒數(shù)的優(yōu)先級倒數(shù)的棧外優(yōu)先級要低于棧內(nèi)優(yōu)先級(5)開二次方,棧外優(yōu)先級低于棧內(nèi)優(yōu)先級,開方函數(shù)的棧內(nèi)優(yōu)先級高于加、減、乘、除、以及其他函數(shù)的棧外優(yōu)先級,棧外優(yōu)先級高于加、減、乘、除棧內(nèi)優(yōu)先級,棧外優(yōu)先級低于其他幾種函數(shù)的棧內(nèi)優(yōu)先級綜合考慮得出的優(yōu)先級排序如下表2:表2優(yōu)先級排序算符站內(nèi)優(yōu)先級棧外優(yōu)先級*/43+-21(07)70Sin(S)Cos(C)Tan(T)Cot(O)1/x(X)Sqrt(Q)Pow(W)65#-1-14、按鍵響應事件的流程圖8如下,只有在opreate為1、opreated為0時才可以鍵入運算符,以達到運算符不能連續(xù)輸入,輸入數(shù)字時,先opreate置為0,輸入完后置opreated=1等待運算符的輸入。圖8按鍵響應流程圖五、調(diào)試與測試(一)使用說明書(1)此計算器采用先輸入表達式,再計算結(jié)果的方式。(2)進行三角函數(shù)的計算和開方、平方的計算時,先輸入數(shù)字,再輸入三角函數(shù)運算符和開方、平方運算符,注意為了變成方便編程,sin使用S代替,cos使用C代替,tan使用T代替,sqrt使用Q代替,pow使用W代替。如sin1+cos2+tan3顯示為1S+2C+3T。(3)其他使用和其他計算器的使用類似。(4)如果結(jié)果出現(xiàn)“####”,則表達式有問題,請注意輸入?。ǘ┱{(diào)試結(jié)果2*(3+4)的運算:輸入2*(3+4)顯示如下圖9圖9按下等號顯示結(jié)果如下圖10所示:圖1012的二進制計算:輸入12顯示如圖11所示圖11按下二進制運算符,顯示結(jié)果如圖12所示:圖12六、實習日志2014-1-6今天的任務主要是寫實習計劃書以及確定項目要實現(xiàn)那些功能,并且借鑒一下前面的師兄師姐們的作品,查了查相關(guān)的資料,下載相關(guān)軟件,并且簡單學習他們的使用方法。我們的項目決定要用qt來做界面,千辛萬苦找到了下載地址,下載qt軟件,安裝后不能使用,后來查閱相關(guān)資料后知道需要提前minGW,在多次校正后,軟件終于可以使用了。下面是下載相關(guān)軟件的地址:minGW的下載地址/projects/mingw/postdownload?source=dlpQT的下載地址/downloads在下午的時候,找了相關(guān)的項目來參考參考了一下,確定計算器要實現(xiàn)的功能以及要分成哪些模塊。這些是一些參考項目。實踐論文/p-664645791.html論文:/firecityplans/article/details/78319732014-1-7我們對計算器的功能模塊進行的劃分,完成了模塊設計圖。為了編程實踐的方便,我們又完成了流程圖。由于電腦上的Qt一直沒能安裝成功,所以,我就主要考慮編程的過程,嘗試先用Code:Blocks實現(xiàn)計算器的功能。在這個過程中,我發(fā)現(xiàn)對用棧實現(xiàn)表達式求解的過程需要的數(shù)據(jù)結(jié)構(gòu)知識已經(jīng)忘了很多,不過經(jīng)過查資料和分析自己明白了過程,明天就是將程序繼續(xù)編完。我還看了關(guān)于Qt的使用,發(fā)現(xiàn)里面的類和方法都很陌生而且用法感覺有點兒奇怪,應該是還不了解的原因。覺得目前先完成一件事,就是先完成控制臺程序,然后再用Qt完成界面設計今天主要是根據(jù)所確定的功能的確定我們的項目都需要包含哪些函數(shù),以及采用哪種方式去實現(xiàn),我們決定用棧來實現(xiàn),并且做了流程圖。初步設計了界面。對QT的使用還不是很好,正在初步的學習中,他和其他的界面設計軟件不同,搞得我滿頭霧水。不過我覺得摸索這些軟件的是使用是一件很開心的事。遇到的問題:1、使用qt界面設計和文件中源代碼并不一致,怎么進行事件交互?使用了信號和槽機制,但如何實現(xiàn)呢?是什么原理?2、使用qt進行設計界面時,如何能夠有條理的管理已有控件?qrc文件又是什么東西?有什么作用?Qt中的qrc文件是一個xml格式的資源配置文件,與應用程序關(guān)聯(lián)的應用程序由.qrc文件來指定,它用XML記錄硬盤上的文件和對應的隨意指定的資源名稱,應用程序通過資源名稱來訪問資源。2014-1-今天的主要任務是學習qt的使用方法,還是沒怎么搞明白界面和代碼的聯(lián)系,感覺他和我之前學習的java設計界面、C#中的WPF大不一樣,很難駕馭??赡苁俏疫€沒有學習到他的精華所在吧。感覺那個樣式表不是很好用,在設計中可以佷容易實現(xiàn),但是要寫代碼實現(xiàn),又不是很好做。繼續(xù)學習中!2014-1-9今天的主要任務是實現(xiàn)簡單的一些功能,實現(xiàn)算法與界面的互聯(lián),在一天的努力下,終于明白了信號和槽機制的使用,實現(xiàn)了簡單的加減乘除。在界面的設計過程中,捉摸了老半天,才知道怎么做出絢麗的界面,樣式表的使用以及樣式表的語法,很多都還不會再進一步的琢磨中。感覺我們的進度還是太慢,一周的實習也即將快要結(jié)束了,但我們的還沒有實現(xiàn),繼續(xù)奮斗中!2014-1-10今天懷著忐忑的心來編程序,結(jié)果當開始編的時候感覺c++已經(jīng)忘了很多。只能是一邊復習,一邊編寫。下午老師介紹了mfc和Qt的相關(guān)知識,我覺得其實這些東西真的需要自己去試著用才能掌握,不是一朝一夕的事,當然學習這些需要好的習慣,希望通過這次實習,我能克服自己不想研究陌生東西這個心理障礙。實習即將結(jié)束,我感覺今天的收獲不是很多,效率有點兒低,時間越來越緊張了,我們的任務還是很重,我們必須加把勁了!2014-1-13今天還是在進一步編寫代碼中,感覺好多東西都忘的差不多了,只能邊學習邊編寫,早上實現(xiàn)了進制轉(zhuǎn)換函數(shù),有點小小的成就感。感覺qt還是不好用,在編寫代碼的時候,有時候函數(shù)明明出錯了,可程序還是可以運行,也搞不懂是什么原因,后來只能新建工程,再拷貝了。還有感覺我們的代碼容錯性太差了,我們只是考慮了正常情況的運行,還要努力考慮到各種異常情況,加強程序的健壯性。下午還是在進一步的編寫代碼,感覺時間有點緊張,而且加上考試,所以有點忐忑不安,好多功能還沒有實現(xiàn)。對實習的時間安排極度不滿,C++都學習一年了,忘的也差不多了,再加上考試,總覺得自己很難靜下心來,好好編寫。強烈建議學習能夠改變一下實習時間,放在這個點上,實習做不好,考試考不好!為了后來的學弟學妹們,我要強烈說出我的不滿!2014-1-14先說說我們的進度吧,我的隊友在codeblocks中已經(jīng)可以實現(xiàn)計算器的一些基本功能,由我來實現(xiàn)qt界面與代碼的結(jié)合,現(xiàn)在計算器基本可以運行了,正常情況下基本可以計算了,就是三角函數(shù)以及開方、平方計算還沒有實現(xiàn),不過這個應該很容易實現(xiàn),因為基本框架已經(jīng)搭建好了,今天還是再進一步調(diào)編寫代碼中,預計今天可以實現(xiàn)代碼,后面就是再進一步的完善。接下來還有一個問題需要去解決,那就是如何在qt中保存exe文件,查了一下相關(guān)資料,好像不是那么容易實現(xiàn),現(xiàn)在先把代碼完善了再說吧!2014-1-1就說實話吧,今天由于要考試,整個一天也沒怎么看。2014-時間過得真快,兩周的實習即將結(jié)束,我們的程序也做的差不多了,由于考試忙,還沒怎么完善,今天繼續(xù)完善以及寫報告、做PPT。感覺實習時間安排的相當緊張,我們必須加把勁。今天繼續(xù)把代碼完善了,實現(xiàn)了十進制到十六進制的轉(zhuǎn)換、實現(xiàn)了對輸入的一些限制,如不能連續(xù)輸入多個運算符、在進行第二次輸入時,自動更新而不用去按清除鍵、退格鍵只有在輸入時能夠退格,對輸出結(jié)果不響應。但還有好多需要去完善,我們會努力的。七、實習總結(jié)當時和隊友選題的時候本來打算做數(shù)獨游戲,后來班長說有人做了,我們只能放棄了,后來決定做計算器。其實在假期的時候做過一個小計算器,那時候是用C#語言寫的,函數(shù)實現(xiàn)只是用了簡單的加減乘除,沒有實現(xiàn)優(yōu)先級。由于要用C++做,體現(xiàn)面向?qū)ο蟮乃枷?,而現(xiàn)在已經(jīng)距離C++學習有一年多了,C++基本語法都差不多忘記了,剛開始做的時候感覺一團亂,都不知道如何實現(xiàn),和隊友看完題目要求后,開始分析題目,我們決定采用棧的思想來實現(xiàn),采用qt來設計界面,確定好方向后,我們開始分工,隊友負責在codebooks來實現(xiàn),我負責在qt中來實現(xiàn)。記得當時學習C++的時候只是學習了基本語法,只會編寫一些簡單的程序,老師講MFC也只是大概提了提,連最基本的用法都不會,更別說要做軟件了。Qt也是第一次接觸。安裝qt就花了不少時間,打開qt只會在界面中設計,但并不懂得如何把代碼和界面關(guān)聯(lián)起來。后來通過簡單的學習才知道qt中的精華部分是使用信號和槽機制。在設計界面中,對樣式表的使用不是很明白,后來采用純代碼寫的,在兩個周的努力下,我們的程序終于可以運行了。最后兩天對程序進行了完善,對用戶輸入進行了一些簡單的限制,保證了程序的健壯性!但還是存在很多問題,估計實習期間可能沒辦法全部解決,我們會利用以后的時間盡量去完善的。在此次實習中,我的收獲也不少,下面我具體說說我的收獲吧!1、在以前的C++實習中,只是會編寫一些簡單的程序,并不懂得面向?qū)ο蟮乃枷塍w現(xiàn)在哪里,通過此次實習,使我對面向?qū)ο蟮母拍钣辛烁由羁痰睦斫?。類的封裝,使得程序更加清晰明了,簡單易讀。2、學習使用新的軟件設計軟件——qt,開始時覺得qt很難掌握,界面和代碼不容易結(jié)合在一起,雖說對他的學習并不是很深,只是會簡單的使用,但學習使用一個新的東西的感覺還是很不錯的。3、此次實習是我第一次和同學合作做程序,團隊協(xié)作是一個很重要的能力,通過此次實習,使我感受到了團隊合作的快樂,以及讓我學會如何和別人分工合作??傊?,這次的合作還不錯,分工明確,而又不脫離組織。是一次很值得記憶的實習。4、說實話,雖然編程語言學了那么久了,還是很怕編代碼,但通過此次實習,我真正的體會到了編程的快樂,至少我不會再害怕編程,拿到一個大的工程,學會冷靜去分析。程序出錯也不會再像以前那樣,討厭調(diào)試,學會了冷靜分析代碼中的錯誤。雖然說程序已經(jīng)基本可以運行了,但還是存在很多問題,下面我具體說說存在那些問題:1、有些設計并不是很合理,比如三角函數(shù)、開方和平方的計算,使用并不是很友好,但是考慮到整體性,舍棄了對這部分的完美!2、在操作中,對輸入表達式的順序并未做規(guī)定,也就是說怎么輸入都可以,但在表達式不正確時,統(tǒng)一做異常處理,顯示“####”。對用戶輸入還要做很多的限制,這塊實現(xiàn)的并不是很好,有待完善。總之,此次實習是一個新的開始,而不是結(jié)束!最后,感謝隊友的幫助和配合,感謝老師的耐心指導!八、附錄:核心代碼清單stack類#ifndefSTACK_H#defineSTACK_Hconstintmax_len=20;//棧的最大容量classstack{private:chars[max_len];//棧的內(nèi)容保存在數(shù)組中inttop;//棧頂指示器,??諘r為-1floatn[max_len];public:stack();~stack();intgetTop();voidclear();voidpush(charc);voidpush(floatf);charpop(charc);floatpop(intf);boolempty();boolfull();charremove(charc);floatremove(intf);};calculatorWindow類#endif//STACK_H#ifndefJISUANQI_H#defineJISUANQI_H#endif//JISUANQI_H#ifndefCALCULATOR_H#defineCALCULATOR_H//對calculator.h頭文件的聲明#include<QWidget>//包含主窗體類#include<QPushButton>//包含按鍵類#include<QVBoxLayout>//包含垂直布局器類#include<QHBoxLayout>//包含水平布局器類#include<QLineEdit>//包含顯示框類#include"stack.h"usingnamespacestd;classcalculatorWindow:publicQWidget//計算器繼承自主窗體類{Q_OBJECT//必須加上這句,如果要調(diào)用信號,槽函數(shù)的操作的話public:calculatorWindow();//計算器類的構(gòu)造函數(shù)~calculatorWindow();//計算器類的析構(gòu)函數(shù)publicslots://定義各個按鍵按下后對應操作處理的槽函數(shù)longintchangeHexadecimal(intnum,intpower);voidnumButtonPress(charnum);//按數(shù)字響應事件voidzeroButtonPress();//調(diào)用numButtonPress()函數(shù)voidequButtonPress();voidcalculate();//普通計算voidhexChange(intnum);//進制轉(zhuǎn)換函數(shù)booloperatorCompare(charstackOut,charstackIn);voidpartCalculate(charoper);voidabortOperation();//異常處理函數(shù)private:QLineEdit*operateEdit;//聲明顯示框QPushButton*zeroButton;//聲明數(shù)字按鍵1QPushButton*decimalButton;//小數(shù)點按鈕QPushButton*clearButton;QPushButton*backspaceButton;//聲明運算符按鍵QPushButton*addButton;QPushButton*sinButton;QPushButton*cosButton;QPushButton*tanButton;QPushButton*sqrtButton;QPushButton*powButton;QPushButton*equButton;QPushButton*binaryButton;QPushButton*octButton;QPushButton*hexButton;QPushButton*rightPerButton;QPushButton*leftPerButton;//聲明水平布局器,該布局器主要對24個按鍵進行布局QHBoxLayout*firstLayout;QHBoxLayout*secondLayout;QHBoxLayout*thirdLayout;QHBoxLayout*fourthLayout;QVBoxLayout*mainLayout;//聲明垂直布局器,該布局器主要對主窗體上面的空間進行排布QStringinput;//計算器中要輸入的代數(shù)表達式stacknumStack;stackoperatorStack;stringstr;};#endif//CALCULATOR_HcalculatorWindow.cpp#include"calculatorWindow.h"#include"calculator.h"usingnamespacestd;calculatorWindow::calculatorWindow(){this->setWindowTitle(tr("Calculator"));//設置窗體標題為Calculator//calc=newcalculators();//按鈕operateEdit=newQLineEdit(this);operateEdit->setReadOnly(true);operateEdit->setText(tr("0"));operateEdit->setAlignment(Qt::AlignRight);operateEdit->setMaxLength(30);//為文本框設置字體QFontfont=operateEdit->font();font.setPointSize(font.pointSize()+8);operateEdit->setFont(font);oneButton=newQPushButton;oneButton->setText(tr("1"));oneButton->setFixedHeight(50);oneButton->setFixedWidth(50);//其他按鈕的聲明是一樣的//面板firstLayout=newQHBoxLayout;firstLayout->addWidget(oneButton);firstLayout->addWidget(twoButton);firstLayout->addWidget(threeButton);firstLayout->addWidget(addButton);firstLayout->addWidget(sinButton);firstLayout->addWidget(clearButton);firstLayout->addWidget(backspaceButton);//其他面板的添加按鈕的過程類似//主窗口mainLayout=newQVBoxLayout(this);mainLayout->addWidget(operateEdit);mainLayout->addLayout(firstLayout);mainLayout->addLayout(secondLayout);mainLayout->addLayout(thirdLayout);mainLayout->addLayout(fourthLayout);//信號和槽connect(zeroButton,SIGNAL(clicked()),this,SLOT(zeroButtonPress()));connect(oneButton,SIGNAL(clicked()),this,SLOT(oneButtonPress()));connect(twoButton,SIGNAL(clicked()),this,SLOT(twoButtonPress()));connect(threeButton,SIGNAL(clicked()),this,SLOT(threeButtonPress()));connect(fourButton,SIGNAL(clicked()),this,SLOT(fourButtonPress()));connect(fiveButton,SIGNAL(clicked()),this,SLOT(fiveButtonPress()));connect(sixButton,SIGNAL(clicked()),this,SLOT(sixButtonPress()));connect(sevenButton,SIGNAL(clicked()),this,SLOT(sevenButtonPress()));connect(eightButton,SIGNAL(clicked()),this,SLOT(eightButtonPress()));connect(nineButton,SIGNAL(clicked()),this,SLOT(nineButtonPress()));connect(decimalButton,SIGNAL(clicked()),this,SLOT(decimalButtonPress()));connect(addButton,SIGNAL(clicked()),this,SLOT(addButtonPress()));connect(subButton,SIGNAL(clicked()),this,SLOT(subButtonPress()));connect(mulButton,SIGNAL(clicked()),this,SLOT(mulButtonPress()));connect(divButton,SIGNAL(clicked()),this,SLOT(divButtonPress()));connect(sinButton,SIGNAL(clicked()),this,SLOT(sinButtonPress()));connect(cosButton,SIGNAL(clicked()),this,SLOT(cosButtonPress()));connect(tanButton,SIGNAL(clicked()),this,SLOT(tanButtonPress()));connect(sqrtButton,SIGNAL(clicked()),this,SLOT(sqrtButtonPress()));connect(powButton,SIGNAL(clicked()),this,SLOT(powButtonPress()));connect(rightPerButton,SIGNAL(clicked()),this,SLOT(rightPerButtonPress()));connect(leftPerButton,SIGNAL(clicked()),this,SLOT(leftPerButtonPress()));connect(equButton,SIGNAL(clicked()),this,SLOT(equButtonPress()));connect(clearButton,SIGNAL(clicked()),this,SLOT(clearButtonPress()));connect(backspaceButton,SIGNAL(clicked()),this,SLOT(backspaceButtonPress()));connect(binaryButton,SIGNAL(clicked()),this,SLOT(binaryButtonPress()));connect(octButton,SIGNAL(clicked()),this,SLOT(octButtonPress()));connect(hexButton,SIGNAL(clicked()),this,SLOT(hexButtonPress()));input="0";//初始化運算操作數(shù)2為0}//然后是析構(gòu)函數(shù)的實現(xiàn):calculatorWindow::~calculatorWindow()//析構(gòu)函數(shù)主要完成對構(gòu)造函數(shù)中所聲明的QLineEdit、QPushButton、QHBoxLayout、QVBoxLayout類的對象的回收工作(可以不定義析構(gòu)函數(shù),程序運行結(jié)束時會自動調(diào)用系統(tǒng)默認的析構(gòu)函數(shù)){if(operateEdit!=NULL)//{operateEdit=NULL;deleteoperateEdit;}if(zeroButton!=NULL){zeroButton=NULL;deletezeroButton;}}ButtonPress.cpp#include"calculatorWindow.h"http://數(shù)字鍵和最基本的運算符建的實現(xiàn)voidcalculatorWindow::numButtonPress(charnum){if(opreate){//判斷是否開始第二次計算,如果opreate為真,單擊數(shù)字鍵就表示開始新的計算operateEdit->setText(0);opreate=0;//將文本置為零,將opreate置為0,一邊下一次輸入表達式}if(input=="0")//如果當前顯示框為0{input=num;//變0為num}else{input=operateEdit->text();input.append(num);}operateEdit->setText(input);//更新顯示框中的顯示信息opreated=0;//輸入數(shù)字后將opreate改為1,等待運算符輸入}//一元運算符的響應函數(shù)voidcalculatorWindow::danButtonPress(charop){if(input=="0")//如果當前顯示框為0{input=op;//變0為num}else{input=operateEdit->text();input.append(op);}operateEdit->setText(input);//更新顯示框中的顯示信息}//二元運算符響應事件voidcalculatorWindow::opreateButtonPress(charop){//實現(xiàn)不能連續(xù)輸入運算符//如果前面的字符為運算符,則opreated=1,不能再次輸入運算符。//只有opreated=0時才可以輸入運算符if(!opreated){opreate=0;//只有opreate為假時才可以輸入運算符if(!opreate){if(input=="0")//如果當前顯示框為0{input=op;//變0為num}else{input=operateEdit->text();input.append(op);}operateEdit->setText(input);//更新顯示框中的顯示信息}opreated=1;}}//二元運算符按鍵處理函數(shù)voidcalculatorWindow::opreateButtonPress(charop){//實現(xiàn)不能連續(xù)輸入運算符//如果前面的字符為運算符,則opreated=1,不能再次輸入運算符。//只有opreated=0時才可以輸入運算符if(!opreated){opreate=0;//只有opreate為假時才可以輸入運算符if(!opreate){if(input=="0")//如果當前顯示框為0{input=op;//變0為num}else{input=operateEdit->text();input.append(op);}operateEdit->setText(input);//更新顯示框中的顯示信息}opreated=1;}}//數(shù)字鍵的實現(xiàn)voidcalculatorWindow::oneButtonPress(){numButtonPress('1');}voidcalculatorWindow::twoButtonPress(){numButtonPress('2');}voidcalculatorWindow::threeButtonPress(){numButtonPress('3');}voidcalculatorWindow::fourButtonPress(){numButtonPress('4');}voidcalculatorWindow::fiveButtonPress(){numButtonPress('5');}voidcalculatorWindow::sixButtonPress(){numButtonPress('6');}voidcalculatorWindow::sevenButtonPress(){numButtonPress('7');}voidcalculatorWindow::eightButtonPress(){numButtonPress('8');}voidcalculatorWindow::nineButtonPress(){numButtonPress('9');}voidcalculatorWindow::zeroButtonPress(){numButtonPress('0');}//運算符的按鍵響應voidcalculatorWindow::addButtonPress(){opreateButtonPress('+');}voidcalculatorWindow::subButtonPress(){opreateButtonPress('-');}voidcalculatorWindow::mulButtonPress(){opreateButtonPress('*');}voidcalculatorWindow::divButtonPress(){opreateButtonPress('/');}//小數(shù)點按鍵處理voidcalculatorWindow::decimalButtonPress(){numButtonPress('.');}//三角函數(shù)的實現(xiàn),考慮到運算的一致性,便于封裝函數(shù),故運算規(guī)則只能是先輸入數(shù)字,后輸入運算符//在這里三角函數(shù)只是計算了弧度制的voidcalculatorWindow::sinButtonPress(){opreateButtonPress('S');}voidcalculatorWindow::cosButtonPress(){opreateButtonPress('C');}voidcalculatorWindow::tanButtonPress(){opreateButtonPress('T');}//開方和平方的運算響應事件voidcalculatorWindow::sqrtButtonPress(){opreateButtonPress('Q');}voidcalculatorWindow::powButtonPress(){opreateButtonPress('W');}//括號按鍵響應事件voidcalculatorWindow::rightPerButtonPress(){numButtonPress('(');}voidcalculatorWindow::leftPerButtonPress(){numButtonPress(')');}//二進制的轉(zhuǎn)換voidcalculatorWindow::binaryButtonPress(){hexChange(2);opreate=1;}//八進制的轉(zhuǎn)換voidcalculatorWindow::octButtonPress(){hexChange(8);opreate=1;}//十六進制的轉(zhuǎn)換,由于牽扯到非數(shù)字字符,暫時并未實現(xiàn)voidcalculatorWindow::hexButtonPress(){if(opreate){//判斷是否開始第二次計算,如果opreate為真,單擊數(shù)字鍵就表示開始新的計算operateEdit->setText(0);opreate=0;//將文本置為零,將opreate置為0,一邊下一次輸入表達式}QStringa=operateEdit->text();inttemp=a.toInt();stringresult=decToHex(temp);operateEdit->setText(QString::fromStdString(result));opreate=1;}//功能鍵//等號按鍵的實現(xiàn)voidcalculatorWindow::equButtonPress(){opreateButtonPress('=');calculate();opreate=1;}//Clear鍵的實現(xiàn)voidcalculatorWindow::clearButtonPress(){input="0";//把運算操作數(shù)2清零operateEdit->setText(input);//更新顯示框中的顯示內(nèi)容}//退格鍵的實現(xiàn)voidcalculatorWindow::backspaceButtonPress(){if(!opreate){input=operateEdit->text();input.chop(1);if(input.isEmpty()){input="0";}operateEdit->setText(input);}}Calculator.cpp#include<string>#include<stdio.h>#include<iostream>#include<ctype.h>#include<stdlib.h>//用atof()時需要用到該頭文件#include<math.h>#include"calculatorwindow.h"#include<sstream>usingnamespacestd;#defineMAX30//計算器輸入的數(shù)字最大的字符個數(shù)為30//異常處理函數(shù)voidcalculatorWindow::abortOperation(){input="0";operateEdit->setText(tr("####"));}//表達式計算voidcalculatorWindow::calculate(){operatorStack.push('#');QStringinput=operateEdit->text();strings=input.toStdString();//cout<<s<<endl;inti=0;intj;chartemp[MAX];floatc;while(s[i]!='\0'){if(isdigit(s[i])){j=0;while(isdigit(s[i])||s[i]=='.'){try{if(j<MAX-1){temp[j]=s[i];j++;i++;}}catch(exceptione){numStack.clear();operatorStack.clear();return;//cout<<"輸入的數(shù)字的位數(shù)超出計算器的規(guī)定長度!請重新輸入算式"<<endl;abortOperation();}}temp[j]='\0';c=atof(temp);//類型轉(zhuǎn)換,將字符字符數(shù)組轉(zhuǎn)換為數(shù)字try{if(!numStack.full())numStack.push(c);}catch(exceptione){//cout<<"輸入的數(shù)字的位數(shù)超出計算器的規(guī)定長度!請重新輸入"<<endl;abortOperation();}}//如果s[i]是數(shù)字或者是小數(shù)點那么就存入數(shù)組temp中,直到符號出現(xiàn),然后將數(shù)字壓入數(shù)字棧else{charstackin=operatorStack.pop('a');//取符號棧的棧頂元素/*此處加一個對負數(shù)的判斷,因為只有開頭時負數(shù)才直接可以寫符號*///if(i==0&&s[i]=='-')//{//}while(!operatorCompare(s[i],stackin))//棧頂元素與棧外元素比較,如果棧內(nèi)符號優(yōu)先級大于等于棧外符號優(yōu)先級則執(zhí)行{if(stackin=='#'){//cout<<"計算結(jié)果:"<<endl;//cout<<numStack.pop(1)<<endl;operateEdit->setText(QString::number(numStack.pop(1)));gotoloop2;//重啟計算器}if(s[i]==')')//這里可以用等于來判斷{if(stackin=='('){operatorStack.remove('a');}//如果下一個符號是')'并且棧內(nèi)符號是'(',那么符號'('出棧。gotoloop1;}else{partCalculate(stackin);//棧內(nèi)符號優(yōu)先級較棧外符號優(yōu)先級高,局部計算operatorStack.remove('a');//使用完的符號從符號棧中移除stackin=operatorStack.pop('a');//再與符號棧中的下一個符號進行比較}}//棧內(nèi)符號比棧外符號優(yōu)先級高,計算,符號出棧,數(shù)字壓棧operatorStack.push(s[i]);loop1:i++;//這里是為了去掉兩個相鄰的()進行下一步計算}//如果去到的是符號,那么與棧內(nèi)符號比較}loop2:return;//calculate();//cout<<numStack.pop(1)<<endl;//operateEdit->setText(QString::number(numStack.pop(1)));}//表達式計算boolcalculatorWindow::operatorCompare(charstackOut,charstackIn)//operatorA為棧內(nèi)符號,operationB為棧外符號{inttempOut,tempIn;switch(stackOut){case'+':case'-':tempOut=1;break;case'*':case'/':tempOut=3;break;case'(':tempOut=7;break;case')':tempOut=0;break;case'S':case'C':case'T':case'O':case'X':case'Q':case'W':tempOut=5;break;/***修改處*******/case'=':tempOut=-1;case'#':tempOut=-2;break;/***修改處*******/default:abortOperation();//這里要對異常進行處理,如何處理后面考慮break;}switch(stackIn){case'+':case'-':tempIn=2;break;case'*':case'/':tempIn=4;break;case'(':tempIn=0;break;case')':tempIn=7;break;case'S':case'C':case'T':case'X':case'Q':case'W':tempIn=5;break;case'#':tempIn=-1;break;default:abortOperation();//這里要對異常進行處理,如何處理后面考慮break;//這里可以嘗試用goto語句,或者是用重新調(diào)用一個函數(shù)}if(tempOut>tempIn){returntrue;}else{returnfalse;}}//該函數(shù)實現(xiàn)的是對棧外符號和棧內(nèi)符號的比較voidcalculatorWindow::partCalculate(charoper){floattemp1;floattemp2;switch(oper){case'S':temp1=numStack.remove(1);temp1=sin(temp1);numStack.push(temp1);break;case'C':temp1=numStack.remove(1);temp1=cos(temp1);numStack.push(temp1);break;case'T':temp1=numStack.remove(1);temp1=tan(temp1);numStack.push(temp1);break;case'X':temp1=numStack.remove(1);if(temp1==0){abortOperation();}else{temp1=1/temp1;numStack.push(temp1);}break;case'Q':temp1=numStack.remove(1);temp1=sqrt(temp1);numStack.push(temp1);break;case'W':temp1=numStack.remove(1);temp1=pow(temp1,2);numStack.push(temp1);break;case'+':temp1=numStack.remove(1);temp2=numStack.remove(1);temp1=temp1+temp2;numStack.push(temp1);break;case'-':temp1=numStack.remove(1);temp2=numStack.remove(1);temp1=temp2-temp1;numStack.push(temp1);break;case'*':temp1=numStack.remove(
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年蓖麻蛋白項目投資可行性研究分析報告
- 五年級數(shù)學上冊教案25:小數(shù)加、減法練習-蘇教版
- 西藥行業(yè)市場發(fā)展現(xiàn)狀及趨勢與投資分析研究報告-20241228-095215
- 現(xiàn)代辦公環(huán)境下的交流空間設計研究
- 知識產(chǎn)權(quán)價值評估在商業(yè)決策中的作用
- 2025年中國重油燃燒器行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2025年修甲剪項目投資可行性研究分析報告
- 激發(fā)創(chuàng)意火花用情感鏈接來塑造品牌
- 2025年中國水袋背囊未來趨勢預測分析及投資規(guī)劃研究建議報告
- 2024-2030年中國洛芬待因緩釋片行業(yè)市場全景監(jiān)測及投資前景展望報告
- 人教版語文五年級下冊《第八單元》大單元整體教學設計2022課標
- 信息技術(shù)咨詢服務合同5篇
- GB/T 44489-2024高級輔助駕駛地圖審查要求
- (新版)區(qū)塊鏈應用操作員職業(yè)技能競賽理論考試題庫-下(多選、判斷題)
- 四年級上冊四則混合運算練習300道及答案
- 部編版道德與法治四年級下冊-全冊教案設計(表格版)
- 2022年江蘇省常州市強基計劃選拔數(shù)學試卷(附答案解析)
- 2024-2030年中國體外除顫器行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 2024-2030年中國人力資源行業(yè)市場發(fā)展前瞻及投資戰(zhàn)略研究報告
- 機械基礎(少學時)(第三版) 課件 0-緒論
- 2024-2030年中國樺樹汁行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
評論
0/150
提交評論