

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 學(xué)年論文(設(shè)計)</b></p><p><b> ?。ū究疲?lt;/b></p><p> 學(xué) 院 </p><p> 專 業(yè) </p><p> 年 級
2、 </p><p> 姓 名 </p><p> 論文(設(shè)計)題目 算術(shù)表達式求值 </p><p> 指導(dǎo)教師 職稱 </p><p>
3、 成 績 </p><p> 2012 年 月 日</p><p><b> 目錄</b></p><p> 概述……………………………………………………………………………………………3</p><p> 設(shè)計目的…………
4、……………………………………………………………………….3</p><p> 三、設(shè)計功能分析…………………………………………………………………………3</p><p> 四、概要設(shè)計說明…………………………………………………………………………4</p><p> 五、詳細信息說明…………………………………………………………………………5</p>
5、<p> 六、流程圖………………………………………………………………………………………10</p><p> 七、程序代碼…………………………………………………………………………………10</p><p> 八、調(diào)試及運行結(jié)論……………………………………………………………………17</p><p> 九、總結(jié)…………………………………………………
6、………………………………………19</p><p> 十、參考文獻…………………………………………………………………………………19</p><p><b> 一、概述</b></p><p> 數(shù)據(jù)結(jié)構(gòu)是計算機程序設(shè)計的重要理論技術(shù)基礎(chǔ),它不僅是計算機學(xué)科的核心課程,而且已成為其它理工專業(yè)熱門選修課。而且它與計算機其他課程都有密切聯(lián)系,
7、具有獨特的承上啟下的重要位置。擁有《數(shù)據(jù)結(jié)構(gòu)》這門課程的知識準備,對于學(xué)習(xí)計算機專業(yè)的其他課程,如操作系統(tǒng)、數(shù)據(jù)庫管理系統(tǒng)、軟件工程的都是有益的。</p><p><b> 二、設(shè)計目的</b></p><p> 1、了解算術(shù)表達式的不同表現(xiàn)形式及相應(yīng)算法實現(xiàn)的不同。</p><p> 2、深入了解棧的特性,并在實際問題背景下靈活運用。&
8、lt;/p><p> 3、掌握字符串解釋為表達式的意義和數(shù)字轉(zhuǎn)化。</p><p><b> 三、設(shè)計功能分析</b></p><p> 算術(shù)表達式求值程序?qū)崿F(xiàn)以下功能:</p><p> 構(gòu)造一個空棧S,初始條件:棧S已存在</p><p> 用P返回S的棧頂元素</p>&
9、lt;p> 插入元素ch為新的棧頂元素</p><p><b> 刪除S的棧頂元素</b></p><p> 判斷字符是否是運算符,運算符即返回1</p><p> 判斷運算符優(yōu)先權(quán),返回優(yōu)先權(quán)高的</p><p><b> 輸入表達式</b></p><p>
10、; 返回表達式的最終結(jié)果。</p><p><b> 四:概要設(shè)計說明</b></p><p> 在計算機中算術(shù)表達式由常量、變量、運算符和括號組成。由于不同的運算符優(yōu)先級不同,而且還要考慮括號;因此算術(shù)表達式不可能完全嚴格的從左到右執(zhí)行。因此在設(shè)計程序時,要借助棧的功能。</p><p> 算法輸入:一個算術(shù)表達式,由常量、變量、運算
11、符、括號組成(以字符串的形式輸入)。操作符為+、-、*、/,用#表示結(jié)束。</p><p> 算法輸出:表達式運算結(jié)果。</p><p> 算法要點:設(shè)置運算符棧和運算數(shù)棧輔助分析算術(shù)符優(yōu)先關(guān)系。在讀入表達式的字符序列的同時,完成運算符和運算數(shù)的識別處理,以及相應(yīng)運算。</p><p><b> 基本操作:</b></p>
12、<p> InitStack(&S)</p><p> 操作結(jié)果:構(gòu)造一個空棧S。</p><p><b> GetTop(S)</b></p><p> 初始條件:棧S已存在.</p><p> 操作結(jié)果:用P返回S的棧頂元素。</p><p> Push(*S,c
13、h)</p><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:插入元素ch為新的棧頂元素。</p><p><b> Pop(&S)</b></p><p> 初始條件:棧S已存在。</p><p> 操作結(jié)果:刪除S的棧頂元素。</p><p&
14、gt;<b> In(ch)</b></p><p> 操作結(jié)果:判斷字符是否是運算符,運算符即返回1。</p><p> Precede(c1, c2) </p><p> 初始條件:c1,c2為運算符。</p><p> 操作結(jié)果:判斷運算符優(yōu)先權(quán),返回優(yōu)先權(quán)高的。</p><p>
15、 Operate(a,op,b)</p><p> 初始條件:a,b為整數(shù),op為運算符。</p><p> 操作結(jié)果:a與b進行運算,op為運算符,返回其值。</p><p><b> num(n)</b></p><p> 操作結(jié)果:返回操作數(shù)的長度。</p><p> EvalE
16、xpr()</p><p> 初始條件:輸入表達式合法。</p><p> 操作結(jié)果:返回表達式的最終結(jié)果。</p><p> }ADT Stack</p><p><b> 五、詳細設(shè)計說明</b></p><p> 1、數(shù)據(jù)存儲結(jié)構(gòu)設(shè)計</p><p> 因
17、為表達式是由操作符,運算符和界限符組成的。如果只用一個char類型棧,不能滿足2位以上的整數(shù),所以還要定義一個int類型的棧用來寄存操作數(shù)。</p><p> /* 定義字符類型棧 */</p><p> typedef struct{</p><p> int stacksize;</p><p> char *base;</
18、p><p> char *top;</p><p><b> }Stack1</b></p><p><b> /*定義整形棧*/</b></p><p> typedef struct{</p><p> int stacksize;</p><p
19、> int *base;</p><p> int *top;</p><p><b> }Stack2</b></p><p><b> 2、主要算法</b></p><p> ?、?、Precede(char c1,char c2) 判斷運算符優(yōu)先權(quán),返回優(yōu)先權(quán)高的。</p
20、><p> 算符間的優(yōu)先關(guān)系如下:</p><p><b> 表一</b></p><p><b> 算法偽代碼如下:</b></p><p> char Precede(char c1,char c2) </p><p><b> { </b>&
21、lt;/p><p> static char array[49]={</p><p> '>', '>', '<', '<', '<', '>', '>', </p><p> '>', &
22、#39;>', '<', '<', '<', '>', '>', </p><p> '>', '>', '>', '>', '<', '>', '&
23、gt;', </p><p> '>', '>', '>', '>', '<', '>', '>', </p><p> '<', '<', '<', '
24、;<', '<', '=', '!', </p><p> '>', '>', '>', '>', '!', '>', '>', </p><p> '<
25、39;, '<', '<', '<', '<', '!', '='}; //用一維數(shù)組存儲49種情況</p><p> switch(c1) </p><p><b> { </b></p><p> /* i為下面ar
26、ray的橫標 */ </p><p> case '+' : i=0;break; </p><p> case '-' : i=1;break; </p><p> case '*' : i=2;break; </p><p> case '/' : i=3;break
27、; </p><p> case '(' : i=4;break; </p><p> case ')' : i=5;break; </p><p> case '#' : i=6;break; </p><p><b> } </b></p><
28、;p> switch(c2) </p><p><b> { </b></p><p> /* j為下面array的縱標 */ </p><p> case '+' : j=0;break; </p><p> case '-' : j=1;break; </p>
29、;<p> case '*' : j=2;break; </p><p> case '/' : j=3;break; </p><p> case '(' : j=4;break; </p><p> case ')' : j=5;break; </p><p
30、> case '#' : j=6;break; </p><p><b> }</b></p><p> return (array[7*i+j]); /* 返回運算符array[7*i+j]為對應(yīng)的c1,c2優(yōu)先關(guān)系*/ </p><p><b> }</b></p><
31、p> ?、?、利用該算法對算術(shù)表達式3*(7-2)求值操作過程如下:</p><p><b> 表二</b></p><p><b> 算法偽代碼如下:</b></p><p> int EvalExpr()//主要操作函數(shù) </p><p> { c = *ptr++; </p&
32、gt;<p> while(c!='#'||GetTop(OPTR)!='#') </p><p><b> {</b></p><p> if(!In(c)) //不是運算符即進棧</p><p> { if(!In(*(ptr-1))) ptr=ptr-1;</p>&l
33、t;p> m=atoi(ptr);//取字符串前面的數(shù)字段</p><p> n=num(m); </p><p> Push2(&OPND,m); </p><p> ptr=ptr+n;</p><p><b> c=*ptr++;</b></p><p><b&
34、gt; } </b></p><p><b> else </b></p><p> switch(Precede(GetTop(OPTR),c)) </p><p><b> { </b></p><p> case '<': //棧頂元素優(yōu)先權(quán)底<
35、;/p><p> Push(&OPTR,c); </p><p> c = *ptr++; </p><p><b> break; </b></p><p> case '=': //脫括號并接收下一字符</p><p> x=Pop(&OPTR); <
36、;/p><p> c = *ptr++; </p><p><b> break; </b></p><p> case '>'://退棧并將運算結(jié)果入棧 </p><p> theta=Pop(&OPTR); </p><p> b=Pop2(&OPN
37、D); a=Pop2(&OPND); </p><p> Push2(&OPND,Operate(a,theta,b));</p><p><b> break;</b></p><p><b> } </b></p><p><b> }</b><
38、;/p><p><b> 六、流程圖如下:</b></p><p><b> 七、程序代碼</b></p><p> #include <stdio.h></p><p> #include <stdlib.h></p><p> #includ
39、e <process.h></p><p> #define STACK_INIT_SIZE 100 </p><p> #define status int</p><p> #define SElemType float</p><p> #define ERROR 0</p><p> #d
40、efine OK 1</p><p> typedef struct{</p><p> SElemType *base;</p><p> SElemType *top;</p><p> int stacksize;</p><p><b> }SqStack;</b></p&
41、gt;<p> void InitStack(SqStack &S)//初始化順序棧</p><p> { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));</p><p> if(!S.base) exit(1);</p><p> S.top=S.base;
42、</p><p> S.stacksize=STACK_INIT_SIZE;</p><p><b> }</b></p><p> status GetTop(SqStack S, SElemType &e)//取棧頂元素的值</p><p> { if(S.base==S.top) return E
43、RROR;</p><p><b> else </b></p><p> e=*(S.top-1);</p><p> return OK;</p><p><b> }</b></p><p> status Push(SqStack &S, SElem
44、Type e)//入棧操作</p><p> { if(S.top-S.base==S.stacksize)</p><p> { S.base=(SElemType *)realloc(S.base,(S.stacksize+10)*sizeof(SElemType));</p><p> if(!S.base) return ERROR;</p&g
45、t;<p> S.top=S.base+S.stacksize;}</p><p> else *S.top++=e;</p><p> return OK;</p><p><b> }</b></p><p> status Pop(SqStack &S, SElemType &
46、;e)//出棧操作</p><p> { if(S.base==S.top) return ERROR;</p><p><b> else </b></p><p> e=*(--S.top);</p><p> return OK;</p><p><b> }</
47、b></p><p> status Empty(SqStack S)//判斷棧是否為空的操作</p><p> { if(S.base==S.top) return true;</p><p> else return false;</p><p><b> }</b></p><p&
48、gt; //此前全部為順序棧的基本操作</p><p> char Precede(char c1 ,char c2)//判定運算符的優(yōu)先級</p><p><b> { </b></p><p><b> char r;</b></p><p> switch(c2)<
49、/p><p><b> {</b></p><p> case'+': </p><p><b> case'-':</b></p><p> if(c1=='('||c1=='#') r='<
50、9;;</p><p> else r='>';</p><p><b> break;</b></p><p> case'*': </p><p><b> case'/':</b></p><p
51、> if(c1=='*'||c1=='/'||c1==')') r='>';</p><p> else r='<';</p><p><b> break;</b></p><p><b> case'(
52、':</b></p><p> if(c1==')') { printf("括號匹配錯誤!\n"); exit(-1);}</p><p> else r='<';</p><p><b> break;</b></p><p&g
53、t;<b> case')':</b></p><p> if(c1=='(') r='=';</p><p> else if(c1=='#') { printf("error!沒有左括號\n"); exit (-1);}</p><p>
54、 else r='>';</p><p><b> break;</b></p><p><b> case'#':</b></p><p> switch(c1)</p><p><b> {</b></p>
55、<p> case'#': r='=';</p><p><b> break;</b></p><p> case'(': {printf("error!沒有右括號!\n"); exit(-1);}</p><p><b&g
56、t; default:</b></p><p><b> r='>';</b></p><p><b> }//switch</b></p><p><b> break;</b></p><p><b> }//switc
57、h</b></p><p><b> return r;</b></p><p> }//Precede</p><p> bool In(char d)//判斷c是否為七種運算符之一</p><p><b> {</b></p><p><b>
58、; switch(d)</b></p><p><b> {</b></p><p><b> case'+':</b></p><p><b> case'-':</b></p><p><b> case
59、9;*':</b></p><p><b> case'/':</b></p><p><b> case'(':</b></p><p><b> case')':</b></p><p><b&
60、gt; case'#':</b></p><p> return true;</p><p><b> default:</b></p><p> return false;</p><p><b> }//switch</b></p><p
61、><b> }</b></p><p> SElemType Operate( SElemType a, SElemType theta, SElemType b )//Operate為進行二元運算的a theta b的函數(shù)</p><p><b> {</b></p><p> char n=char(t
62、heta);//此處把double型強制轉(zhuǎn)換成int型,雖然會造成精度缺失,但本身theta是一個符號,也算是整型</p><p> switch(n) //轉(zhuǎn)換后相當于和符號匹配ACSII碼</p><p><b> {</b></p><p><b> case'+':</b></p&
63、gt;<p> return a+b;</p><p><b> case'-':</b></p><p> return a-b;</p><p><b> case'*':</b></p><p> return a*b;</p>
64、;<p><b> default:</b></p><p><b> if(b!=0)</b></p><p> return a/b;</p><p><b> else</b></p><p><b> {</b></p
65、><p> printf("error!除數(shù)不能為零\n");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p><b> }//switch</b></p><p>&l
66、t;b> }</b></p><p> SElemType EvaluateExpression()</p><p> { //算符表達式的優(yōu)先算法。設(shè)OPTR和OPND分別為運算符棧和運算數(shù)棧</p><p> SqStack OPTR,OPND;</p><p><b> char c;
67、</b></p><p> char Data[11];//定義此數(shù)組為了存放整數(shù)或小數(shù)</p><p> SElemType a,b,d,e;</p><p> InitStack(OPTR);//構(gòu)造一個運算符棧</p><p> InitStack(OPND);//構(gòu)造一個運算數(shù)棧</p><p&
68、gt; Push(OPTR,'#');//將#壓入棧底</p><p> c=getchar();</p><p> GetTop(OPTR,e);</p><p> while(c!='#'||e!='#')//棧頂不是#號且輸入不是#號</p><p><b> {<
69、;/b></p><p> if(In(c))//是符號則進棧</p><p><b> {</b></p><p> switch(Precede(e,c))</p><p><b> {</b></p><p> case'<':
70、 //棧頂元素優(yōu)先級低</p><p> Push(OPTR,c);</p><p> c=getchar();</p><p><b> break;</b></p><p> case'=': //脫括號并接受下一字符</p><p> Pop(OPTR,e);
71、</p><p> c=getchar();</p><p><b> break;</b></p><p> case'>': //退棧并將運算結(jié)果入棧</p><p> Pop(OPTR,e);</p><p> Pop(OPND,b);</p>
72、;<p> Pop(OPND,a);</p><p> Push(OPND,Operate(a,e,b));</p><p><b> break;</b></p><p><b> }//switch</b></p><p><b> }</b><
73、;/p><p> else if(c>='0'&&c<='9'||c=='.')</p><p><b> {</b></p><p><b> int i=0;</b></p><p> while(c>=
74、9;0'&&c<='9'||c=='.')</p><p><b> {</b></p><p> Data[i]=c;</p><p><b> i++;</b></p><p> c=getchar();</p>
75、<p><b> }</b></p><p> Data[i]='\0';//數(shù)字沒有存滿,輸入字符串結(jié)束符</p><p> d=atof(Data);//此處是把數(shù)組里的數(shù)字,實際上是按字符串;轉(zhuǎn)換為double類型,然后把浮點型數(shù)字入棧</p><p> Push(OPND,d);//atof函數(shù)的形參
76、是指針類型,故用數(shù)組名</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> printf("error!輸入錯誤!\n");</p><p>
77、;<b> exit(-1);</b></p><p><b> }</b></p><p> GetTop(OPTR,e);</p><p><b> }//while</b></p><p> GetTop(OPND,e);</p><p>
78、;<b> return e;</b></p><p> }//EvaluateExpression</p><p> void main()</p><p><b> {</b></p><p> SElemType result;</p><p> prin
79、tf("請輸入表達式,以#號結(jié)束\n");</p><p> result=EvaluateExpression();</p><p> printf("結(jié)果為:%f:\n",result);</p><p><b> }</b></p><p><b> 八、調(diào)
80、試及運行結(jié)果</b></p><p><b> 1、程序調(diào)試</b></p><p> 1)使用Microsoft visual c++ 編輯軟件進行源程序的編寫。</p><p> 2)使用Microsoft visual c++軟件進行編譯,步驟:按F7。 </p><p> 3)使用Micros
81、oft visual c++運行程序并調(diào)試,步驟:(1) 按F7;(2)按Ctrl+F5。</p><p><b> 2、運行及程序界面</b></p><p><b> 1)編輯程序界面</b></p><p><b> 圖一</b></p><p> 2)執(zhí)行程序及
82、運行后界面</p><p><b> 圖二</b></p><p> -------------------Configuration:0-Win32Debug--------------------</p><p> Linking...</p><p> exe - 0 error(s), 0 warning
83、(s)</p><p><b> 圖三</b></p><p><b> 3)運行過程</b></p><p> 1、輸入正確的表達式后</p><p><b> 2、更改表達式</b></p><p><b> 九:總結(jié)</b
84、></p><p> 通過此次的課程設(shè)計,更加清楚了算術(shù)表達式求值的過程,同時也更加深刻的理解了棧的相關(guān)知識。更加深刻的知道程序設(shè)計者要有較強的思維和動手能力和更加了解編程思想和編程技巧,其次,設(shè)計界面與函數(shù)功能要劃分好,程序要一定的注釋以便于理解,程序要經(jīng)得起測試,要做出有價值的程序。所以在以后的學(xué)習(xí)中要更加注重對自己動手能力的練習(xí)。</p><p> 在課程設(shè)計的過程中,也有
85、模糊的知識,通過宿舍同學(xué)的幫助和討論,也都一點點的解決了。在這里謝謝他們的幫助。同時也要感謝辛勤的數(shù)據(jù)結(jié)構(gòu)老師的悉心教導(dǎo)和耐心講解。謝謝你們!</p><p> 總之:此次的課程設(shè)計我有很大的收獲!</p><p><b> 十、參考文獻</b></p><p> 1、《數(shù)據(jù)結(jié)構(gòu)(c語言版)》 嚴蔚敏 吳偉民 清華大學(xué)出版社</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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 算術(shù)表達式求值演示-課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---中綴算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告---算術(shù)表達式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-中綴算術(shù)表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計帶括號的算術(shù)表達式求值
- vc++課程設(shè)計《算術(shù)表達式》
- 算術(shù)表達式的計算課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---表達式求值
- 數(shù)據(jù)結(jié)構(gòu)(表達式求值)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--表達式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值問題
- 表達式求值廣義表的運算課程設(shè)計報告
- c語言_算數(shù)表達式求值_課程設(shè)計報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--表達式求值—mfc圖形界面
評論
0/150
提交評論