數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--算術(shù)表達式求值_第1頁
已閱讀1頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  計算機科學(xué)系</b></p><p>  《數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計》報告</p><p>  課題名稱: 算術(shù)表達式求值 </p><p><b>  目錄</b></p><p>  1.問題描述----------------------------------

2、-------------------------3</p><p>  2.基本要求-----------------------------------------------------------3</p><p>  3.工具/準備工作----------------------------------------------------3</p><p>

3、;  4.分析與實現(xiàn)--------------------------------------------------------4</p><p>  5. 課程設(shè)計體會與感悟------------------------------------------16</p><p><b>  1.問題描述</b></p><p>  從鍵盤

4、上輸入中綴算術(shù)表達式,包括括號,計算出表達式的值。</p><p><b>  2.基本要求</b></p><p> ?。?)程序能對所輸入的表達式做簡單的判斷,如表達式有錯,能給適當提示。</p><p> ?。?)能處理單目運算符:+,-。</p><p><b>  3.工具/準備工作</b>

5、;</p><p>  在開始項目之前,應(yīng)回顧復(fù)習(xí)相關(guān)內(nèi)容。</p><p>  需要一臺計算機裝有visual C++。</p><p><b>  4.分析與實現(xiàn)</b></p><p>  對于中綴表達式,一般運算規(guī)則如下:</p><p>  先乘方,再乘除,最后加減;</p>

6、<p>  同級運算從左算到右;</p><p><b>  先括號內(nèi)再括號外;</b></p><p>  用到的頭文件”utility.h”,”lk_stack.h”,”node.h”,”calculator.h”.</p><p>  根據(jù)實踐經(jīng)驗,可以對運算符設(shè)置統(tǒng)一的優(yōu)先級,從而方便比較。表中給出了包括加、減、乘、除、求

7、余、左括號、右括號和分界符的優(yōu)先級。</p><p>  上面討論的的+、—為雙目運算符,如為單目運算符,編程實現(xiàn)時,可在前面加上0而轉(zhuǎn)化為雙目運算符。如在+、—的前一個字符(如當前字符不是運算符時,規(guī)定用0表示)為‘=’或‘(’,則為單目運算符。</p><p>  具體實現(xiàn)算法時,可設(shè)置兩個工作棧,一個為操作棧,一個為操作符棧optr,另外一個為操作數(shù)棧opnd,算法基本思路如下:&l

8、t;/p><p>  將optr棧和opnd棧清空,在optr棧中加入一個‘=‘。</p><p>  從輸入流獲取一字符ch,循環(huán)執(zhí)行步驟(3)至步驟(5)直到求出表達式的值為止。</p><p>  取出optr的棧頂optrTop,當optrTop=‘=‘且ch=’=‘時,整個表達式求值完畢,這時opnd棧的棧頂元素為表達式的值。</p><p

9、>  若ch不是操作符,則字符放回輸入流(cin.putback),讀操作數(shù)operand;將operand加入opnd棧,讀入下一個字符ch。</p><p>  如ch是操作符,按如下方式進行處理:</p><p>  a.如果ch為單目運算符,則在ch前面加上操作數(shù)0,也就是將0入opnd棧;</p><p>  b.如果optrTop與ch不匹配,例如

10、optrTop=‘)‘且ch=’(‘,顯示錯誤信息;</p><p>  c.如果optrTop=‘(‘且ch=’)‘,則從optr退出棧頂?shù)摹ā?,去括號,然后從輸入流中讀入字符并送入ch;</p><p>  d.如果ch=’(’活optrTop比ch 的優(yōu)先級低,則ch入optr棧,從輸入中取下一字符ch;</p><p>  e.如果optrTop大于或等于

11、ch的優(yōu)先級,則從opnd棧退出left和right,從optr棧退出theta,形成運算指令(left)theta (right),結(jié)果如opnd棧。</p><p><b>  對于界面處理:</b></p><p> ?。?)用文件流建立一個小小的界面,美化處理一些操作,文件名為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>  * 歡迎進入運算界面 *</p><p>  * *</p><p>  

14、* * * * * * * * * * * *</p><p>  * *</p><p>  * *</p><p>  * 請選擇:

15、 *</p><p>  * *</p><p>  * 1.開始運算 * </p><p>  * 2.退出界面

16、 *</p><p>  * * </p><p>  * *</p><p><b>  對于運算處理:</b></p><p>  (1)通過運用棧和隊列的特性,實

17、現(xiàn)各種功能 。本類通過一系列的擴展實現(xiàn)各種出現(xià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()//從輸入流中跳過空格,換行符及制表符獲取一字符</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); //要自己寫的函數(shù)

21、</p><p>  void Get2Operands(ElemType &left,ElemType &right); //要自己寫的函數(shù)</p><p>  ElemType Operate(ElemType left,char op,ElemType right); //要自己寫的函數(shù)</p><p>  bool IsOperator(ch

22、ar ch); //要自己寫的函數(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語句</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語句</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ù)為浮點數(shù),要強制轉(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; //當前輸入的前一個字符,如果不為操作符,則令其值為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 "表達式有錯!&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"表達式有錯!";</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 "表達式有錯!";</p><p>  else if(optrTop=='('&&ch==')')</p>&

47、lt;p><b>  {</b></p><p>  if(!optr.Pop(optrTop)) throw "表達式有錯!";</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 "表達式有錯!"

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 "表達式有錯!";</p><p><b>  }</b></p><p>  if(!opnd.Top(operand)) throw "表達式有錯!";</p><p&

52、gt;  cout<<" ";</p><p>  cout<<"運算結(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>  針對各種出錯情況進行智能處理;</p><p>  實現(xiàn)本次計算基本呢操作</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;  //第一部分進行界面處理,通過文件流的方式</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)的一般不同錯誤</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<<"選擇錯誤,請重新選擇!"<<endl;

60、</p><p><b>  }</b></p><p><b>  }</b></p><p>  //第二部分進行運算處理</p><p><b>  char c;</b></p><p>  cout<<"

61、 ";</p><p>  cout<<"請輸入表達式:"<<endl;</p><p>  while(true)//此方法可處理出現(xiàn)的一般不同錯誤</p><p><b>  {</b></p><p>  Calculator<dou

62、ble> myCalculator;</p><p>  cout<<" ";</p><p>  cout<<"輸入形式如1(沒有括號加減乘除):4+5-8+8/2+6*1="<<endl;</p><p>  cout<<"

63、; ";</p><p>  cout<<"輸入形式如2(加括號加減乘除):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;運算已經(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<<"請輸入表達式:"<<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、;<"******你的輸入錯誤,請重新輸入:******"<<endl;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

71、;/b></p><p><b>  運行結(jié)果:</b></p><p>  (1)一般成功運行:有括號的加減乘除,沒有括號的加減乘除,單目運算</p><p> ?。?)跳過空格,制表符,換行符繼續(xù)運行</p><p> ?。?)選擇進入界面輸錯處理</p><p>  (4).輸入選擇是

72、否繼續(xù)出錯處理</p><p>  5. 課程設(shè)計體會與感悟</p><p>  本次課程設(shè)計需要涉及到比較多的知識,為了美化界面用了文件流,讓我有加深了對文件流的認識。算術(shù)的操作用了棧,結(jié)點類,讓我更熟悉了棧后進先出以及其他類的的特點。</p><p>  1、該程序不只能運算整數(shù),也能處理輸入的負數(shù) </p><p>  2、可

溫馨提示

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

最新文檔

評論

0/150

提交評論