2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩15頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論