版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 計(jì)算機(jī)科學(xué)系</b></p><p> 《數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì)》報(bào)告</p><p> 課題名稱: 算術(shù)表達(dá)式求值 </p><p><b> 目錄</b></p><p> 1.問(wèn)題描述----------------------------------
2、-------------------------3</p><p> 2.基本要求-----------------------------------------------------------3</p><p> 3.工具/準(zhǔn)備工作----------------------------------------------------3</p><p>
3、; 4.分析與實(shí)現(xiàn)--------------------------------------------------------4</p><p> 5. 課程設(shè)計(jì)體會(huì)與感悟------------------------------------------16</p><p><b> 1.問(wèn)題描述</b></p><p> 從鍵盤(pán)
4、上輸入中綴算術(shù)表達(dá)式,包括括號(hào),計(jì)算出表達(dá)式的值。</p><p><b> 2.基本要求</b></p><p> ?。?)程序能對(duì)所輸入的表達(dá)式做簡(jiǎn)單的判斷,如表達(dá)式有錯(cuò),能給適當(dāng)提示。</p><p> ?。?)能處理單目運(yùn)算符:+,-。</p><p><b> 3.工具/準(zhǔn)備工作</b>
5、;</p><p> 在開(kāi)始項(xiàng)目之前,應(yīng)回顧復(fù)習(xí)相關(guān)內(nèi)容。</p><p> 需要一臺(tái)計(jì)算機(jī)裝有visual C++。</p><p><b> 4.分析與實(shí)現(xiàn)</b></p><p> 對(duì)于中綴表達(dá)式,一般運(yùn)算規(guī)則如下:</p><p> 先乘方,再乘除,最后加減;</p>
6、<p> 同級(jí)運(yùn)算從左算到右;</p><p><b> 先括號(hào)內(nèi)再括號(hào)外;</b></p><p> 用到的頭文件”utility.h”,”lk_stack.h”,”node.h”,”calculator.h”.</p><p> 根據(jù)實(shí)踐經(jīng)驗(yàn),可以對(duì)運(yùn)算符設(shè)置統(tǒng)一的優(yōu)先級(jí),從而方便比較。表中給出了包括加、減、乘、除、求
7、余、左括號(hào)、右括號(hào)和分界符的優(yōu)先級(jí)。</p><p> 上面討論的的+、—為雙目運(yùn)算符,如為單目運(yùn)算符,編程實(shí)現(xiàn)時(shí),可在前面加上0而轉(zhuǎn)化為雙目運(yùn)算符。如在+、—的前一個(gè)字符(如當(dāng)前字符不是運(yùn)算符時(shí),規(guī)定用0表示)為‘=’或‘(’,則為單目運(yùn)算符。</p><p> 具體實(shí)現(xiàn)算法時(shí),可設(shè)置兩個(gè)工作棧,一個(gè)為操作棧,一個(gè)為操作符棧optr,另外一個(gè)為操作數(shù)棧opnd,算法基本思路如下:&l
8、t;/p><p> 將optr棧和opnd棧清空,在optr棧中加入一個(gè)‘=‘。</p><p> 從輸入流獲取一字符ch,循環(huán)執(zhí)行步驟(3)至步驟(5)直到求出表達(dá)式的值為止。</p><p> 取出optr的棧頂optrTop,當(dāng)optrTop=‘=‘且ch=’=‘時(shí),整個(gè)表達(dá)式求值完畢,這時(shí)opnd棧的棧頂元素為表達(dá)式的值。</p><p
9、> 若ch不是操作符,則字符放回輸入流(cin.putback),讀操作數(shù)operand;將operand加入opnd棧,讀入下一個(gè)字符ch。</p><p> 如ch是操作符,按如下方式進(jìn)行處理:</p><p> a.如果ch為單目運(yùn)算符,則在ch前面加上操作數(shù)0,也就是將0入opnd棧;</p><p> b.如果optrTop與ch不匹配,例如
10、optrTop=‘)‘且ch=’(‘,顯示錯(cuò)誤信息;</p><p> c.如果optrTop=‘(‘且ch=’)‘,則從optr退出棧頂?shù)摹ā?,去括?hào),然后從輸入流中讀入字符并送入ch;</p><p> d.如果ch=’(’活optrTop比ch 的優(yōu)先級(jí)低,則ch入optr棧,從輸入中取下一字符ch;</p><p> e.如果optrTop大于或等于
11、ch的優(yōu)先級(jí),則從opnd棧退出left和right,從optr棧退出theta,形成運(yùn)算指令(left)theta (right),結(jié)果如opnd棧。</p><p><b> 對(duì)于界面處理:</b></p><p> ?。?)用文件流建立一個(gè)小小的界面,美化處理一些操作,文件名為dd.txt</p><p> //dd.txt文檔內(nèi)容&
12、lt;/p><p><b> *</b></p><p><b> * *</b></p><p><b> * *</b></p><p> * *</p><p> * *<
13、/p><p> * * * * * * *</p><p> * * </p><p> * 歡迎進(jìn)入運(yùn)算界面 *</p><p> * *</p><p>
14、* * * * * * * * * * * *</p><p> * *</p><p> * *</p><p> * 請(qǐng)選擇:
15、 *</p><p> * *</p><p> * 1.開(kāi)始運(yùn)算 * </p><p> * 2.退出界面
16、 *</p><p> * * </p><p> * *</p><p><b> 對(duì)于運(yùn)算處理:</b></p><p> ?。?)通過(guò)運(yùn)用棧和隊(duì)列的特性,實(shí)
17、現(xiàn)各種功能 。本類通過(guò)一系列的擴(kuò)展實(shí)現(xiàn)各種出現(xiàn)的運(yùn)算情況處理 </p><p> //calculator.h</p><p> # ifndef CALCULATOR_H</p><p> # define CALCULATOR_H</p><p> #include "lk_st
18、ack.h"</p><p> template<class ElemType></p><p> class Calculator</p><p><b> {</b></p><p><b> private:</b></p><p> L
19、inkStack<ElemType> opnd;</p><p> LinkStack<char> optr;</p><p> char GetChar()//從輸入流中跳過(guò)空格,換行符及制表符獲取一字符</p><p><b> {</b></p><p><b> char
20、 c;</b></p><p><b> cin>>c;</b></p><p><b> return c;</b></p><p><b> }</b></p><p> int OperPrior(char op); //要自己寫(xiě)的函數(shù)
21、</p><p> void Get2Operands(ElemType &left,ElemType &right); //要自己寫(xiě)的函數(shù)</p><p> ElemType Operate(ElemType left,char op,ElemType right); //要自己寫(xiě)的函數(shù)</p><p> bool IsOperator(ch
22、ar ch); //要自己寫(xiě)的函數(shù)</p><p><b> public:</b></p><p> Calculator() {};</p><p> virtual ~Calculator() {};</p><p> void Run();</p><p><b> }
23、;</b></p><p> //使用switch語(yǔ)句</p><p> template<class ElemType></p><p> int Calculator<ElemType>::OperPrior(char op)</p><p><b> {</b></
24、p><p> switch(op)</p><p><b> {</b></p><p><b> case '=':</b></p><p><b> return 1;</b></p><p><b> case
25、39;(':</b></p><p><b> return 2;</b></p><p><b> case ')':</b></p><p><b> return 2;</b></p><p><b> case
26、39;+':</b></p><p><b> return 3;</b></p><p><b> case '-':</b></p><p><b> return 3;</b></p><p><b> case
27、39;*':</b></p><p><b> return 4;</b></p><p><b> case '/':</b></p><p><b> return 4;</b></p><p><b> case
28、39;%':</b></p><p><b> return 4;</b></p><p><b> case '^':</b></p><p><b> return 5;</b></p><p><b> }</b
29、></p><p><b> }</b></p><p> //調(diào)用2次出棧函數(shù),一定要先出右數(shù),再出左數(shù)!</p><p> template<class ElemType></p><p> void Calculator<ElemType>::Get2Operands(Elem
30、Type &left,ElemType &right)</p><p><b> {</b></p><p> opnd.Pop(right);</p><p> opnd.Pop(left);</p><p><b> }</b></p><p>
31、 //采用switch語(yǔ)句</p><p> template<class ElemType></p><p> ElemType Calculator<ElemType>::Operate(ElemType left,char op,ElemType right)</p><p><b> {</b></p
32、><p> switch(op)</p><p><b> {</b></p><p><b> case '+':</b></p><p> return left+right;</p><p><b> case '-':&
33、lt;/b></p><p> return left-right;</p><p><b> case '*':</b></p><p> return left*right;</p><p><b> case '/':</b></p>
34、<p> return left/right;</p><p><b> case '%':</b></p><p> return int(left)%int(right); //輸入數(shù)為浮點(diǎn)數(shù),要強(qiáng)制轉(zhuǎn)換為整數(shù)!</p><p><b> case '^':</b>
35、;</p><p> return pow(left,right);</p><p><b> }</b></p><p><b> }</b></p><p> template<class ElemType></p><p> bool Calcul
36、ator<ElemType>::IsOperator(char ch)</p><p><b> {</b></p><p> if(ch=='='||ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='
37、;/'||ch=='%'||ch=='^')</p><p> return true;</p><p><b> else</b></p><p> return false;</p><p><b> }</b></p><p&
38、gt; template<class ElemType></p><p> void Calculator<ElemType>::Run()</p><p><b> {</b></p><p> optr.Clear(); //清空optr棧</p><p> opnd.Clear
39、(); //清空opnd棧</p><p> optr.Push('='); </p><p> char ch; </p><p> char priorChar; //當(dāng)前輸入的前一個(gè)字符,如果不為操作符,則令其值為0</p><p> char optrTop;</p><p
40、> ElemType operand;</p><p><b> char op;</b></p><p> priorChar='=';</p><p> ch=GetChar();</p><p> if(!optr.Top(optrTop)) throw "表達(dá)式有錯(cuò)!&q
41、uot;;</p><p> while (optrTop!='='||ch!='=')</p><p><b> {</b></p><p> if(isdigit(ch)||ch=='.')</p><p><b> {</b></p
42、><p> cin.putback(ch);</p><p> cin>>operand;</p><p> opnd.Push(operand);</p><p> priorChar='0';</p><p> ch=GetChar();</p><p>&
43、lt;b> }</b></p><p> else if(!IsOperator(ch))</p><p><b> {</b></p><p> throw"表達(dá)式有錯(cuò)!";</p><p><b> }</b></p><p&g
44、t;<b> else</b></p><p><b> {</b></p><p> if((priorChar=='='||priorChar=='(')&&(ch=='+'||ch=='-'))</p><p><b>
45、 {</b></p><p> opnd.Push(0);</p><p> priorChar='0';</p><p><b> }</b></p><p> if(optrTop==')'&&ch=='('||optrTop==
46、39;('&&ch=='='||optrTop=='='&&ch==')')</p><p> throw "表達(dá)式有錯(cuò)!";</p><p> else if(optrTop=='('&&ch==')')</p>&
47、lt;p><b> {</b></p><p> if(!optr.Pop(optrTop)) throw "表達(dá)式有錯(cuò)!";</p><p> ch=GetChar();</p><p> priorChar=')';</p><p><b> }</
48、b></p><p> else if(ch=='('||OperPrior(optrTop)<OperPrior(ch))</p><p><b> {</b></p><p> optr.Push(ch);</p><p> priorChar=ch;</p><
49、;p> ch=GetChar();</p><p><b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> if(!optr.Pop(op)) throw "表達(dá)式有錯(cuò)!"
50、;</p><p> ElemType left,right;</p><p> Get2Operands(left,right);</p><p> opnd.Push(Operate(left,op,right));</p><p><b> }</b></p><p><b&g
51、t; }</b></p><p> if(!optr.Top(optrTop)) throw "表達(dá)式有錯(cuò)!";</p><p><b> }</b></p><p> if(!opnd.Top(operand)) throw "表達(dá)式有錯(cuò)!";</p><p&
52、gt; cout<<" ";</p><p> cout<<"運(yùn)算結(jié)果為:";</p><p> cout<<operand<<endl;</p><p><b> }</b></p><p&
53、gt;<b> #endif</b></p><p><b> 主函數(shù)功能:</b></p><p> 應(yīng)用dd.txt建立小小界面;</p><p> 針對(duì)各種出錯(cuò)情況進(jìn)行智能處理;</p><p> 實(shí)現(xiàn)本次計(jì)算基本呢操作</p><p><b>
54、//main主函數(shù)</b></p><p> #include"utility.h"</p><p> #include"calculator.h"</p><p> int main()</p><p><b> {</b></p><p&
55、gt; //第一部分進(jìn)行界面處理,通過(guò)文件流的方式</p><p> char a[100];</p><p> ifstream in("dd.txt");</p><p> for(int i=1;i<19;i++)</p><p><b> {</b></p>&l
56、t;p> in.getline(a,100);</p><p> cout<<a<<endl;</p><p><b> }</b></p><p> in.close();</p><p> char d[100];</p><p> while(tru
57、e)//此方法可處理出現(xiàn)的一般不同錯(cuò)誤</p><p><b> {</b></p><p> cout<<" ";</p><p><b> cin>>d;</b></p><p>
58、 if (d[0]=='1') break;</p><p> else if(d[0]=='2') { cout<<" ";cout<<"已退出界面!"<<endl;exit(0);}</p><p>&
59、lt;b> else </b></p><p><b> {</b></p><p> cout<<" ";</p><p> cout<<"選擇錯(cuò)誤,請(qǐng)重新選擇!"<<endl;
60、</p><p><b> }</b></p><p><b> }</b></p><p> //第二部分進(jìn)行運(yùn)算處理</p><p><b> char c;</b></p><p> cout<<"
61、 ";</p><p> cout<<"請(qǐng)輸入表達(dá)式:"<<endl;</p><p> while(true)//此方法可處理出現(xiàn)的一般不同錯(cuò)誤</p><p><b> {</b></p><p> Calculator<dou
62、ble> myCalculator;</p><p> cout<<" ";</p><p> cout<<"輸入形式如1(沒(méi)有括號(hào)加減乘除):4+5-8+8/2+6*1="<<endl;</p><p> cout<<"
63、; ";</p><p> cout<<"輸入形式如2(加括號(hào)加減乘除):4*(7+1)/2+3-2="<<endl;</p><p> cout<<" ";</p><p> cout<<
64、;"輸入形式如3:+45="<<endl;</p><p> cout<<" ";</p><p> myCalculator.Run();</p><p> while(true)</p><p><b> {</b
65、></p><p> cout<<endl<<endl;</p><p> cout<<" ";</p><p> cout<<"你是否要繼續(xù)(y,n)?";</p><p><b> cin&
66、gt;>c;</b></p><p> if(c=='n')</p><p><b> {</b></p><p> cout<<" ";</p><p> cout<<&
67、quot;運(yùn)算已經(jīng)結(jié)束,已退出程序!"<<endl;</p><p><b> return 0;</b></p><p><b> }</b></p><p> else if(c=='y')</p><p><b> {</b>
68、</p><p> cout<<" ";</p><p> cout<<"請(qǐng)輸入表達(dá)式:"<<endl;</p><p><b> break;</b></p><p><
69、;b> }</b></p><p><b> else </b></p><p><b> {</b></p><p> cout<<" ";</p><p> cout<
70、;<"******你的輸入錯(cuò)誤,請(qǐng)重新輸入:******"<<endl;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }<
71、;/b></p><p><b> 運(yùn)行結(jié)果:</b></p><p> ?。?)一般成功運(yùn)行:有括號(hào)的加減乘除,沒(méi)有括號(hào)的加減乘除,單目運(yùn)算</p><p> (2)跳過(guò)空格,制表符,換行符繼續(xù)運(yùn)行</p><p> ?。?)選擇進(jìn)入界面輸錯(cuò)處理</p><p> (4).輸入選擇是
72、否繼續(xù)出錯(cuò)處理</p><p> 5. 課程設(shè)計(jì)體會(huì)與感悟</p><p> 本次課程設(shè)計(jì)需要涉及到比較多的知識(shí),為了美化界面用了文件流,讓我有加深了對(duì)文件流的認(rèn)識(shí)。算術(shù)的操作用了棧,結(jié)點(diǎn)類,讓我更熟悉了棧后進(jìn)先出以及其他類的的特點(diǎn)。</p><p> 1、該程序不只能運(yùn)算整數(shù),也能處理輸入的負(fù)數(shù) </p><p> 2、可
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告---算術(shù)表達(dá)式求值系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-中綴算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)帶括號(hào)的算術(shù)表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)(表達(dá)式求值)課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值
- 算術(shù)表達(dá)式求值課程設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--表達(dá)式求值
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問(wèn)題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值問(wèn)題
- 算術(shù)表達(dá)式求值演示-課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--表達(dá)式求值—mfc圖形界面
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告(二)表達(dá)式求值(計(jì)算器)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(表達(dá)式計(jì)算)
- (鹽城工學(xué)院數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))棧的應(yīng)用表達(dá)式求值
- vc++課程設(shè)計(jì)《算術(shù)表達(dá)式》
評(píng)論
0/150
提交評(píng)論