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

下載本文檔

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

文檔簡介

1、<p><b>  學年論文(設計)</b></p><p><b>  (本科)</b></p><p>  學 院 </p><p>  專 業(yè) </p><p>  年 級

2、 </p><p>  姓 名 </p><p>  論文(設計)題目 算術表達式求值 </p><p>  指導教師 職稱 </p><p> 

3、 成 績 </p><p>  2012 年 月 日</p><p><b>  目錄</b></p><p>  概述……………………………………………………………………………………………3</p><p>  設計目的…………

4、……………………………………………………………………….3</p><p>  三、設計功能分析…………………………………………………………………………3</p><p>  四、概要設計說明…………………………………………………………………………4</p><p>  五、詳細信息說明…………………………………………………………………………5</p>

5、<p>  六、流程圖………………………………………………………………………………………10</p><p>  七、程序代碼…………………………………………………………………………………10</p><p>  八、調試及運行結論……………………………………………………………………17</p><p>  九、總結…………………………………………………

6、………………………………………19</p><p>  十、參考文獻…………………………………………………………………………………19</p><p><b>  一、概述</b></p><p>  數(shù)據(jù)結構是計算機程序設計的重要理論技術基礎,它不僅是計算機學科的核心課程,而且已成為其它理工專業(yè)熱門選修課。而且它與計算機其他課程都有密切聯(lián)系,

7、具有獨特的承上啟下的重要位置。擁有《數(shù)據(jù)結構》這門課程的知識準備,對于學習計算機專業(yè)的其他課程,如操作系統(tǒng)、數(shù)據(jù)庫管理系統(tǒng)、軟件工程的都是有益的。</p><p><b>  二、設計目的</b></p><p>  1、了解算術表達式的不同表現(xiàn)形式及相應算法實現(xiàn)的不同。</p><p>  2、深入了解棧的特性,并在實際問題背景下靈活運用。&

8、lt;/p><p>  3、掌握字符串解釋為表達式的意義和數(shù)字轉化。</p><p><b>  三、設計功能分析</b></p><p>  算術表達式求值程序實現(xiàn)以下功能:</p><p>  構造一個空棧S,初始條件:棧S已存在</p><p>  用P返回S的棧頂元素</p>&

9、lt;p>  插入元素ch為新的棧頂元素</p><p><b>  刪除S的棧頂元素</b></p><p>  判斷字符是否是運算符,運算符即返回1</p><p>  判斷運算符優(yōu)先權,返回優(yōu)先權高的</p><p><b>  輸入表達式</b></p><p>

10、;  返回表達式的最終結果。</p><p><b>  四:概要設計說明</b></p><p>  在計算機中算術表達式由常量、變量、運算符和括號組成。由于不同的運算符優(yōu)先級不同,而且還要考慮括號;因此算術表達式不可能完全嚴格的從左到右執(zhí)行。因此在設計程序時,要借助棧的功能。</p><p>  算法輸入:一個算術表達式,由常量、變量、運算

11、符、括號組成(以字符串的形式輸入)。操作符為+、-、*、/,用#表示結束。</p><p>  算法輸出:表達式運算結果。</p><p>  算法要點:設置運算符棧和運算數(shù)棧輔助分析算術符優(yōu)先關系。在讀入表達式的字符序列的同時,完成運算符和運算數(shù)的識別處理,以及相應運算。</p><p><b>  基本操作:</b></p>

12、<p>  InitStack(&S)</p><p>  操作結果:構造一個空棧S。</p><p><b>  GetTop(S)</b></p><p>  初始條件:棧S已存在.</p><p>  操作結果:用P返回S的棧頂元素。</p><p>  Push(*S,c

13、h)</p><p>  初始條件:棧S已存在。</p><p>  操作結果:插入元素ch為新的棧頂元素。</p><p><b>  Pop(&S)</b></p><p>  初始條件:棧S已存在。</p><p>  操作結果:刪除S的棧頂元素。</p><p&

14、gt;<b>  In(ch)</b></p><p>  操作結果:判斷字符是否是運算符,運算符即返回1。</p><p>  Precede(c1, c2) </p><p>  初始條件:c1,c2為運算符。</p><p>  操作結果:判斷運算符優(yōu)先權,返回優(yōu)先權高的。</p><p>

15、  Operate(a,op,b)</p><p>  初始條件:a,b為整數(shù),op為運算符。</p><p>  操作結果:a與b進行運算,op為運算符,返回其值。</p><p><b>  num(n)</b></p><p>  操作結果:返回操作數(shù)的長度。</p><p>  EvalE

16、xpr()</p><p>  初始條件:輸入表達式合法。</p><p>  操作結果:返回表達式的最終結果。</p><p>  }ADT Stack</p><p><b>  五、詳細設計說明</b></p><p>  1、數(shù)據(jù)存儲結構設計</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> ?、佟recede(char c1,char c2) 判斷運算符優(yōu)先權,返回優(yōu)先權高的。</p

20、><p>  算符間的優(yōu)先關系如下:</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]為對應的c1,c2優(yōu)先關系*/ </p><p><b>  }</b></p><

31、p> ?、?、利用該算法對算術表達式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)先權底<

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 '>'://退棧并將運算結果入棧 </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型強制轉換成int型,雖然會造成精度缺失,但本身theta是一個符號,也算是整型</p><p>  switch(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)先算法。設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);//構造一個運算符棧</p><p>  InitStack(OPND);//構造一個運算數(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'>': //退棧并將運算結果入棧</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ù)字沒有存滿,輸入字符串結束符</p><p>  d=atof(Data);//此處是把數(shù)組里的數(shù)字,實際上是按字符串;轉換為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("請輸入表達式,以#號結束\n");</p><p>  result=EvaluateExpression();</p><p>  printf("結果為:%f:\n",result);</p><p><b>  }</b></p><p><b>  八、調

80、試及運行結果</b></p><p><b>  1、程序調試</b></p><p>  1)使用Microsoft visual c++ 編輯軟件進行源程序的編寫。</p><p>  2)使用Microsoft visual c++軟件進行編譯,步驟:按F7。 </p><p>  3)使用Micros

81、oft visual c++運行程序并調試,步驟:(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>  九:總結</b

84、></p><p>  通過此次的課程設計,更加清楚了算術表達式求值的過程,同時也更加深刻的理解了棧的相關知識。更加深刻的知道程序設計者要有較強的思維和動手能力和更加了解編程思想和編程技巧,其次,設計界面與函數(shù)功能要劃分好,程序要一定的注釋以便于理解,程序要經得起測試,要做出有價值的程序。所以在以后的學習中要更加注重對自己動手能力的練習。</p><p>  在課程設計的過程中,也有

85、模糊的知識,通過宿舍同學的幫助和討論,也都一點點的解決了。在這里謝謝他們的幫助。同時也要感謝辛勤的數(shù)據(jù)結構老師的悉心教導和耐心講解。謝謝你們!</p><p>  總之:此次的課程設計我有很大的收獲!</p><p><b>  十、參考文獻</b></p><p>  1、《數(shù)據(jù)結構(c語言版)》 嚴蔚敏 吳偉民 清華大學出版社</p&

溫馨提示

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

評論

0/150

提交評論