版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計</b></p><p> 算符優(yōu)先法對算術(shù)表達(dá)式求值 </p><p><b> 目錄</b></p><p> 一,課程題目 ........................................................
2、........... 1</p><p> 二,程序設(shè)計思想 .......................................................... 1</p><p> 三,程序流程圖 ............................................................. 1</p>
3、<p> 四,程序關(guān)鍵代碼設(shè)計 ................................................... 1</p><p> 五,程序源代碼以及運行結(jié)果 ......................................... 3</p><p> 六,心得體會 ............................
4、......................................... 7</p><p><b> 一,課程題目</b></p><p> ?。ㄋ惴麅?yōu)先法計算算數(shù)表達(dá)式)以字符序列的形式從終端輸入語法正確的、不含變量的整數(shù)表達(dá)式。利用教材表3.1(P53)給出的算符優(yōu)先關(guān)系,實現(xiàn)對于算術(shù)四則混合運算(加、減、乘、除)表達(dá)式的求值。例如:7+(4-2
5、)*3+12/2=19。注:按照四舍五入的方式將四則運算結(jié)果取整。</p><p><b> 二,程序設(shè)計思想</b></p><p> 在程序中分別設(shè)立一個運算符棧(OPTR 棧),用于存儲‘+’,‘-’,‘*’,‘/’,‘#’(‘#’用于判斷算術(shù)表達(dá)式結(jié)束),和一個操作數(shù)棧(OPND 棧),用于存放整數(shù),輸入算式后,先將數(shù)字與運算符分開入i棧,若為數(shù)字則先用轉(zhuǎn)
6、換函數(shù)將char類型的數(shù)轉(zhuǎn)換為int型并進(jìn)入操作數(shù)棧,若為運算符則根據(jù)教材表3.1(P53)給出的算符優(yōu)先級關(guān)系,判斷棧頂運算符和從鍵盤取得的運算符作優(yōu)先級比較,若取得的運算符優(yōu)先級高則進(jìn)棧,直到取得運算符優(yōu)先級低的,則將操作數(shù)取出作operate運算后存入棧頂,反復(fù)操作知道遇到‘#’,則結(jié)束運算,輸出棧頂元素即為結(jié)果。</p><p><b> 三,程序流程圖</b></p>
7、<p> 四,程序關(guān)鍵代碼設(shè)計</p><p> 本次程序設(shè)計共調(diào)用了12個方法分別是:</p><p> InitNumStack,ParseInt,PushNum,PopNum ,InitCalStack,PopCal ,PushCal,In,GetTopCal,GetTopNum,Preced,Operate。</p><p><b&
8、gt; 其中</b></p><p> ParseInt方法</p><p> int ParseInt(char c[]){</p><p> int number[5],i;</p><p> for(i=0;i<5;i++){</p><p> number[i]=(int)(c[i
9、])-48;</p><p><b> }</b></p><p> i=10000*number[0]+1000*number[1]+100*number[2]+10*number[3]+number[4];</p><p><b> return i;</b></p><p><b&
10、gt; }</b></p><p> 為將輸入的數(shù)字字符型轉(zhuǎn)換為整型的轉(zhuǎn)換函數(shù),通過Ascall表的轉(zhuǎn)換關(guān)系,將輸入的字符型數(shù)字轉(zhuǎn)換為整型。在入棧前進(jìn)行此方法,以便整型數(shù)的計算。</p><p> Preced,Operate函數(shù)</p><p> char Preced(char a , char b){</p><p>
11、; char c[7]={'+','-','*','/','(',')','#'};</p><p> char d[7][7]={</p><p> {'>','>','<','<',
12、'<','>','>'},</p><p> {'>','>','<','<','<','>','>'},</p><p> {'>','
13、>','>','>','<','>','>'},</p><p> {'>','>','>','>','<','>','>'},<
14、/p><p> {'<','<','<','<','<','=',' '},</p><p> {'>','>','>','>',' ','
15、;>','>'},</p><p> {'<','<','<','<','<',' ','='},</p><p><b> };</b></p><p> in
16、t Operate (int a,char theta,int b){</p><p><b> int c ;</b></p><p> if (theta=='+'){</p><p><b> c=a+b;</b></p><p><b> return c;
17、</b></p><p><b> }</b></p><p> if (theta=='-'){</p><p><b> c=a-b;</b></p><p><b> return c;</b></p><p>
18、<b> }</b></p><p> if (theta=='*'){</p><p><b> c=a*b;</b></p><p><b> return c;</b></p><p><b> }</b></p>
19、;<p> if (theta=='/'){</p><p><b> c=a/b;</b></p><p><b> return c;</b></p><p><b> }</b></p><p><b> return 0
20、;</b></p><p><b> }</b></p><p> 其中preced是判定運算符棧的棧頂運算符C1與讀入的運算符C2之間優(yōu)先關(guān)系函數(shù);Opearte為進(jìn)行二元運算aCb的函數(shù),如果是編譯表達(dá)式,則產(chǎn)生這個運算的一組相應(yīng)的指令并返回存放結(jié)果的中間變量名;如果是解釋執(zhí)行表達(dá)式,則直接進(jìn)行該運算,并返回運算結(jié)果。</p><
21、;p> 五,程序源代碼以及運行結(jié)果</p><p> #include<stdio.h></p><p> #include<malloc.h></p><p> #include<string.h></p><p> typedef struct{</p><p>
22、 int *base;</p><p><b> int *top;</b></p><p> int Stacksize;</p><p><b> }SqlNum;</b></p><p> void InitNumStack(SqlNum &S){</p>&l
23、t;p> S.base=(int *)malloci(100*sizeof(int));</p><p> S.top=S.base;</p><p> S.Stacksize=100;</p><p><b> }</b></p><p> int ParseInt(char c[]){</p&g
24、t;<p> int number[5],i;</p><p> for(i=0;i<5;i++){</p><p> number[i]=(int)(c[i])-48;</p><p><b> }</b></p><p> i=10000*number[0]+1000*number[1]
25、+100*number[2]+10*number[3]+number[4];</p><p><b> return i;</b></p><p><b> }</b></p><p> void PushNum(SqlNum &S,int c){</p><p><b>
26、 *S.top=c;</b></p><p><b> S.top++;</b></p><p><b> }</b></p><p> int PopNum(SqlNum &S){</p><p><b> int c;</b></p>
27、<p><b> S.top--;</b></p><p><b> c=*S.top;</b></p><p><b> return c;</b></p><p><b> }</b></p><p> typedef stru
28、ct{</p><p> char *base;</p><p> char *top;</p><p> int Stacksize;</p><p><b> }SqlCal;</b></p><p> void InitCalStack(SqlCal &S){</p&
29、gt;<p> S.base=(char *)malloc(100*sizeof(char));</p><p> S.top=S.base;</p><p> S.Stacksize=100;</p><p><b> }</b></p><p> void PushCal(SqlCal &am
30、p;S,char c){</p><p><b> *S.top=c;</b></p><p><b> S.top++;</b></p><p><b> }</b></p><p> char PopCal(SqlCal &S){</p>&l
31、t;p><b> char c;</b></p><p><b> S.top--;</b></p><p><b> c=*S.top;</b></p><p><b> return c;</b></p><p><b> }
32、</b></p><p> int In(char c,char s[]){</p><p><b> int i;</b></p><p> for(i=0;i<strlen(s);i++)</p><p> if(c==s[i])</p><p><b>
33、 return 1;</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> char GetTopCal(SqlCal &s){</p><p><b> char c;</b><
34、/p><p> c=*(s.top-1);</p><p><b> return c;</b></p><p><b> }</b></p><p> int GetTopNum(SqlNum &s){</p><p><b> int c;<
35、/b></p><p> c=*(s.top-1);</p><p><b> return c;</b></p><p><b> }</b></p><p> char Preced(char a , char b){</p><p> char c[7]
36、={'+','-','*','/','(',')','#'};</p><p> char d[7][7]={</p><p> {'>','>','<','<','<
37、9;,'>','>'},</p><p> {'>','>','<','<','<','>','>'},</p><p> {'>','>',
38、39;>','>','<','>','>'},</p><p> {'>','>','>','>','<','>','>'},</p><
39、p> {'<','<','<','<','<','=',' '},</p><p> {'>','>','>','>',' ','>',&
40、#39;>'},</p><p> {'<','<','<','<','<',' ','='},</p><p><b> };</b></p><p> if(a=='+
41、39;){</p><p> if(b=='+'){</p><p> return d[0][0];}</p><p> if(b=='-'){</p><p> return d[0][1];}</p><p> if(b=='*'){</p>
42、<p> return d[0][2];}</p><p> if(b=='/'){</p><p> return d[0][3];}</p><p> if(b=='('){</p><p> return d[0][4];}</p><p> if(b==&
43、#39;)'){</p><p> return d[0][5];}</p><p> if(b=='#'){</p><p> return d[0][6];}</p><p><b> }</b></p><p> if(a=='-'){<
44、;/p><p> if(b=='+'){</p><p> return d[1][0];}</p><p> if(b=='-'){</p><p> return d[1][1];}</p><p> if(b=='*'){</p><p&g
45、t; return d[1][2];}</p><p> if(b=='/'){</p><p> return d[1][3];}</p><p> if(b=='('){</p><p> return d[1][4];}</p><p> if(b==')
46、9;){</p><p> return d[1][5];}</p><p> if(b=='#'){</p><p> return d[1][6];}</p><p><b> }</b></p><p> if(a=='*'){</p>
47、<p> if(b=='+'){</p><p> return d[2][0];}</p><p> if(b=='-'){</p><p> return d[2][1];}</p><p> if(b=='*'){</p><p> retu
48、rn d[2][2];}</p><p> if(b=='/'){</p><p> return d[2][3];}</p><p> if(b=='('){</p><p> return d[2][4];}</p><p> if(b==')'){<
49、/p><p> return d[2][5];}</p><p> if(b=='#'){</p><p> return d[2][6];}</p><p><b> }</b></p><p> if(a=='/'){</p><p&g
50、t; if(b=='+'){</p><p> return d[3][0];}</p><p> if(b=='-'){</p><p> return d[3][1];}</p><p> if(b=='*'){</p><p> return d[3][
51、2];}</p><p> if(b=='/'){</p><p> return d[3][3];}</p><p> if(b=='('){</p><p> return d[3][4];}</p><p> if(b==')'){</p>
52、<p> return d[3][5];}</p><p> if(b=='#'){</p><p> return d[3][6];}</p><p><b> }</b></p><p> if(a=='('){</p><p> if(b
53、=='+'){</p><p> return d[4][0];}</p><p> if(b=='-'){</p><p> return d[4][1];}</p><p> if(b=='*'){</p><p> return d[4][2];}<
54、/p><p> if(b=='/'){</p><p> return d[4][3];}</p><p> if(b=='('){</p><p> return d[4][4];}</p><p> if(b==')'){</p><p>
55、; return d[4][5];}</p><p> if(b=='#'){</p><p> return d[4][6];}</p><p><b> }</b></p><p> if(a==')'){</p><p> if(b=='+
56、'){</p><p> return d[5][0];}</p><p> if(b=='-'){</p><p> return d[5][1];}</p><p> if(b=='*'){</p><p> return d[5][2];}</p>
57、<p> if(b=='/'){</p><p> return d[5][3];}</p><p> if(b=='('){</p><p> return d[5][4];}</p><p> if(b==')'){</p><p> retur
58、n d[5][5];}</p><p> if(b=='#'){</p><p> return d[5][6];}</p><p><b> }</b></p><p> if(a=='#'){</p><p> if(b=='+'){&
59、lt;/p><p> return d[6][0];}</p><p> if(b=='-'){</p><p> return d[6][1];}</p><p> if(b=='*'){</p><p> return d[6][2];}</p><p>
60、; if(b=='/'){</p><p> return d[6][3];}</p><p> if(b=='('){</p><p> return d[6][4];}</p><p> if(b==')'){</p><p> return d[6][5
61、];}</p><p> if(b=='#'){</p><p> return d[6][6];}</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b>
62、;</p><p> int Operate (int a,char theta,int b){</p><p><b> int c ;</b></p><p> if (theta=='+'){</p><p><b> c=a+b;</b></p><
63、;p><b> return c;</b></p><p><b> }</b></p><p> if (theta=='-'){</p><p><b> c=a-b;</b></p><p><b> return c;</
64、b></p><p><b> }</b></p><p> if (theta=='*'){</p><p><b> c=a*b;</b></p><p><b> return c;</b></p><p><b
65、> }</b></p><p> if (theta=='/'){</p><p><b> c=a/b;</b></p><p><b> return c;</b></p><p><b> }</b></p>&l
66、t;p><b> return 0;</b></p><p><b> }</b></p><p> void main(){</p><p> SqlCal OPTR; SqlNum OPND;</p><p> char c,d[5]={'0','0
67、9;,'0','0','0'};</p><p><b> int f=0;</b></p><p> char op[]={'+','-','*','/','(',')','#'};</p>
68、<p> InitCalStack(OPTR);</p><p> InitNumStack(OPND);</p><p> printf("請輸入算式并在尾部添加一個#號\n");</p><p> c=getchar();</p><p> PushCal(OPTR,'#');&l
69、t;/p><p> while(c!='#'||GetTopCal(OPTR)!='#')</p><p><b> {</b></p><p> if (!In(c,op))</p><p><b> {</b></p><p> d[
70、0]=d[1];</p><p> d[1]=d[2];</p><p> d[2]=d[3];</p><p> d[3]=d[4];</p><p><b> d[4]=c;</b></p><p> c=getchar();</p><p><b>
71、; f=1;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> if(f==1){</b></p><p>
72、; PushNum(OPND,ParseInt(d));</p><p> d[0]='0';d[1]='0';d[2]='0';d[3]='0';d[4]='0';</p><p><b> f=0;</b></p><p><b> }<
73、/b></p><p> switch(Preced(GetTopCal(OPTR),c))</p><p><b> {</b></p><p><b> case'<':</b></p><p> PushCal(OPTR,c);</p><
74、;p> c=getchar();</p><p><b> break;</b></p><p><b> case'=':</b></p><p> PopCal(OPTR);</p><p> c=getchar();</p><p>&l
75、t;b> break;</b></p><p><b> case'>':</b></p><p> char theta;int a;int b;</p><p> theta=PopCal(OPTR);</p><p> b=PopNum(OPND);</p&g
76、t;<p> a=PopNum(OPND);</p><p> PushNum(OPND,Operate(a,theta,b));</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b>
77、</p><p><b> }</b></p><p> printf("%d\n",GetTopNum(OPND));</p><p><b> }</b></p><p><b> 程序運行結(jié)果:</b></p><p>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)(表達(dá)式求值)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達(dá)式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達(dá)式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---算術(shù)表達(dá)式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達(dá)式求值—mfc圖形界面
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計帶括號的算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告(二)表達(dá)式求值(計算器)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(表達(dá)式計算)
- 算術(shù)表達(dá)式求值課程設(shè)計
- (鹽城工學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計)棧的應(yīng)用表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)實驗報告(逆波蘭表達(dá)式求值)
- 算術(shù)表達(dá)式求值演示-課程設(shè)計報告
評論
0/150
提交評論