數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)簡單計(jì)算器C語言_第1頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)簡單計(jì)算器C語言_第2頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)簡單計(jì)算器C語言_第3頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)簡單計(jì)算器C語言_第4頁
數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)簡單計(jì)算器C語言_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、鄭州師范學(xué)院信息科學(xué)與技術(shù)學(xué)院 簡單計(jì)算器課程設(shè)計(jì)報(bào)告設(shè)計(jì)題目: 簡單計(jì)算器 班 級: B15計(jì)科二班 組 長: 組 員: 指導(dǎo)教師: 完成日期: 2016 年 12 月 23 日 成績: 摘 要本次選做的課程設(shè)計(jì)是實(shí)現(xiàn)簡單計(jì)算器的問題。計(jì)算器是一個(gè)常用的運(yùn)算工具,本次課題要求用程序語言的方式解決問題。此問題僅使用數(shù)據(jù)結(jié)構(gòu)中的棧操作就可以解決此問題。而在為了方便使用,添加了easyx圖形庫實(shí)現(xiàn)了UI設(shè)計(jì)。為了接近平常使用的計(jì)算器,特地創(chuàng)建死循環(huán)而且添加了“CE”清空輸入和“<-”刪除鍵來控制輸入錯(cuò)誤或者循環(huán)使用的問題。在UI方面主要是實(shí)現(xiàn)按鍵和點(diǎn)擊響應(yīng)等交互,方便輸入和修改,在程序框上面

2、有輸入和顯示結(jié)果的文本框。在計(jì)算過程中,以棧出棧進(jìn)站的特性把中綴形式的算數(shù)表達(dá)式轉(zhuǎn)化為計(jì)算機(jī)方便計(jì)算的后綴表達(dá)式,最后計(jì)算出結(jié)果以文本方式顯示在結(jié)果輸出框內(nèi)。 目 錄摘 要I目 錄II1需求分析31.1功能簡介及分析31.2設(shè)計(jì)平臺32概要設(shè)計(jì)32.1 Trans函數(shù)32.2 Compvalue 函數(shù)42.3 GetKey函數(shù)43詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)43.1轉(zhuǎn)化為逆波蘭式43.2計(jì)算逆波蘭式63.3實(shí)現(xiàn)流程圖73.3部分具體程序84調(diào)試與操作說明134.1調(diào)試情況134.2操作說明145設(shè)計(jì)總結(jié)15參考文獻(xiàn)161需求分析1.1功能簡介及分析本次選做的課程設(shè)計(jì)是實(shí)現(xiàn)簡單的計(jì)算器并且添加UI的交互。此計(jì)

3、算器是以軟件的形式實(shí)現(xiàn)的計(jì)算器,運(yùn)行在windows系統(tǒng)。計(jì)算器在功能上分為三類,分別是:常見計(jì)算器,專用計(jì)算器,綜合功能計(jì)算器。常見的計(jì)算器又分為四種: 簡單型計(jì)算器:只實(shí)現(xiàn)基本的加減乘除和括號運(yùn)算。 科學(xué)型計(jì)算器:可以進(jìn)行乘方、開方、指數(shù)、對數(shù)、三角函數(shù)、統(tǒng)計(jì)等方面的運(yùn)算,又稱函數(shù)計(jì)算器。 程序員計(jì)算器:專門為程序員設(shè)計(jì)的計(jì)算器, 主要特點(diǎn)是支持And, Or, Not, Xor: 最基本的與或非和異或操作, 移位操作 Lsh, Rsh:全稱是Left Shift和Right Shift,也就是左移和右移操作,你需要輸入你要移動的位數(shù)(不能大于最大位數(shù)) RoL, RoR:全稱是Rotat

4、e Left和Rotate Right,對于RoL來講,就是向左移動一位,并將移出的那位補(bǔ)到最右邊那位上,RoR類似。 統(tǒng)計(jì)型計(jì)算器:為有統(tǒng)計(jì)要求的人員設(shè)計(jì)的設(shè)計(jì)的計(jì)算器。本次課程設(shè)計(jì)只是實(shí)現(xiàn)了常見的簡單計(jì)算器:在界面上:簡單的計(jì)算器需要有簡單的按鍵和按鍵響應(yīng),有輸入和結(jié)果的顯示。在功能上:能進(jìn)行加減乘除混合運(yùn)算,可以使用括號,有“M”鍵可以存儲結(jié)果,以便下次計(jì)算使用,可以對輸入的文本刪除和重置。并且可以在重置后繼續(xù)使用。1.2設(shè)計(jì)平臺Windows7操作系統(tǒng);Visual Studio 20152概要設(shè)計(jì)2.1 Trans函數(shù)主要功能中綴算術(shù)表達(dá)式轉(zhuǎn)化成后綴表達(dá)式,然后存到棧里,以便計(jì)算時(shí)使

5、用,轉(zhuǎn)化時(shí)包括對小括號的匹配。2.2 Compvalue 函數(shù)主要功能是對棧中的后綴表達(dá)式進(jìn)行計(jì)算,然后返回float類型的結(jié)果。2.3 GetKey函數(shù)GetKey主要是在UI界面中獲取按鍵然后保存成字符數(shù)組或者對字符數(shù)組的增減操作的函數(shù)。此函數(shù)為內(nèi)置死循環(huán),可以重復(fù)使用。3詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)實(shí)現(xiàn)軟件形式的常用簡單計(jì)算機(jī),主要用到棧的特點(diǎn),把平常使用的表達(dá)式,轉(zhuǎn)化為能夠讓計(jì)算機(jī)計(jì)算的逆波蘭表達(dá)式。中綴表達(dá)式(或中綴記法)是一個(gè)通用的算術(shù)或邏輯公式表示方法, 操作符是以中綴形式處于操作數(shù)的中間(例:3 + 4),中綴表達(dá)式是人們常用的算術(shù)表示方法。與前綴表達(dá)式(例:+ 3 4)或后綴表達(dá)式(例:3

6、 4 +)相比,中綴表達(dá)式不容易被計(jì)算機(jī)解析,但仍被許多程序語言使用,因?yàn)樗先藗兊钠毡橛梅āEc前綴或后綴記法不同的是,中綴記法中括號是必需的。計(jì)算過程中必須用括號將操作符和對應(yīng)的操作數(shù)括起來,用于指示運(yùn)算的次序。例:(1)8+4-6*2用后綴表達(dá)式表示為:62*84+-(2)2*(3+5)-4+7/1用后綴表達(dá)式表示為:35+2*71/4-+3.1轉(zhuǎn)化為逆波蘭式首先需要分配2個(gè)棧,一個(gè)作為臨時(shí)存儲運(yùn)算符的棧S1(含一個(gè)結(jié)束符號),一個(gè)作為輸入逆波蘭式的棧S2(空棧),S1棧可先放入優(yōu)先級最低的運(yùn)算符#,注意,中綴式應(yīng)以此最低優(yōu)先級的運(yùn)算符結(jié)束。可指定其他字符,不一定非#不可。從中綴式的左端

7、開始取字符,逐序進(jìn)行如下步驟:(1)若取出的字符是操作數(shù),則分析出完整的運(yùn)算數(shù),該操作數(shù)直接送入S2棧(2)若取出的字符是運(yùn)算符,則將該運(yùn)算符與S1棧棧頂元素比較,如果該運(yùn)算符優(yōu)先級大于S1棧棧頂運(yùn)算符優(yōu)先級,則將該運(yùn)算符進(jìn)S1棧,否則,將S1棧的棧頂運(yùn)算符彈出,送入S2棧中,直至S1棧棧頂運(yùn)算符低于(不包括等于)該運(yùn)算符優(yōu)先級,則將該運(yùn)算符送入S1棧。(3)若取出的字符是“(”,則直接送入S1棧底。(4)若取出的字符是“)”,則將距離S1棧棧底最近的“(”之間的運(yùn)算符,逐個(gè)出棧,依次送入S2棧,此時(shí)拋棄“(”。(5)重復(fù)上面的14步,直至處理完所有的輸入字符。(6)若取出的字符是“#”,則將

8、S1棧內(nèi)所有運(yùn)算符(不包括“#”),逐個(gè)出棧,依次送入S2棧。完成以上步驟,S2棧便為逆波蘭式輸出結(jié)果。不過S2應(yīng)做一下逆序處理。便可以按照逆波蘭式的計(jì)算方法計(jì)算了!例如轉(zhuǎn)換:2-(1+2)*3+4轉(zhuǎn)換后的逆波蘭表達(dá)式是:2 1 2 + 3 * - 4 +3.2計(jì)算逆波蘭式逆波蘭式的計(jì)算同樣用到了棧的特點(diǎn),首先需要建立一個(gè)空棧T,然后從頭遍歷逆波蘭式,如果是數(shù)字則直接放到棧頂,如果遇到操作符則連續(xù)取出兩個(gè)棧頂數(shù)據(jù),分別賦值給n1,n2,再根據(jù)操作符計(jì)算n1和n2,把得到的結(jié)果放到T棧棧頂,繼續(xù)操作,直到遍歷完畢。以上面的例子計(jì)算過程如圖:最后得出的結(jié)果是-3,即2-(1+2)*3+4=-3;所

9、以計(jì)算的具體過程是先轉(zhuǎn)化中綴表達(dá)式為逆波蘭表達(dá)式,然后由逆波蘭表達(dá)式計(jì)算出結(jié)果,在轉(zhuǎn)化的過程和最后的計(jì)算過程都用到了棧的思想,利用棧的進(jìn)棧和出棧的特點(diǎn)實(shí)現(xiàn)轉(zhuǎn)換。3.3實(shí)現(xiàn)流程圖開始通過界面按鍵獲得輸入內(nèi)容轉(zhuǎn)換為逆波蘭式結(jié)束保存輸入內(nèi)容到字符數(shù)組繼續(xù)輸入對字符數(shù)組里的數(shù)字字符進(jìn)行轉(zhuǎn)義成數(shù)據(jù)型計(jì)算并顯示出結(jié)果是否繼續(xù)使用?否清空顯示是簡單運(yùn)行流程圖3.3部分具體程序/界面顯示文字,”$”表示結(jié)束位置char KeyStr4 = "CE" , "<-" , "M" , "/" , "(" , &

10、quot;)" , "" , "" , "7" , "8" , "9" , "*" , "4" , "5" , "6" , "+" , "1" , "2" , "3" , "-" , "00" , "0" , "." , "="

11、, "$" ;void Trans(STR *InStr , char Lasts)/*將算術(shù)表達(dá)式轉(zhuǎn)化為后綴表達(dá)式*/int i = 1;char StackMAX;/*作為棧使用*/char ChStr = InStr->Stri;/用于保存數(shù)組里的臨時(shí)元素i+;int LastStrPos = 1, StackTop = 0;/StackTop用于表示棧頂while (ChStr != '#')switch (ChStr)case'(':/*判定為左括號*/StackTop+; StackStackTop = ChStr;brea

12、k;case')':/*判定為右括號*/while (StackStackTop != '(')LastsLastStrPos = StackStackTop; StackTop-; LastStrPos+;StackTop-;/扔掉(break;case'+':/*判定為加減號*/case'-':while (StackTop != 0 && StackStackTop != '(')LastsLastStrPos = StackStackTop;StackTop-;LastStrPos+;Sta

13、ckTop+;/保留(StackStackTop = ChStr;break;case'*':/*判定為乘除號*/case'/':while (StackStackTop = '*' | StackStackTop = '/')LastsLastStrPos = StackStackTop;/如果棧頂是*或者/彈出,放到后綴數(shù)組里StackTop-;LastStrPos+;StackTop+;StackStackTop = ChStr;break;case' ':break;/忽略空格default:while (

14、ChStr >= '0' && ChStr <= '9' | ChStr = '.')/*判定為數(shù)字*/LastsLastStrPos = ChStr; LastStrPos+;ChStr = InStr->Stri;i+;i-;LastsLastStrPos = ' '/輸出的時(shí)候隔開元素LastStrPos+;ChStr = InStr->Stri; i+;while (StackTop != 0)LastsLastStrPos = StackStackTop;LastStrPos+;

15、StackTop-;LastsLastStrPos = ' 'LastStrPosT = LastStrPos;float Compvalue(char LastStrTemp)/*計(jì)算后綴表達(dá)式的值*/float StackMAX;/*作為棧使用*/char ChStr;/臨時(shí)棧元素int StackTop = 0;/*LastStrPos為Lasts下標(biāo),StackTop為Stack下標(biāo)*/int LastStrPos = 1;ChStr = LastStrTempLastStrPos;LastStrPos+;while (ChStr != ' ')swit

16、ch (ChStr)case'+':StackStackTop - 1 = StackStackTop - 1 + StackStackTop;StackTop-;break;case'-':StackStackTop - 1 = StackStackTop - 1 - StackStackTop;StackTop-;break;case'*':StackStackTop - 1 = StackStackTop - 1 * StackStackTop;StackTop-;break;case'/':if (StackStackTo

17、p != 0)StackStackTop - 1 = StackStackTop - 1 / StackStackTop;elseexit(0);/*異常退出*/StackTop-;break;default:float NumStr = 0;/把數(shù)字字符轉(zhuǎn)化為數(shù)字bool FlNum = 0;while (ChStr >= '0' && ChStr <= '9' | ChStr = '.')if (ChStr = '.') FlNum = 1;else if (!FlNum) NumStr = 10

18、* NumStr + ChStr - '0'/*將數(shù)字字符轉(zhuǎn)化為對應(yīng)的數(shù)值*/else if (FlNum) NumStr += 0.1 * (ChStr - '0');/*計(jì)算小數(shù)*/ChStr = LastStrTempLastStrPos;LastStrPos+;StackTop+;StackStackTop = NumStr;ChStr = LastStrTempLastStrPos;LastStrPos+;return StackStackTop;void GetKey() /*FlushMouseMsgBuffer 清空鼠標(biāo)消息緩沖區(qū)。 GetMou

19、seMsg 獲取一個(gè)鼠標(biāo)消息。如果當(dāng)前鼠標(biāo)消息隊(duì)列中沒有,就一直等待。 MouseHit 檢測當(dāng)前是否有鼠標(biāo)消息。 MOUSEMSG 保存鼠標(biāo)消息的結(jié)構(gòu)體。 */MOUSEMSG Msg;RECT r = 0 , WINKEYY * 2 / 3 , WINSIZEX, WINKEYY * 2 ;IMAGE ClearImgUp , ClearImgDown;int ProPos = 0;/上一個(gè)點(diǎn)擊的按鈕int temp = 0;/當(dāng)前點(diǎn)擊的按鈕int InCon = 0;/輸入的字符數(shù)int TempI = 0;float LastStrTemp = LastV;char StrTempMA

20、X;char M_Str20 = '/0' ;FlushMouseMsgBuffer();getimage(&ClearImgUp, 1, 1, WINSIZEX , WINKEYY * 2 / 3);/獲得輸入?yún)^(qū)域的截圖,用于覆蓋原先輸入的內(nèi)容getimage(&ClearImgDown, 1, WINKEYY * 2 / 3, WINSIZEX, WINKEYY * 2);/獲得輸出區(qū)域的截圖,用于覆蓋原先輸入的內(nèi)容while (TRUE) Msg = GetMouseMsg();if (Msg.uMsg) temp = JudgePos(Msg.x, Ms

21、g.y);switch (Msg.uMsg) case WM_LBUTTONDOWN:setlinecolor(YELLOW);rectangle(Postemp.x0, Postemp.y0, Postemp.x1, Postemp.y1);switch (temp) case 1:GetStr0 = '0'putimage(1, 1, &ClearImgUp);putimage(1, WINKEYY * 2 / 3, &ClearImgDown);InCon = 0;PrintStr();break;case 2:if(InCon > 0)/判斷是否有

22、輸入的字符GetStrInCon - 1 = '0'putimage(1, 1, &ClearImgUp);InCon-;PrintStr();break;case 3:strcat_s(GetStr, M_Str);InCon+;PrintStr();break;case 24:settextstyle(50, 0, _T("Prestige Elite Std");/設(shè)置字體大小,寬度,文字樣式putimage(1, WINKEYY * 2 / 3, &ClearImgDown);GiveStr(GetStr, TheLastStr);d

23、rawtext(_T(TheLastStr), &r, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);break;case 7:case 8:break;default:strcat_s(GetStr, KeyStrtemp - 1);InCon+;PrintStr();Sleep(50);break;case WM_RBUTTONDOWN:setlinecolor(BLUE);rectangle(Postemp.x0, Postemp.y0, Postemp.x1, Postemp.y1);switch (temp) case 3:strcpy(M_S

24、tr, TheLastStr);break;break;setlinecolor(BLACK);rectangle(PosProPos.x0, PosProPos.y0, PosProPos.x1, PosProPos.y1);if (temp != 0) setlinecolor(RED);rectangle(Postemp.x0, Postemp.y0, Postemp.x1, Postemp.y1);ProPos = temp;4調(diào)試與操作說明4.1調(diào)試情況這次的課程設(shè)計(jì)的代碼很冗長,在實(shí)現(xiàn)整個(gè)思路之后難免會有很多錯(cuò)誤。編寫代碼過程中遇到很多錯(cuò)誤和難題。不過經(jīng)過一點(diǎn)點(diǎn)的改正和攻克,錯(cuò)誤也

25、慢慢地變少,難題也逐個(gè)解開。在計(jì)算機(jī)領(lǐng)域代碼無論在邏輯上還是在編寫上都不允許有一點(diǎn)錯(cuò)誤,因?yàn)橐稽c(diǎn)的錯(cuò)誤就會使整個(gè)程序崩潰,有時(shí)即便能夠成功運(yùn)行,得出的結(jié)果也有可能和預(yù)期的結(jié)果千差萬別,但是也是因?yàn)檫@樣的嚴(yán)謹(jǐn)編寫和工作學(xué)習(xí)中,使得調(diào)試或者編寫代碼的人逐漸培養(yǎng)出了有耐心,有毅力,并且嚴(yán)謹(jǐn)細(xì)心的心境。一般在編寫代碼過程留下的邏輯錯(cuò)誤或者編寫錯(cuò)誤都會在調(diào)試的時(shí)候遇到,這個(gè)時(shí)候就體現(xiàn)出了調(diào)試的重要性。調(diào)試可以使程序的可運(yùn)行性、健壯性、效率性上大幅度提高。本程序在調(diào)試中遇到了很多問題,如計(jì)算結(jié)果的準(zhǔn)確性、顯示結(jié)果的準(zhǔn)確性或者顯示位置等等。本程序還存在的問題是對計(jì)算的精確度支持低,只支持兩位小數(shù)點(diǎn),并且在應(yīng)

26、對錯(cuò)誤計(jì)算或者錯(cuò)誤輸入沒有進(jìn)行匹配,這些問題都會在使用的過程中可能造成程序的崩潰,但是這些問題都會在以后的設(shè)計(jì)中進(jìn)行完善和增強(qiáng)。4.2操作說明生成界面如圖所示:生成界面當(dāng)程序運(yùn)行的時(shí)候會出現(xiàn)如上圖所示,要求使用者通過按鍵輸入運(yùn)算表達(dá)式,使用者只需點(diǎn)擊輸入想要計(jì)算的表達(dá)式,最后點(diǎn)擊“=”鍵后,系統(tǒng)便會計(jì)算出結(jié)果并且顯示出來。然后可以點(diǎn)擊“<-”鍵刪除修改表達(dá)式,或者通過“CE”鍵清空表達(dá)式和顯示的結(jié)果,當(dāng)然也可以通過點(diǎn)擊“M”鍵暫時(shí)保存當(dāng)前計(jì)算的結(jié)果,以便于下次計(jì)算使用(右鍵M把當(dāng)前結(jié)果存到M中,默認(rèn)是0,左鍵M輸入當(dāng)前M內(nèi)的值)。5設(shè)計(jì)總結(jié)本次課程設(shè)計(jì)大概花費(fèi)了兩周的時(shí)間,其中10天左右

27、用來編寫和調(diào)試程序代碼,4天左右用來對程序編寫報(bào)告。在此之間,遇到了許多編寫上的難題和遇到錯(cuò)誤的抓狂,但是這些都在耐心的,一次一次的調(diào)試中解決和攻克。當(dāng)再次總結(jié)后感覺收獲很大,首先在編寫代碼上,增加自己的代碼量,提高了編寫的熟練度。其次增加了對棧的使用和理解,也有了一些在使用棧的方法和經(jīng)驗(yàn)。然后是對界面設(shè)計(jì)的認(rèn)識,如按鍵反饋、按鍵響應(yīng)速度、顏色的搭配、字體的格式等等。最后是對在修改和調(diào)試代碼的經(jīng)驗(yàn),代碼調(diào)試的過程是最辛苦的但也是最能體現(xiàn)編寫代碼能力的地方,看一個(gè)人代碼編寫能力怎么樣,不是說讓實(shí)現(xiàn)一個(gè)功能,而是在拿到一個(gè)存在諸多BUG時(shí)能一步步解決這些問題。當(dāng)然,在編寫這個(gè)報(bào)告時(shí),程序可能還是存

28、在一些錯(cuò)誤沒被發(fā)現(xiàn),這些都需要在后繼的補(bǔ)充完善中慢慢發(fā)現(xiàn)和更正,還有是本程序功能少,只是實(shí)現(xiàn)了常用的簡單計(jì)算器,對于和科學(xué)計(jì)算器或者程序員計(jì)算器等功能都為涉及,這些也將會成為我在后續(xù)的設(shè)計(jì)中一點(diǎn)點(diǎn)添加上去,因?yàn)槲蚁嘈牛恳粋€(gè)復(fù)雜的龐大的系統(tǒng)或者程序都是在簡單的基礎(chǔ)上一點(diǎn)點(diǎn)完善的。也希望我能在后續(xù)的開發(fā)設(shè)計(jì)中能學(xué)習(xí)更多,收獲更多,并且能一直堅(jiān)持下去。參考文獻(xiàn)1 欒大成. 大話數(shù)據(jù)結(jié)構(gòu)M. 北京清華大學(xué)學(xué)研大廈A座:清華大學(xué)出版社, 2011. 1-433 2 甘勇, 李曄, 盧冰. C語言課程設(shè)計(jì)M. 北京市西城區(qū)右安門西街8號:中國鐵道出版社, 2014. 1-3403 嚴(yán)蔚敏,吳偉民. 數(shù)據(jù)

29、結(jié)構(gòu)M. 北京清華大學(xué)學(xué)研大廈A座:清華大學(xué)出版社, 2007. 1-3344 張宏林,孔艷,王哲等編著按實(shí)例學(xué)Microsoft Visual Studio 2005 6.0M.北京:人民郵電出版社,20005 Brian W Kernighan , Dennis M Ritchie. The C Programming LanguageM. Pubilished:Prentice-Hall , 2004.6 陳朔鷹, 陳英. C語言趣味程序百例精解M. 北京理工大學(xué):北京理工大學(xué)出版社, 1996. 1-4357 譚浩強(qiáng). C 程序設(shè)計(jì)(第二版)M. 清華大學(xué):清華大學(xué)出版社, 2014.

30、 1-3508 譚浩強(qiáng). C 語言程序設(shè)計(jì)題解與上機(jī)指導(dǎo)M. 清華大學(xué):清華大學(xué)出版社, 2014. 1-2459 白中英, 戴志濤. 計(jì)算機(jī)組成原理M. 北京東黃城根北街16號:科學(xué)出版社, 2013. 1-350全部代碼如下:VS2015調(diào)試通過(未加入錯(cuò)誤檢測)使用C11新標(biāo)準(zhǔn)/* 數(shù)據(jù)結(jié)構(gòu)期末課程設(shè)計(jì) * 作業(yè)名稱:多項(xiàng)式計(jì)算器 * 使用的數(shù)據(jù)結(jié)構(gòu):棧 * UI:使用easyx實(shí)現(xiàn) */#include<stdlib.h> #include<stdio.h> #include<math.h> #include<string.h> #inc

31、lude <graphics.h> / 就是需要引用這個(gè)圖形庫#include <conio.h>#define WINSIZEX 401/窗口大小#define WINSIZEY 471#define WINKEYY (WINSIZEY - 1) / 8/行間距#define WINKEYX (WINSIZEX - 1) / 4#define MAX 100#define TRUE 1#pragma warning(disable:4996) typedef struct char StrMAX;/*存儲原算術(shù)表達(dá)式*/int Long;STR;struct int

32、x2;/對象的左上坐標(biāo)x和右下坐標(biāo)x,x0表示坐上x、x1表示右下xint y2;/同上Pos25;char KeyStr4 = "CE" , "<-" , "M" , "/" , "(" , ")" , "" , "" , "7" , "8" , "9" , "*" , "4" , "5" , "6&

33、quot; , "+" , "1" , "2" , "3" , "-" , "00" , "0" , "." , "=" , "$" ;int LastStrPosT = 1;/LastStrPos表示后綴表達(dá)式存的數(shù)量char GetStrMAX * 5;char TheLastStrMAX;float LastV = 0; /計(jì)算結(jié)果void Trans(STR *InStr, char La

34、stStr);float Compvalue(char LastStrTemp);void Trans(STR *InStr , char LastStr)/*將算術(shù)表達(dá)式轉(zhuǎn)化為后綴表達(dá)式*/int i = 1;char StackMAX;/*作為棧使用*/char ChStr = InStr->Stri;/用于保存數(shù)組里的臨時(shí)元素i+;int LastStrPos = 1, StackTop = 0;/StackTop用于表示棧頂while (ChStr != '#')switch (ChStr)case'(':/*判定為左括號*/StackTop+;

35、StackStackTop = ChStr;break;case')':/*判定為右括號*/while (StackStackTop != '(')LastStrLastStrPos = StackStackTop; StackTop-; LastStrPos+;StackTop-;/扔掉(break;case'+':/*判定為加減號*/case'-':while (StackTop != 0 && StackStackTop != '(')LastStrLastStrPos = StackStac

36、kTop;StackTop-;LastStrPos+;StackTop+;/保留(StackStackTop = ChStr;break;case'*':/*判定為乘除號*/case'/':while (StackStackTop = '*' | StackStackTop = '/')LastStrLastStrPos = StackStackTop;/如果棧頂是*或者/彈出,放到后綴數(shù)組里StackTop-;LastStrPos+;StackTop+;StackStackTop = ChStr;break;case'

37、':break;/忽略空格default:while (ChStr >= '0' && ChStr <= '9' | ChStr = '.')/*判定為數(shù)字*/LastStrLastStrPos = ChStr; LastStrPos+;ChStr = InStr->Stri;i+;i-;LastStrLastStrPos = ' '/輸出的時(shí)候隔開元素LastStrPos+;ChStr = InStr->Stri; i+;while (StackTop != 0)LastStrLa

38、stStrPos = StackStackTop;LastStrPos+; StackTop-;LastStrLastStrPos = ' 'LastStrPosT = LastStrPos;float Compvalue(char LastStrTemp)/*計(jì)算后綴表達(dá)式的值*/float StackMAX;/*作為棧使用*/char ChStr;/臨時(shí)棧元素int StackTop = 0;/*LastStrPos為LastStr下標(biāo),StackTop為Stack下標(biāo)*/int LastStrPos = 1;ChStr = LastStrTempLastStrPos;La

39、stStrPos+;while (ChStr != ' ')switch (ChStr)case'+':StackStackTop - 1 = StackStackTop - 1 + StackStackTop;StackTop-;break;case'-':StackStackTop - 1 = StackStackTop - 1 - StackStackTop;StackTop-;break;case'*':StackStackTop - 1 = StackStackTop - 1 * StackStackTop;StackT

40、op-;break;case'/':if (StackStackTop != 0)StackStackTop - 1 = StackStackTop - 1 / StackStackTop;elseexit(0);/*異常退出*/StackTop-;break;default:float NumStr = 0;/把數(shù)字字符轉(zhuǎn)化為數(shù)字bool FlNum = 0;while (ChStr >= '0' && ChStr <= '9' | ChStr = '.')if (ChStr = '.'

41、;) FlNum = 1;else if (!FlNum) NumStr = 10 * NumStr + ChStr - '0'/*將數(shù)字字符轉(zhuǎn)化為對應(yīng)的數(shù)值*/else if (FlNum) NumStr += 0.1 * (ChStr - '0');/*計(jì)算小數(shù)*/ChStr = LastStrTempLastStrPos;LastStrPos+;StackTop+;StackStackTop = NumStr;ChStr = LastStrTempLastStrPos;LastStrPos+;return StackStackTop;void GiveSt

42、r(char GetString , char *TheStr) STR InStr;char LastStrMAX;/*存儲后綴表達(dá)式*/InStr.Long = 0;for (int i = 0; GetStringi != '0' i+) InStr.Long+;InStr.StrInStr.Long = GetStringi;InStr.Long+;InStr.StrInStr.Long = '#'Trans(&InStr, LastStr);LastV = Compvalue(LastStr);LastV = (int)LastV ? spri

43、ntf(TheStr , "%.0f" , LastV) : sprintf(TheStr, "%.2f", LastV);void InitPos() Pos0.x0 = 0; Pos0.y0 = 0; Pos0.x1 = WINSIZEX; Pos0.y1 = WINKEYY * 2;int k = 1;for (int i = 2; i < 8; i+) for (int j = 0; j < 4; j+) Posk.x0 = j * WINKEYX;/左上xy坐標(biāo)Posk.y0 = i * WINKEYY;Posk.x1 = (j +

44、 1) * WINKEYX;/右下xy坐標(biāo)Posk.y1 = (i + 1) * WINKEYY;k+;int JudgePos(int x ,int y) if (x > 0 && x < WINSIZEX && y > 0 && y < WINKEYY * 2)/判斷文本輸出框return 0;for (int i = 1; i <= 4; i+) if (x >= Posi.x0 && x <= Posi.x1) for (int j = i; j <= 24; j += 4)

45、 if (y >= Posj.y0 && y <= Posj.y1) return j;void PrintStr() settextstyle(35, 0, _T("Prestige Elite Std");/設(shè)置輸入字體大小,寬度,文字樣式outtextxy(7,7,GetStr);void GetKey() /*FlushMouseMsgBuffer 清空鼠標(biāo)消息緩沖區(qū)。 GetMouseMsg 獲取一個(gè)鼠標(biāo)消息。如果當(dāng)前鼠標(biāo)消息隊(duì)列中沒有,就一直等待。 MouseHit 檢測當(dāng)前是否有鼠標(biāo)消息。 MOUSEMSG 保存鼠標(biāo)消息的結(jié)構(gòu)體。

46、*/MOUSEMSG Msg;RECT r = 0 , WINKEYY * 2 / 3 , WINSIZEX, WINKEYY * 2 ;IMAGE ClearImgUp , ClearImgDown;int ProPos = 0;/上一個(gè)點(diǎn)擊的按鈕int temp = 0;/當(dāng)前點(diǎn)擊的按鈕int InCon = 0;/輸入的字符數(shù)int TempI = 0;float LastStrTemp = LastV;char StrTempMAX;char M_Str20 = '/0' ;FlushMouseMsgBuffer();getimage(&ClearImgUp,

47、1, 1, WINSIZEX , WINKEYY * 2 / 3);/獲得輸入?yún)^(qū)域的截圖,用于覆蓋原先輸入的內(nèi)容getimage(&ClearImgDown, 1, WINKEYY * 2 / 3, WINSIZEX, WINKEYY * 2);/獲得輸出區(qū)域的截圖,用于覆蓋原先輸入的內(nèi)容while (TRUE) Msg = GetMouseMsg();if (Msg.uMsg) temp = JudgePos(Msg.x, Msg.y);switch (Msg.uMsg) case WM_LBUTTONDOWN:setlinecolor(YELLOW);rectangle(Poste

48、mp.x0, Postemp.y0, Postemp.x1, Postemp.y1);switch (temp) case 1:GetStr0 = '0'putimage(1, 1, &ClearImgUp);putimage(1, WINKEYY * 2 / 3, &ClearImgDown);InCon = 0;PrintStr();break;case 2:if(InCon > 0)/判斷是否有輸入的字符GetStrInCon - 1 = '0'putimage(1, 1, &ClearImgUp);InCon-;PrintS

49、tr();break;case 3:strcat_s(GetStr, M_Str);InCon+;PrintStr();break;case 24:settextstyle(50, 0, _T("Prestige Elite Std");/設(shè)置字體大小,寬度,文字樣式putimage(1, WINKEYY * 2 / 3, &ClearImgDown);GiveStr(GetStr, TheLastStr);drawtext(_T(TheLastStr), &r, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);break;case 7:case 8:break;default:strcat_s(GetStr, KeyStrtemp - 1);InCon+;PrintStr();Sleep(50);br

溫馨提示

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

評論

0/150

提交評論