算數(shù)表達式的求解課程設(shè)計報告_第1頁
算數(shù)表達式的求解課程設(shè)計報告_第2頁
算數(shù)表達式的求解課程設(shè)計報告_第3頁
算數(shù)表達式的求解課程設(shè)計報告_第4頁
算數(shù)表達式的求解課程設(shè)計報告_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——算數(shù)表達式的求解課程設(shè)計報告

合肥學(xué)院

計算機科學(xué)與技術(shù)系

課程設(shè)計報告

課學(xué)學(xué)專指

業(yè)導(dǎo)

班教生

程名號級師

數(shù)據(jù)結(jié)構(gòu)與算法算數(shù)表達式的求解

課程設(shè)計名稱

(算數(shù)表達式的求解)給定一個算數(shù)表達式,通過程序求出最終的結(jié)果。

1、從鍵盤輸入要求解的算術(shù)表達式;

2、采用棧結(jié)構(gòu)進行算數(shù)表達式的求解過程;3、能夠判斷算數(shù)表達式的正確與否;4、對于錯誤表達式給出提醒;

5、對于正確表達時給出最終的結(jié)果。1、問題分析和任務(wù)定義

有題目可知,程序要求給定一算數(shù)表達式并計算最終的結(jié)果,我們知道,在高級語言中,任何一個表達式都是有操作數(shù)、運算符和界限符組成。在計算過程中,還要考慮表達式中有無括號以及左右括號之分。由于運算符有優(yōu)先級的高低,因此一個算數(shù)表達是不可能總是按順序執(zhí)行。

通過以上可知,可以用棧來實現(xiàn)運算符的優(yōu)先級完成算術(shù)表達式的求解。

為實現(xiàn)算法的優(yōu)先級,設(shè)置兩個棧:一個稱為操作數(shù)棧opnd,用以寄放操作數(shù)和運算結(jié)果,另一個為操作符棧optr,用以寄放運算符。該算法的基本思想是:

(1)首先置操作數(shù)棧opnd為空棧,表達式終止符“#〞為操作符棧optr的棧底元素。(2)依次讀入表達式中每個字符,若為操作數(shù),則進opnd棧;若是運算符,則與optr棧的棧頂運算符比較優(yōu)先級后做相應(yīng)操作:若當(dāng)前操作符大于optr棧的棧頂,則當(dāng)前操作符入棧;否則,opnd棧的棧頂元素、次棧頂元素出棧,同時optr棧的棧頂元素也出棧,形成運算,并將結(jié)果壓入opnd棧,直至整個表達式求值完畢(即optr棧的棧頂元素和當(dāng)前讀入的字符均為“#〞)。

對于算術(shù)表達式的輸入,本程序采用gets()的方法讀入,將運算符‘+’,‘-’,‘*’,‘/’,‘(’,‘)’,‘#’存儲在數(shù)組中時,定義表達式求解函數(shù),在函數(shù)中判斷讀入的字符,假使是運算符,將這些字符入操作符optr棧,并比較優(yōu)先級,判斷是否運算。若讀入的字符為‘0’到‘9’之間的數(shù)字時,用字符相減轉(zhuǎn)化為整型,然后將轉(zhuǎn)化后的整型再轉(zhuǎn)化為ASCII的形式壓入操作數(shù)棧opnd中。2、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計(1)存儲結(jié)構(gòu)設(shè)計

本程序主要采用順序棧結(jié)構(gòu)類型(Stack)來存儲表達式計算中的數(shù)據(jù)。程序中需要建立兩個棧,一個棧用于寄放運算符,另一個則用于寄放操作數(shù)和計算結(jié)果,故需要建立兩個順序棧結(jié)構(gòu)類型。(2)算數(shù)優(yōu)先級設(shè)計對一任意的表達式,由于表達式中運算符的優(yōu)先級不同,可能會使表達式不按順序進行計算。在本程序中定義函數(shù)Proceed()來比較運算符的優(yōu)先級,而函數(shù)中各優(yōu)先級的比較主要根據(jù)以下優(yōu)先級比較的表格:

表1:運算符優(yōu)先級運算符用數(shù)字表示棧內(nèi)操作符的優(yōu)先級棧外操作符的優(yōu)先級+032-132*254/354(416)561#600在Precede()函數(shù)中定義兩個字符型參數(shù)變量op和c,其中op表示棧頂運算符,c

表示當(dāng)前讀入運算符,對于當(dāng)前運算符是否入棧,進行如下操作:比較當(dāng)前運算符和棧頂運算符的優(yōu)先級的大?。?/p>

1、假使當(dāng)前運算符的優(yōu)先級大于棧頂運算符的優(yōu)先級,即opc;令函數(shù)返回值為'>',此時應(yīng)將棧頂運算符出棧和棧頂、次棧頂操作數(shù)出棧并進行相應(yīng)的運算。

3、假使當(dāng)前元素的優(yōu)先級等于棧頂運算符的優(yōu)先級,即op=c;令函數(shù)的返回值為'=',此時界限符內(nèi)的表達式已計算完畢。(3)程序模塊設(shè)計1)程序模塊

本程序主要包含3個模塊:主程序模塊、計算模塊以及順序棧操作模塊,調(diào)用關(guān)系如下圖:計算模塊順序棧操作模塊主程序模塊

圖1:程序模塊圖2)系統(tǒng)功能模塊

本程序大致包含10個函數(shù),其中包含主函數(shù)。每個函數(shù)都有其相對應(yīng)的功能實現(xiàn)。○1操作符的輸入函數(shù)intIn(charc);

○2運算符比較優(yōu)先級函數(shù)charProceed(charop,charc);○3進行四則運算函數(shù)intOperate(inta,chara1,intb);○4實現(xiàn)表達式的求值函數(shù)intEvalExpres(void);○5初始化棧函數(shù)voidInitStack(Stack*s);○6入棧函數(shù)voidPush(Stack*s,intx);○7出棧函數(shù)intPop(Stack*s);

○8取棧頂元素函數(shù)intGetTop(Stack*s);○9判??蘸瘮?shù)voidEmpty(Stack*s);○10主函數(shù)intmain()

3)函數(shù)之間主要調(diào)用的關(guān)系圖本程序主要包含10個程序,各程序之間的關(guān)系如下圖:(部分函數(shù)用以上的編號表示)

Voidmain()

IntEvalExpres(void)1○2○3○5○6○7○8○9○

圖2:函數(shù)之間調(diào)用關(guān)系圖

3、詳細設(shè)計和編碼

(1)、結(jié)構(gòu)體類型的定義typedefstruct{

intdata[MAXSIZE];inttop;

intbase;//棧底}Stack;

(2)、全局變量定義//以下為函數(shù)聲明

voidInitStack(Stack*);//初始化棧intEmpty(Stack*);//判空棧voidPush(Stack*,int);//進棧intPop(Stack*);//出棧

intGetTop(Stack*);//取棧頂元素

intOperate(int,char,int);//計算結(jié)果charProceed(char,char);//比較優(yōu)先級intIn(char);//判斷輸入符

intEvalExpres(void);//表達式計算函數(shù)//定義兩個棧分別存放運算符和操作數(shù)StackStackR,StackD;

(3)、系統(tǒng)主要子程序的詳細設(shè)計1)、主函數(shù)模塊設(shè)計

intmain()//主函數(shù){

intv;charch;while(1)

{

printf(\歡迎使用算術(shù)表達式的求解的小程序************\\n\

v=EvalExpres();

printf(\表達式的計算結(jié)果為:%d\printf(\do

{

scanf(\if(ch=='n'||ch=='N')exit(0);}while(ch!='\\n');system(\}

return0;}

在主函數(shù)中,設(shè)定用戶操作界面的形式,通過調(diào)用表達式求解的子函數(shù)實現(xiàn)算法所要實現(xiàn)的功能,然后通過while()循環(huán)語句控制,可以實現(xiàn)屢屢調(diào)試。2)、計算函數(shù)模塊

intOperate(inta,chara1,intb){

ints;

intd1=a;

intd2=b;//把字符ab變?yōu)閷?yīng)數(shù)字switch(a1){case'+':s=d1+d2;break;case'-':s=d2-d1;

break;case'*':s=d1*d2;break;case'/':

s=d2/d1;}

return(s+'0');//將運算結(jié)果轉(zhuǎn)化為ascii碼的形式入棧,}

在計算函數(shù)中,定義3個變量,表示基本運算中的變量。采用開關(guān)語句實現(xiàn)表達式的基本運算,將運算結(jié)果轉(zhuǎn)化為ASCII的形式返回。3)、表達式求解的函數(shù)模塊

intEvalExpres(void)//表達式求解函數(shù)

6、用戶使用說明

(1)本程序執(zhí)行的文件為“算數(shù)表達式的求解問題〞。

(2)所求表達式中都只是僅包含加、減、乘、除4種基本運算的,其中也包含括號的應(yīng)用,所有的運算對象均為簡單變量,要求將表達式中的數(shù)字字符轉(zhuǎn)化為整型,且輸入表達式以“#〞終止。

(3)輸入表達式時,以‘#’終止,當(dāng)點擊回車鍵時即可得到運算結(jié)果,當(dāng)想繼續(xù)輸入表達式時,再次點擊回車鍵即可,當(dāng)想終止時,點擊字母‘n’或‘N’。(4)當(dāng)輸入錯誤表達式時,程序會給出相應(yīng)的提醒。7、

case'-':case'*':case'/':case')':

case'#':ch='>';break;case'(':ch='';break;case'(':

printf(\括號匹配錯誤!\\n\exit(

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論