模擬計算器程序_第1頁
模擬計算器程序_第2頁
模擬計算器程序_第3頁
模擬計算器程序_第4頁
模擬計算器程序_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、安徽新華學院數據結構課程設計報告題目: 模擬計算器程序 學院: 信息工程學院 專業(yè): 信息與計算科學 班級: 12級信息與計算科學一班 姓名: 孫偉偉 學號: 1242155116 指導教師: 李明 設計時間: 2013.12.162013.12.31 課程設計任務書一、 設計任務設計一個模擬計算器的程序二、 設計要求1、 要求對包含加、減、乘、除、括號運算符及SQR和ABS函數的任意整型表達式進行求解2、程序基本功能要求實現(xiàn)完整,并有簡單的驗證。3、設計報告要求格式規(guī)范,符合學校課程設計報告要求。4、報告中流程圖要求描述規(guī)范,算法設計清楚正確。 三、 設計期限2013年12月16日到2013

2、年12月31日前言利用本學期所學的C語言程序設計課程,運用相關知識,查閱相關資料,編寫C語言程序,設計一個簡單計算器,要求編寫的簡單計算器能夠模擬windows系統(tǒng)的計算器,用戶能夠用鍵盤輸入相關數據,要求對包含加、減、乘、除、括號運算符及SQR和ABS函數的任意整型表達式進行求解,并且在程序運行過程中能夠正常的退出程序。這個程序實際上就是對一個表達式進行計算。而一個算術表達式中包含各種運算符,每個運算符的等級可能會不同,這就成了本程序需要解決的一個主要的問題之一了。另外計算器中需要有各種數學函數,比如:abs sqrt sin cos tan等,如何對這些函數進行處理,也是本程序能成功的一個

3、關鍵。還有一個問題就是如何處理操作符和操作數之間的關系也是一個要點。例如:1+2*(3-2/1),經過怎么樣的變換和處理能得出結果。數據的輸入這里應該要用字符,然后通過字符和整形之間的關系進行轉換即可,這樣處理的話,就方便很多了。在計算器程序運行中,輸入數據時如果遇到輸入錯誤的情況,能夠能過鍵盤上的退格鍵進行刪除,并且重新輸入正確的數據。在數據輸入完成后,如果需要放棄本次計算操作,可以利用程序中設置好的按鍵進行清零,并為下一次運算作準備。本課程設計主要解決的是傳統(tǒng)計算器中,不能對表達式進行運算的問題,通過制作該計算器模擬程序,可以做到快速的求解表達式的值,并且能夠判定用戶輸入的表達式是否合法。

4、該模擬計算器的核心部分就在用戶輸入的中綴表達式的轉化,程序中用到了“棧”的后進先出的基本性質。目錄第1章 需求分析 5 1.1 系統(tǒng)設計流程圖 5 1.2 主要功能表 6第2章 總體設計 7 2.1 數據結構的選擇 7 2.2 程序實現(xiàn)流程圖 8第3章 詳細設計和編碼 9 3.1 表達式的判斷 10 3.2 棧的定義及存儲 113.3 表達式的嵌套處理 143.4 中綴表達式轉化為后綴表達式 14第 4章 編碼與調試 17 4.1 系統(tǒng)測試 17 4.2 調試 17 4.3錯誤原因分析 17 4.4 調試結果 19第 5章 總結 21參考文獻 22 附錄 23第1章 需求分析1.1系統(tǒng)流程圖本

5、課程設計主要解決的是傳統(tǒng)計算器中,不能對表達式進行運算的問題,通過制作該計算器模擬程序,可以做到快速的求解表達式的值,并且能夠判定用戶輸入的表達式是否合法。該模擬計算器的核心部分就在用戶輸入的中綴表達式的轉化,程序中用到了“棧”的后進先出的基本性質。利用兩個“棧”,一個“數據?!?,一個“運算符棧”來把中綴表達式轉換成后綴表達式。最后利用后綴表達式來求解表達式的值。該算法的復雜度為O(n),能夠高效、快速地求解表達式的值,提高用戶的效率。本次課程設計為計算器模擬程序,主要解決表達式計算的問題,實現(xiàn)分別按表達式處理的過程分解為幾個子過程,詳細的求解過程如下:1 、用戶輸入表達式。2

6、60;、判定表達式是否合法。3 、把中綴表達式轉化為后綴表達式。4 、求出后綴表達式的結果。5 、輸出表達式的結果。通過設計該程序,從而做到方便的求出一個表達式的值,而不需要一步一步進行運算。輸入第一個操作數加法減法乘法除法清零ABSSQRT顯示結果輸入第二個操作數結束開始 1.1系統(tǒng)設計流程圖1.2主要功能表序號文件名主要功能備注1+加法兩個操作數2-減法兩個操作數3*乘法兩個操作數4/除法兩個操作數5aqrt開方一個操作數6abs絕對值一個操作數7Enter等于8Tab清零90退出除了實現(xiàn)基本的功能外,我還增加了其它一些功能,比如支持輸入數據為浮點數,更重要的

7、是本程序還支持表達式的嵌套運算,例如:A(1+2*S(2)我的實現(xiàn)方法是利用函數的遞歸調用來解決此問題,即把1+2*S(2)看成一個子表達式,這個子表達式中2也看成子表達式。這樣使得程序的適用范圍更加的廣泛,適應性更強,能支持更復雜的表達式的運算。這也是本程序的優(yōu)點之一。第2章 總體設計2.1 數據結構選擇輸入的時候將一個算術表達式用一個字符數組來接收,故需要對這個數組進行處理,讓操作數和操作符分開,這里我想把開始的算術表達式轉換成一個后綴表達式,這樣在進行計算的時候就簡單多了。而在轉換的過程中,對運算符的處理極為重要,這里運用堆棧,用堆棧的先進后出的特點,來處理運算符優(yōu)先級的問題,讓其成功轉

8、換成后綴表達式。而在對后綴表達式進行處理的時候,又需要一個堆棧,這個堆棧存放操作數的。并將運算結果存入該棧中。兩個堆棧的數據結構如下:struct char dataMaxlen; int top; optr; /定義運算符棧struct double dataMaxlen; int top; opnd; /定義操作數棧這里定義了類型,并且一起定義了兩者類型的對象optr,opnd。在將算術表達式轉換成后綴表達式,定義change函數;在對后綴表達式進行處理時,定義jisuan函數,另外本程序有個歡迎界面,由meun函數實現(xiàn)。因此主函數于各函數之間的關系為: meun()main() chan

9、ge() jisuan() 2.2程序實現(xiàn)流程圖 2.2程序設計流程圖這里的兩個主要的函數具體算法在詳細設計中有說明本課程設計需要考慮許多的問題,首先是表達式的合法判斷,然后是字符串表達式提取分離的問題,核心部分就是中綴表達式轉化為后綴表達式。對于第一個問題,我是分步來判斷,首先表達式中是否含有其它非法字符,然后判斷括號是否合法,接著判斷運算法兩邊是否合法比如除法時,除數不能為零。對于第二個問題,我是直接轉換的,從左到右遍歷中綴表達式,把數據全部取出來。對于核心問題,利用了“?!边@種“后進先出”的數據結構,利用兩個“?!保粋€“數據?!?,一個“運算符?!眮戆阎芯Y表達式轉換成后綴表達式。最后利用

10、后綴表達式來求解表達式的值。本程序用戶界面總共分為3個模塊,分別是操作提示,數據輸入,數據輸出。如圖2.3所示。 2.3用戶界面第3章 詳細設計和編碼3.1表達式的判斷表達式的合法判定過程如圖3.1所示首先是其它字符的判定,從左到右遍歷中綴表達式,看是否存在其它非法的。然后是判定括號是否的匹配是否和合法,首先把“(”對應為1,相應的“)”對應為-1。從左到右遍歷表達式,如果遇到括號就加上其對應的值,用sum來保存其累加值。如果在中途出現(xiàn)小于零的情況,即出現(xiàn)“. )”那么的情況,即非法。在遍歷的最后,還要判斷sum的值是否為零,如果為零就是合法,否則就是非法。代碼如下: for(i=0;i<

11、;s.length();i+) /檢驗括號是否合法,以及是否存在非法字符 if(!IsNum(si) && !IsSign(si) && si!='(' && si!=')' && si!='A' && si!='S' && si!='.')return false; if(si='(')sum+=1; else if(si=')')sum-=1; if(sum<0)return f

12、alse; /括號匹配不合法 運算符判斷是否合法,也是遍歷一遍表達式,遇到“/”,看其后面的除數是否為零。這里要考慮表達式中出現(xiàn)負數的情況,因此特殊考慮“-”號,判斷它的前面是“(”還是沒有字符了,那么就是負數。3.2棧的定義、存儲然后定義兩個數組,p400用來存放算術表達式,q400用來存放后綴表達式。由前面的數據結構定義兩個對象,。當輸入一個表達式后,定義i作為q的下標,定義dh=1表示是負號,初始化運算符棧optr.top=-1;讓后對進行掃描,當指向的為數字字符,則將此字符如,后在往中輸入,具體為:while (*p>='0' && *p<=

13、'9') qi=*p;i+; p+; if (*p='.') qi='.' i+; p+; while (*p>='0' && *p<='9') qi=*p;i+; p+; qi='#' i+; dh=0; p后移,繼續(xù)掃描,當遇到或時,執(zhí)行if (dh=1) if (*p='-') optr.top+;optr.dataoptr.top='' p+; break; while (optr.top!=-1 && optr.d

14、ataoptr.top!='(') qi=optr.dataoptr.top; optr.top-; i+; optr.top+;optr.dataoptr.top=*p; p+; dh=0; break;當遇到*或/時,先查看操作符棧中是否有優(yōu)秀級比它大的或者一樣大的運算符,有的話就將其他的出棧,最后自己入棧。執(zhí)行:while (optr.dataoptr.top='*' | optr.dataoptr.top='/'| optr.dataoptr.top='s') qi=optr.dataoptr.top; optr.top-

15、; i+; optr.top+;optr.dataoptr.top=*p; p+; dh=0; break;當遇到(時,此時不需要別的其他的操作,只需將其入操作符棧,并將dh=0;當遇到)時,此時需要將(之前的操作符全部出棧,具體操作如下:while (optr.dataoptr.top!='(') qi=optr.dataoptr.top; optr.top-; i+; optr.top-; p+; dh=0; break;當遇到時,根據運算符的優(yōu)先級,執(zhí)行:while (optr.dataoptr.top='') qi=optr.dataoptr.top;

16、optr.top-;i+; optr.top+;optr.dataoptr.top=*p;p+;dh=0;break;遇到時的操作和差不多,這里就不做介紹了。當遇到數學函數的相關符號時,這里以sin 為例,當掃描時,還需要掃描后面的兩個字符,當它們是in時,說明就是sin函數的符號,此時將此函數的標志入操作符棧,當其為sqrt時,說明是sqrt函數,此時將sqrt函數的標志入棧,這里的標志是自己定的。如果都不是上面兩種情況,說明輸入有誤,跳回。具體的程序如下: if(*(p+1)='i' | *(p+1)='I')&&(*(p+2)='n

17、' | *(p+2)='N') optr.top+;optr.dataoptr.top='s' p+=3; dh=0; break; else if(*(p+1)='q'| *(p+1)='Q')&&(*(p+2)='r' | *(p+2)='R')&&(*(p+3)='t' | *(p+3)='T') optr.top+;optr.dataoptr.top='q' p+=4;dh=0;break; else c

18、out<<endl<<"有錯誤符號"<<endl; return error; 其他的數學函數的操作都是類似的,這里就不一一說明了。這里值得注意的是,當將掃描完時,操作符棧并未一定為空,故需要將操作符棧里的數據全部出棧:while (optr.top!=-1) qi=optr.dataoptr.top; i+; optr.top-; 以上是將算術表達式轉換成后綴表達式。還要對后綴表達式進行計算,才能得到結果。首先還是對表達式進行掃描,遇到數字符時,先將其轉換成整形后,再判斷是否有小數點存在,繼續(xù)掃描直到遇到運算符,讓后通過運算,將次數轉換

19、成小數,最后入棧。具體程序實現(xiàn):d=0; while (*q>='0' && *q<='9') d=10*d+(*q-'0'); q+; x=0.1; if (*q='.') q+; while (*q>='0' && *q<='9') d=d+x*(*q-'0'); x*=0.1; q+; 當遇到操作符時,為雙目運算符時,只需要將操作數棧的棧頂和次棧頂數拿出來進行相應的計算,并將其壓入次棧頂。為單目運算符時,只需將操作數棧頂元

20、素進行運算即可,并將運算符壓入棧即可。這里以/和為例。 其余的均和此類似。if (opnd.dataopnd.top!=0) opnd.dataopnd.top-1=opnd.dataopnd.top-1/opnd.dataopnd.top; else cout<<endl<<"除數不能為零!"<<endl; return error; 和 opnd.top-;break;opnd.dataopnd.top=sin(opnd.dataopnd.top);當q都掃描完時, 返回操作數棧頂元素就是計算的結果。3.3表達式嵌套處理如果遇到A()

21、和S()中含有表達式,而不是單純的數字,例如A(1.1+3.4*S(2.5),那么就需要對其字表達式“1.1+3.4*S(2.5)”進行遞歸處理,這個子表達式中還含有子表達式“2.5”,然后再遞歸處理,依次類推下去。其核心代碼如下if(si='A' | si='S') /遇到Abs()或者Sqrt()遞歸處理子表達式 Expression temp; /創(chuàng)建子表達式 temp.Init(); for(j=0;i+j+2<Posi+1;j+) /復制表達式 stj=si+j+2; stj=0; temp.s=st; /復制表達式 temp.SloveExp(

22、); /得到子表達式的值 numk.first=(si='A'?fabs(temp.Ans):sqrt(temp.Ans); numk.second=0; /標記為數據 if(si-1='-' && (i-1=0 | si-2='(')numk.first=-numk.first; k+,i=Posi+1; 3.4 中綴表達式轉化為后綴表達式中綴表達式轉化為后綴表達式,利用兩個“?!?,一個“數據棧”,一個“運算符棧”來把中綴表達式轉換成后綴表達式。最后利用后綴表達式來求解表達式的值。設一個stack存后綴數據,一個rout棧存運算

23、符。 算法流程如下: (1)從右向左依次取得數據ch。 (2)如果ch是操作數,直接加進stack中。 (3)如果ch是運算符(含左右括號),則: a:如果ch = '(',放入堆棧rou中。 b:如果ch = ')'依次輸出堆棧rout中的運算符,直到遇到'('為止。 c:如果ch不是')'或者'(',那么就和堆棧rout頂點位置的運算符top做優(yōu)先級比較。 1:如果ch優(yōu)先級比rtop高,那么將ch放入堆棧rout。 2:如果ch優(yōu)先級低于或者等于rtop,那么輸出top到stack中(直到!top或者滿足 1

24、),然后將ch放入堆棧rout。 可以看出算法復雜度是O(n)的,因此效率是比較高的,能夠在1s內處理百萬級別長度的表達式。算法的主要思想是利用“棧”的后進先出的特性,以及運算符的優(yōu)先級,這里我們定義運算符的優(yōu)先級;代碼如下:int GetKey(char c) /定義運算符的關鍵字 int key; switch(c) case '+':key=1;break; case '-':key=1;break; case '*':key=2;break; case '/':key=2;break; case '(':k

25、ey=4;break; case ')':key=5;break; return key; 第 4章 編碼與調試程序的調試是指對程序的差錯和排錯,為了便于差錯、閱讀,在設計該程序的過程中我們采用了結構化程序方法編輯,添加了盡可能多的注釋,這就為接下來的調試過程帶來了很多方便。經過仔細檢查之后進行上機調試。進行編譯,如果在編譯和連接過程中發(fā)現(xiàn)錯誤,屏幕上顯示了出錯信息,根據提示找到出錯的位置,加以改正,在進行編譯如此反復,直到順利通過編譯和連接為止。在本次實習過程中碰到的編譯、連接的錯誤主要有:缺少變量定義、定義為置不正確、語法錯誤、轉義字符漏用、邏輯錯誤等。4.1 系統(tǒng)測試 4

26、.1系統(tǒng)測試圖4.2 調試根據電腦所給的提示出現(xiàn)語法錯誤,缺少變量的定義大多的語法錯誤在通過書本參考下能夠修改。主要是平時看書不仔細、不太注意而產生的,如沒有注意具體數據使用是有一定的范圍限定;過分重視分號的重要性而在for、if、while語句中畫蛇添足加分號;在使用文件的時候忘記將文件先打開,對打開的方式與使用的情況不太注意而造成不匹配;還有漏掉形參的定義是值不能傳遞等等。這些語法錯誤有信息框的提示一般是能夠排除的。另外還有部分注釋的位置也錯了,最重要的是邏輯上的錯誤,一般電腦不容易發(fā)現(xiàn)。所以更對程序仔細的檢查。經認真修改之后重新保存文件。4.3 錯誤原因分析4.3.1 缺少變量定義,定義

27、位置不正確由于該程序相對來講稍有些長,前后有些變量不容易聯(lián)系起來,但是在錯誤信息的提示下一般還是很容易找到,不過需要注意的是在定義的時候有些函數使用同樣的變量名而表示不同的作用,因而使用要很小心,定義及定義的位置特別留意。為減少這樣的錯誤我后來還是用不同的變來名來表示,結果引起的那些錯誤解決了。4.3.2 語法錯誤大多的語法錯誤在通過書本參考下能夠修改。主要是平時缺乏鍛煉、不太注意而產生的。如沒有注意具體數據使用是有一定的范圍限定;過分重視分號的重要性而在for、if、while語句中畫蛇添足加分號。4.3.3 注釋的位置程序設計中在注釋的時候不能同我們平常寫字一樣隨心所欲,我們應該注意注釋的

28、格式。注釋中不能含有C語言可執(zhí)行的語句。4.3.4 邏輯錯誤編譯、連接的成功并不意味著程序的最終成功,邏輯上的錯誤機器不易檢查出來,這時需要多數據結果進行分析。這種錯誤的查找是最難的,需要有相當的耐心和細心去把問題找出來,這也是本次程序編輯過程中碰到的最大的難題。往往運行之后得不到令人滿意的結果。此時解決的方法一則用“分段檢查”的方法,在程序的不同位置設幾個printf函數語句,輸出有關變量的值,逐段往下檢查,對檢查出的錯誤進行修改,當調試完畢將設置的printf都刪去,若在程序中找不到問題,則再來考慮算法是否邏輯嚴謹,再進行修改,如此循環(huán)往復,直到最后程序運行成功。在本次程序編輯過程中,我就

29、是這樣處理這個問題的。所以到最后我找到了錯誤,及時改正,終于把程序完成了,一切功能顯示正常。在邏輯上的錯誤,主要就是算法中出現(xiàn)的問題,本程序中的算法有點復雜,在表達式轉換成后綴表達式的過程中就出現(xiàn)了很多的錯誤。這里舉出一個簡單的錯誤,由于本程序在寫的時候,定義了derror=1234567在程序中就不能出現(xiàn)這個計算結果,雖然它超過了本程序的能處理的范圍,可是其結果還是1234567,故返回主函數時,在if (change(p,q)=1) k=jisuan(q); if(k=derror)cout<<"" else cout<<"計算結果為:

30、"<<k<<endl;這里就會出錯。導致圖中的錯誤。解決辦法,這里我對這中情況沒有做特殊的處理。應為在實際的運算過程中,很少有1234567這個結果出現(xiàn),幾乎是不出現(xiàn)的。如何去定義這個數,一直是個問題。本程序的,在定義的時用了兩個數組,故其空間復雜度是n,在算法上,這里我用了一個死循環(huán),當輸入不為0時,會一直運行。所以只討論運行一次的時間復雜度。在轉換的函數中,有個while()循環(huán),這里的復雜度是n,而在這個循環(huán)里,還存在while()循環(huán),故其時間復雜度是n的平方。在計算函數中,其復雜度也是n的平方。故可知本程序的時間復雜度是n平方。4.4調試結果4.4.

31、1普通計算圖4.4.2Abs函數計算圖4.4.3Aqrt函數計算圖4.4.4嵌套計算圖4.4.5輸入錯誤提示圖4.4.6輸入錯誤提示圖4.4.7輸入錯誤提示圖4.4.8結束程序圖經過人工計算,可知以上結果是正確的第5章 總結通過兩周的課程設計,我學會了如何寫一個精簡、快速、健壯的程序。一個好的程序應該是一個所占空間小、運行時間短、其他性能也好的程序。而要做出一個好的程序則應該通過對算法與其數據結構的時間復雜度和空間復雜度進行實現(xiàn)與改進。然而,實際上很難做到十全十美,原因是各要求有時相互抵觸,要節(jié)約算法的執(zhí)行時間往往要以犧牲更多的存儲空間為代價:而為了節(jié)省存儲空間又可能要以更多的時間為代價。因此

32、,只能根據具體情況有所側重:如果程序的使用次數較少,則應該力求算法簡明易懂,而易于轉換為上機程序;如果程序反復多次使用,則應該盡可能選用快速算法;如果解決問題的數據量極大,機器的內存空間較小,則在編寫算法時應該考慮如何節(jié)省空間。 本次課程設計培養(yǎng)了了我們獨立思考的能力,提高了我們的動手操作水平。在具體設計操作中,我們鞏固了本學期所學的數據結構與算法的理論知識,進一步提高了自己的編程能力。這也是課程設計的最終目的所在。通過實際操作,開發(fā)了自己的邏輯思維能力,培養(yǎng)了分析問題、解決問題的能力。 但在程序設計的過程中我也深刻的感受到自己實力的不足,無法靈活的運用各種工具和函數,對于課程所講的東西也無法

33、在脫離課本的情況中完成,我意識到自己在今后的學習生活中,一定要勤于思考,扎實掌握理論知識,靈活運用課上所學的東西,做一個優(yōu)秀的程序員。參考文獻1 謝希仁. 計算機網絡(第五版)M. 北京:電子工業(yè)出版社,2008年2月2 胡小強 計算機網絡M 北京:北京郵電大學出版社2005年1月3 李麗娟 C語言程序設計教程(第2版)M,人民郵電出版社 2009年3月4 王昆侖,李紅. 數據結構與算法. 北京:中國鐵道出版社,2006年5月。5 鄭莉 ,董淵,張瑞豐 c+語言程序設計 北京:清華大學出版社,2004附錄(源程序代碼)#include "iostream"#include

34、"math.h"#include "string"#include "stdlib.h"#include "windows.h"#define derror 1234567#define Maxlen 400using namespace std; struct char dataMaxlen; int top; optr;/定義運算符棧,并定義全局變量struct double dataMaxlen; int top; opnd;/定義操作數棧,并定義全局變量void main() char p400,q400;

35、 double k;void meun(); /聲明菜單函數int change(char *p, char q);/聲明轉換函數double jisuan(char *q);/聲明計算函數meun();for(;) /循環(huán)執(zhí)行 cout <<"請輸入:" cin>>p; if (strcmp(p,"0")=0) return; if (change(p,q)=1) k=jisuan(q); if(k=derror)cout<<"" else cout<<"計算結果為:&quo

36、t;<<k<<endl;system("pause"); /控制輸出格式system("cls"); meun(); void meun()system("color 0a"); cout<<"tt *"<<endl; cout<<" 歡迎使用本計算器"<<endl; cout<<"tt *"<<endl;cout<<endl;cout<<"按0結

37、束本程序"<<endl;int change(char *p, char q) /將算術表達式p轉換成表達式后綴表達式q int i=0; /i作為q的下標 int dh=1; /dh=1表示是負號 optr.top=-1; /初始化運算符棧 while (*p!='0') /p表達式未掃描完時循環(huán) switch(*p) /判斷各種情況,并做相應的處理 case '(': optr.top+;optr.dataoptr.top=*p; dh=1;p+;break; case ')': while (optr.dataoptr

38、.top!='(') qi=optr.dataoptr.top; optr.top-; i+; optr.top-; p+; dh=0; break; case '+': case '-': if (dh=1) / +,-是正負號 if (*p='-') optr.top+;optr.dataoptr.top='' p+; break; while (optr.top!=-1 && optr.dataoptr.top!='(') qi=optr.dataoptr.top; optr.

39、top-; i+; optr.top+;optr.dataoptr.top=*p; p+; dh=0; break; case '*': case '/': while (optr.dataoptr.top='*' | optr.dataoptr.top='/'| optr.dataoptr.top='s') qi=optr.dataoptr.top; optr.top-; i+; optr.top+;optr.dataoptr.top=*p; p+; dh=0; break; case '': w

40、hile (optr.dataoptr.top='') qi=optr.dataoptr.top; optr.top-;i+; optr.top+;optr.dataoptr.top=*p;p+;dh=0;break; case '%': while (optr.dataoptr.top='%') qi=optr.dataoptr.top; optr.top-;i+; optr.top+;optr.dataoptr.top=*p;p+;dh=0;break; case ' ': p+; break; /消除空格 case '

41、;s': case 'S': if(*(p+1)='i' | *(p+1)='I')&&(*(p+2)='n' | *(p+2)='N') optr.top+;optr.dataoptr.top='s' p+=3; dh=0; break; else if(*(p+1)='q'|*(p+1)='Q')&&(*(p+2)='r'| *(p+2)='R')&&(*(p+3)='

42、t' | *(p+3)='T') optr.top+;optr.dataoptr.top='q' p+=4;dh=0; break; else cout<<endl<<"有錯誤符號"<<endl; return derror; case 'c': case 'C': if(*(p+1)='o' | *(p+1)='O')&&(*(p+2)='s' | *(p+2)='S') optr.to

43、p+;optr.dataoptr.top='c' p+=3; dh=0; break; else cout<<endl<<"有錯誤符號"<<endl; return derror; case 'T': case 't':if(*(p+1)='a'| *(p+1)='A')&&(*(p+2)='n' | *(p+2)='N') optr.top+;optr.dataoptr.top='t' p+=3

44、;dh=0; break; else cout<<endl<<"有錯誤符號"<<endl; return derror; case 'e': case 'E':if(*(p+1)='x'| *(p+1)='X')&&(*(p+2)='p' | *(p+2)='P') optr.top+;optr.dataoptr.top='e' p+=3;dh=0; break; else cout<<endl<

45、;<"有錯誤符號"<<endl; return derror; case 'a': case 'A': if(*(p+1)='b'| *(p+1)='B')&&(*(p+2)='s' | *(p+2)='S') optr.top+;optr.dataoptr.top='a' p+=3;dh=0; break; else cout<<endl<<"有錯誤符號"<<endl; r

46、eturn derror; default: while (*p>='0' && *p<='9') /判斷是否為數字 qi=*p;i+; p+; if (*p='.') qi='.' i+; p+; while (*p>='0' && *p<='9') qi=*p;i+; p+; qi='#' i+; dh=0;/用#標識一個數值串結束 while (optr.top!=-1) /此時p掃描完畢,棧不空時循環(huán) qi=optr.d

47、ataoptr.top; i+; optr.top-; qi='0' /給q表達式添加結束標識 return 1;double jisuan(char *q) /計算后綴表達式的值 double d,x; opnd.top=-1; /初始化操作數棧 while (*q!='0') /q字符串未掃描完時循環(huán) switch (*q) /判斷各種情況,并做相應的運算,并入棧 case '+':opnd.dataopnd.top-1=opnd.dataopnd.top-1+opnd.dataopnd.top; opnd.top-;break; case '-':opnd.dataopnd.top-1=opnd.dataopnd.top-1-opnd.dataopnd.top; opnd.top-;break; case '*':opnd.dataopnd.top-1=opnd.dataopnd.top-1*opnd.dataopnd.top; opnd.top-;break; case '/': if (opnd.dataopnd.top!=0) opnd.dataopnd.top-1=opnd.

溫馨提示

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

評論

0/150

提交評論