數(shù)據(jù)結(jié)構專業(yè)課程設計方案報告_第1頁
數(shù)據(jù)結(jié)構專業(yè)課程設計方案報告_第2頁
數(shù)據(jù)結(jié)構專業(yè)課程設計方案報告_第3頁
數(shù)據(jù)結(jié)構專業(yè)課程設計方案報告_第4頁
數(shù)據(jù)結(jié)構專業(yè)課程設計方案報告_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

課程設計報告課程設計名稱:數(shù)據(jù)構造系:計算機科學系學生姓名:李錫會班級:13計算機科學與技術1班學號:18成績:指引教師:肖錦輝老師開學時間:-年第2學期

一.設計題目算術表達式求值二.重要內(nèi)容(所選課題需求分析,實現(xiàn)功能等)1、程序能對所輸入表達式作簡樸判斷,如表達式有錯。2、能解決單目運算符:+、-。三.課題設計基本思想,原理和算法描述(涉及課題所用數(shù)據(jù)構造,界面設計、輸入/輸出設計,功能模塊設計,符號闡明等)對于中綴表達式,普通運算規(guī)則如下:1、先乘方,再乘除,最后加減。2、同級運算從左算到右。3、先括號內(nèi),再括號外。操作符號:+-*/^%().依照實際經(jīng)驗,可以對運算符設立統(tǒng)一優(yōu)先級,從而以便比較。上面討論+、-為雙目運算符,如單目運算符,編程實現(xiàn)時,可在前面加上0而轉(zhuǎn)化為雙目運算符。思路如下:1、將optr棧和opnd棧清空,在optr棧中加入一種‘=’。2、從輸入流獲取一字符ch,循環(huán)執(zhí)行環(huán)節(jié)3至環(huán)節(jié)5直到求出表達式值為止。3、取出optr棧頂optrTop,當optrTop=‘=’且ch=‘=’時,整個表達式求值完畢,這時opnd棧棧頂元素為表達式值。4、若ch不是操作符,則將字符放回輸入流(cin.putback),讀操作符operand;將operand加入opnd棧,讀入下一種字符ch。5、若ch是操作符,按如下方式進行解決:a.若ch為單目運算符,則在ch前面加上操作符0,也就是將0入pond。b.若optrTop與ch不匹配,例如optrTop=‘)’且ch=‘(’,顯示錯誤信息。c.若optrTop=‘(’且ch=‘)’,則從optr棧退出棧頂‘(’,去括號,然后從輸入流中讀入字符并送入ch;d.若ch=‘(‘或optrTop比ch優(yōu)化級低,則ch入optr,從輸入流中取下一種字符ch;e.若optrTop不不大于或等于ch優(yōu)先級,則從opnd棧退出left和right,從optr棧退出theta,形成運算符指令(left)theta(right),成果入opnd棧。四.源程序及注釋需要用到頭文獻有:lk_stack.hnode.hutility.hcal.h//cal.h#ifndef__CALCULATOR_H__#define__CALCULATOR_H__#include"lk_stack.h"http://鏈棧類template<classElemType>classCalculator{private: LinkStack<ElemType>opnd; LinkStack<char>optr; //charGetChar(); intOperPrior(charop); voidGet2Operands(ElemType&left,ElemType&right); ElemTypeOperate(ElemTypeleft,charop,ElemTyperight); boolIsOperator(charch);public: Calculator(){}; virtual~Calculator(){}; voidRun();};template<classElemType>intCalculator<ElemType>::OperPrior(charch){if(ch=='=')return1;if(ch=='^')return5;if(ch=='('||ch==')')return2;if(ch=='+'||ch=='-')return3;if(ch=='*'||ch=='/'||ch=='%')return4;return0;}template<classElemType>boolCalculator<ElemType>::IsOperator(charch){if(ch=='='||ch=='('||ch=='*'||ch=='/'||ch=='+'||ch=='-'||ch==')'||ch=='%'||ch=='^')returntrue;elsereturnfalse;};template<classElemType>ElemTypeCalculator<ElemType>::Operate(ElemTypeleft,chartheta,ElemTyperight)//操作成果:執(zhí)行運算leftopright{ElemTyperesult;if(theta=='+')result=left+right;//加法運算elseif(theta=='-')result=left-right;//減法運算elseif(theta=='*')result=left*right;//乘法運算//elseif(theta=='/'&&right==0)throw"除數(shù)為零!";//拋出異常elseif(theta=='/')result=left/right;//除法運算elseif(theta=='^')result=pow(left,right);elseif(theta=='%')result=(int)left%(int)right;returnresult;//返回result}template<classElemType>voidCalculator<ElemType>::Get2Operands(ElemType&left,ElemType&right)//操作成果:從棧opnd中退出兩個操作數(shù){opnd.Pop(right);opnd.Pop(left);}template<classElemType>voidCalculator<ElemType>::Run(){ optr.Clear(); opnd.Clear(); optr.Push('='); charch; charpriorChar; charoptrTop; ElemTypeoperand; charop; priorChar='='; ch=GetChar();optr.Top(optrTop); while(optrTop!='='||ch!='=') { if(isdigit(ch)||ch=='.') { cin.putback(ch); cin>>operand; opnd.Push(operand); priorChar='0'; ch=GetChar(); } elseif(!IsOperator(ch)) { cout<<"表達式錯誤!"<<endl; return; } else { if((priorChar=='='||priorChar=='(')&&(ch=='+'||ch=='-')) { opnd.Push(0); priorChar='0'; }if(optrTop=='('&&ch==')') { optr.Pop(optrTop); ch=GetChar(); priorChar=')'; } elseif(ch=='('||OperPrior(optrTop)<OperPrior(ch)) { optr.Push(ch); priorChar=ch; ch=GetChar(); } else { optr.Pop(op); ElemTypeleft,right; Get2Operands(left,right); opnd.Push(Operate(left,op,right)); } } optr.Top(optrTop); } opnd.Top(operand); cout<<operand<<endl;};#endif//main.cpp#include"utility.h"#include"cal.h"http://計算器類intmain(void){try//用try封裝也許浮現(xiàn)異常代碼{do{cout<<"輸入一種表達式:"<<endl;Calculator<double>cal; cal.Run();//表達式求值cout<<"與否繼續(xù)";}while(UserSaysYes());}catch(Errorerr)//捕獲并解決異常{err.Show();//顯示異常信息}system("PAUSE");//調(diào)用庫函數(shù)system()return0;//返回值,返回操作系統(tǒng)}五、運營示例及成果分析(截圖分析)六、調(diào)試和運營程序過程中產(chǎn)生問題及采用辦法Throw語句出錯,用cout和return代替。七、總結(jié)和展望(400字以上)感謝教師給咱們這次課程設計機會,在本次項目中,雖然我面臨著許多困難,但是,通過不斷地努力與調(diào)試后,終于完畢了該次項目。但是,該項目局限性,加上運營環(huán)境問題,也許會浮現(xiàn)不穩(wěn)定,但總體來說,可以順利實現(xiàn)項目規(guī)定。固然,在完畢該次項目過程中,我意識到自己在基本知識上各種局限性,同步,我也為了完畢項目而不斷努力地復習并驗證知識點。我但愿在后來日子里,可以接受更大挑戰(zhàn),由于那不但可以給自己鍛煉,還可以在那個過程中,學到更多項目經(jīng)驗。說夸張一點,那是算是寶貴財富吧。固然,需要在擁有一定知識基本,才干接受一定難度項目,因此,必要先從基本知識開始,固然需要對基本知識加以鞏固,然后不斷地上機操作,并加以鍛煉。說實話,對初次完畢項目,難度比較大,由于要考慮各種

溫馨提示

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

評論

0/150

提交評論