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

下載本文檔

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

文檔簡介

1、<p><b>  課程設(shè)計(論文)</b></p><p>  題 目 名 稱 表達式求值問題 </p><p>  課 程 名 稱 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 </p><p>  學(xué) 生 姓 名 XXX <

2、/p><p>  學(xué) 號 xxxxxxxxx </p><p>  系 、專 業(yè) 信息工程系、信息工程類 </p><p>  指 導(dǎo) 教 師 xxxxxx </p><p>  2010年 1 月 3 日<

3、;/p><p><b>  目 錄</b></p><p><b>  1 問題描述2</b></p><p><b>  2 需求分析2</b></p><p><b>  3 概要設(shè)計2</b></p><p>  3.1抽

4、象數(shù)據(jù)類型定義2</p><p><b>  3.2模塊劃分3</b></p><p><b>  4 詳細設(shè)計4</b></p><p>  4.1數(shù)據(jù)類型的定義4</p><p>  4.2主要模塊的算法描述4</p><p><b>  5 測試分析

5、7</b></p><p>  5.1程序運行結(jié)果7</p><p>  5.2程序調(diào)試與體會.........................................................................8</p><p>  6 課程設(shè)計總結(jié)8</p><p><b>  參考

6、文獻8</b></p><p>  附錄(源程序清單)9</p><p><b>  1 問題描述</b></p><p>  編寫一個表達式求值程序,使輸入一個四則運算表達式后,能夠返回正確的結(jié)果。該表達式由數(shù)字0~9、+、-、*、/、括號組成,且表達式必須正確無誤。程序的編寫可用到棧或隊列的基本算法,求出該表達式的值,并分析

7、算法的時間復(fù)雜度和運算的結(jié)果。</p><p><b>  2 需求分析</b></p><p> ?。?)為實現(xiàn)算符優(yōu)先算法,可以使用兩個工作棧。一個稱做OPTR,用以寄存運算符;另一個稱做OPND;用以寄存操作數(shù)或運算結(jié)果。算法的基本思想是:</p><p> ?、偈紫戎貌僮鲾?shù)棧為空棧,表達式起始符“#”為運算符棧的棧底元素; </p

8、><p>  ②依次讀入表達式中每個字符,若是操作數(shù)則OPND棧,若是運算符,則和OPTR棧的棧頂運算符比較優(yōu)先權(quán)后做相應(yīng)操作,直至整個表達式求值完畢(即OPTR棧的棧頂元素和當(dāng)前讀入的字符均為"#")。</p><p>  (2)該程序?qū)崿F(xiàn)表達式的求值問題:</p><p>  從鍵盤讀入一個合法的算術(shù)表達式,利用算符優(yōu)先關(guān)系,實現(xiàn)對算術(shù)四則混合運

9、算的求值,輸出正確的結(jié)果。</p><p><b>  3 概要設(shè)計</b></p><p>  3.1抽象數(shù)據(jù)類型定義</p><p>  設(shè)定棧抽象數(shù)據(jù)類型的定義采用兩個棧的入棧與出棧的操作來進行“運算符和操作數(shù)的配對”。程序中主要用到以下抽象數(shù)據(jù)類型:</p><p>  1)ADT Stack {</p&g

10、t;<p>  數(shù)據(jù)對象:D={ ai | ai ∈ElemSet, i=2,...,n, </p><p><b>  n≥0 }</b></p><p>  數(shù)據(jù)關(guān)系:R1={ <ai-1, ai >| ai-1, ai∈D, i=2,...,n }</p><p>  約定an 端為棧頂,a1 端為棧底。<

11、;/p><p><b>  基本操作:</b></p><p> ?。?)InitStack(&S) </p><p>  操作結(jié)果:構(gòu)造一個空棧S。</p><p> ?。?)GetTop(S, &e) </p><p>  初始條件:棧S已存在且非空。<

12、/p><p>  操作結(jié)果:用e返回S的棧頂元素。</p><p> ?。?)Push(&S, e) </p><p>  初始條件:棧S已存在。</p><p>  操作結(jié)果:插入元素e為新的棧頂元素。</p><p> ?。?)StackEmpty(&s) </p>&

13、lt;p>  初始條件: 棧S已存在。</p><p>  操作結(jié)果:若S為空棧,則返回TRUE, 否則返回FALSE</p><p> ?。?)Pop(&S, &e) </p><p>  初始條件:棧S已存在且非空。</p><p>  操作結(jié)果:刪除S的棧頂元素,并用e返回其值。</p>

14、<p>  } ADT Stack</p><p><b>  3.2模塊劃分</b></p><p>  本程序包括三個模塊:</p><p><b> ?。?)主函數(shù)模塊</b></p><p>  void main()</p><p><b> 

15、 { 輸入表達式;</b></p><p>  根據(jù)要求進行轉(zhuǎn)換并求值;</p><p><b>  輸出結(jié)果;}</b></p><p> ?。?)表達式求值模塊-----實現(xiàn)具體求值</p><p>  (3)表達式轉(zhuǎn)換模塊-----實現(xiàn)轉(zhuǎn)換。</p><p>  三模塊之間簡單

16、調(diào)用關(guān)系:</p><p>  圖3.2 模塊調(diào)用圖</p><p><b>  4 詳細設(shè)計</b></p><p>  4.1數(shù)據(jù)類型的定義</p><p><b> ?。?)棧類型</b></p><p>  #define MAXSIZE 100</p>

17、<p>  typedef int elmtype;</p><p>  struct sqstack</p><p><b>  {</b></p><p>  elmtype stack[MAXSIZE];</p><p><b>  int top;</b></p>

18、<p><b>  };</b></p><p><b> ?。?)運算符號類型</b></p><p>  char ch[7]={'+','-','*','/','(',')','#'};</p><

19、p> ?。?)運算符號優(yōu)先級類型</p><p>  int f1[7]={3,3,5,5,1,6,0};/*棧內(nèi)元素優(yōu)先級*/</p><p>  int f2[7]={2,2,4,4,6,1,0};/*棧外元素優(yōu)先級*/</p><p>  4.2主要模塊的算法描述</p><p>  該程序主要由主函數(shù)模塊、表達式求值模塊、表達式

20、轉(zhuǎn)換模塊三個個部分組成。</p><p> ?。?)主函數(shù)及表達式求值模塊</p><p>  void main()</p><p><b>  {</b></p><p>  int result;</p><p>  result=EvaluateExpression(); /*對Eva

21、luateExpression()進行調(diào)用*/ }</p><p> ?。?)表達式求值模塊</p><p>  主函數(shù)只調(diào)用了EvaluateExpression()函數(shù);而其他的函數(shù)則由EvaluateExpression()調(diào)用了,因此使得主函數(shù)十分簡潔明了。其中求值函數(shù)流程圖如下:</p><p>  圖4.2 表達式求值模塊流程圖</p>

22、<p> ?。?)表達式轉(zhuǎn)換模塊</p><p>  void trans(char *exp,char *postexp)</p><p><b>  {</b></p><p>  在本函數(shù)中先初始化一個OP棧,依次讀入表達式中的每個字符,若是運算符就進OP棧,若運算符則與OP棧進行比較,直至整個表達式轉(zhuǎn)換完畢。</p&g

23、t;<p><b>  }</b></p><p>  float compvalue(char *postexp){ </p><p><b>  struct </b></p><p><b>  { </b></p><p>  float data[Max

24、Size]; </p><p><b>  int top; </b></p><p><b>  } st;</b></p><p><b>  5 測試分析</b></p><p>  5.1程序運行結(jié)果: </p><p>  5.2程序調(diào)試與體會

25、</p><p>  運用棧的基本操作順利的解決表達式求值及轉(zhuǎn)換問題,主要利用棧的先進后出結(jié)構(gòu),執(zhí)行出棧進棧操作并在出棧時進行配對并輸出配對情況,而整個過程不需要不需要移動元素使程序在空間復(fù)雜度上降到最小,采用指針的移動大大加快了程序的執(zhí)行效率。并且對輸入進行了改進,以防止用戶隨意輸入時出現(xiàn)的各種意想不到的錯誤。系統(tǒng)整體上比較完美,無論是輸入、輸出,還是整個系統(tǒng)的界面,都非常美觀、簡潔、大方</p>

26、<p><b>  6 課程設(shè)計總結(jié)</b></p><p>  通過這段時間的課程設(shè)計,本人對計算機的應(yīng)用、數(shù)據(jù)結(jié)構(gòu)的作用以及C語言的使用都有了更深的了解。在理論學(xué)習(xí)和上機實踐的各個環(huán)節(jié)中,通過自主學(xué)習(xí)和請教陳智、成婭輝老師,我收獲了不少。當(dāng)然也遇到不少問題,也正是因為這些問題引發(fā)的思考給我?guī)砹耸斋@。從當(dāng)初不喜歡上機寫程序到現(xiàn)在能主動寫程序,從當(dāng)初拿著程序不知從何下手道現(xiàn)在知

27、道如何分析問題,如何用專業(yè)知識解決實際問題的轉(zhuǎn)變。我發(fā)現(xiàn)無論是專業(yè)知識還是動手能力,自己都有很大程度的提高。</p><p>  在實際上機操作過程中,不僅是讓我們了解數(shù)據(jù)結(jié)構(gòu)的理論知識,更重要的是培養(yǎng)解決實際問題的能力。所以相信通過此次課程設(shè)計實習(xí)可以提高我們分析設(shè)計能力和編程能力,為后續(xù)課程的學(xué)習(xí)及實踐打下良好的基礎(chǔ)。</p><p>  在這次短短的課程實踐里,我得到了陳智老師的關(guān)心

28、和幫助。他給了我們很多的信息,與我們一起探討問題,詢問我們遇到了哪些問題并耐心給予指導(dǎo)。當(dāng)我們遇到技術(shù)上難以解決的問題時,他就會指導(dǎo)我們解決問題,他把自己多年來積累的經(jīng)驗傳授給我們,是我們順利的完成了課程設(shè)計的任務(wù)。再一次感謝給予我指導(dǎo)及幫助的老師和同學(xué)們! </p><p><b>  參考文獻</b></p><p>  [1] 黃同成,黃俊民,董建寅.?dāng)?shù)據(jù)結(jié)構(gòu)[

29、M].北京:中國電力出版社,2008</p><p>  [2] 董建寅,黃俊民,黃同成.?dāng)?shù)據(jù)結(jié)構(gòu)實驗指導(dǎo)與題解[M].北京:中國電力出版社,2008</p><p>  [3] 嚴(yán)蔚敏,吳偉民. 數(shù)據(jù)結(jié)構(gòu)(C語言版)[M]. 北京:清華大學(xué)出版社,2002</p><p>  [4] 劉振鵬,張曉莉,郝杰.?dāng)?shù)據(jù)結(jié)構(gòu)[M].北京:中國鐵道出版社,2003</p

30、><p><b>  附錄(源程序清單)</b></p><p>  #include <conio.h></p><p>  #include <stdio.h></p><p>  #include <ctype.h></p><p>  #define MAX

31、SIZE 100</p><p>  typedef int elmtype;</p><p>  typedef struct sqstack sqstack;</p><p>  char ch[7]={'+','-','*','/','(',')','#&#

32、39;};</p><p>  int f1[7]={3,3,5,5,1,6,0};/*棧內(nèi)元素優(yōu)先級*/</p><p>  int f2[7]={2,2,4,4,6,1,0};/*棧外元素優(yōu)先級*/</p><p><b>  int n=0;</b></p><p>  struct sqstack</p&g

33、t;<p>  {elmtype stack[MAXSIZE];</p><p><b>  int top;</b></p><p><b>  };</b></p><p>  void Initstack(sqstack *s)</p><p>  { s->top=0;&

34、lt;/p><p><b>  }</b></p><p>  int StackEmpty(sqstack S )</p><p>  { if( S.top==0 ) return 1;</p><p>  else return 0;}</p><p>  void Push(sqstac

35、k *s,elmtype x)</p><p>  {if(s->top==MAXSIZE-1)</p><p>  printf("ERROR,Overflow!\n");</p><p><b>  else</b></p><p>  { s->top++;</p>&

36、lt;p>  s->stack[s->top]=x;}</p><p><b>  }</b></p><p>  void Pop(sqstack *s,elmtype *x)</p><p>  {if(s->top==0)</p><p>  printf("ERROR,Under

37、flow!\n");</p><p><b>  else</b></p><p>  {*x=s->stack[s->top];</p><p>  s->top--;}</p><p><b>  }</b></p><p>  elmtype

38、 Gettop(sqstack s)</p><p><b>  {</b></p><p>  if(s.top==0)</p><p>  { printf("ERROR,underflow\n");</p><p>  return 0; }</p><p><b&

39、gt;  else</b></p><p>  return s.stack[s.top];</p><p><b>  }</b></p><p>  elmtype f(char c)</p><p>  { switch(c)</p><p>  {case '+'

40、;: return 0;</p><p>  case '-': return 1;</p><p>  case '*': return 2;</p><p>  case '/': return 3;</p><p>  case '(':

41、return 4;</p><p>  case ')': return 5;</p><p>  default: return 6; } </p><p><b>  }</b></p><p>  char Compare(char c1,char c2)</p>

42、<p>  {int i1=f(c1);</p><p>  int i2=f(c2);</p><p>  if(f1[i1]>f2[i2])</p><p>  return '>';</p><p>  else if(f1[i1]<f2[i2])</p><p> 

43、 return '<';</p><p><b>  else</b></p><p>  return '=';</p><p><b>  }</b></p><p>  int Operate(elmtype a,elmtype t,elmtype b)&

44、lt;/p><p><b>  {int sum;</b></p><p><b>  switch(t)</b></p><p>  {case 0: sum=a+b; break;</p><p>  case 1: sum=a-b; break;</p><p> 

45、 case 2: sum=a*b; break;</p><p>  default: sum=a/b;}</p><p>  return sum;</p><p><b>  }</b></p><p>  float compvalue(char *postexp) </p><p>

46、<b>  { </b></p><p><b>  struct </b></p><p><b>  { </b></p><p>  float data[MaxSize]; </p><p><b>  int top; </b></p>

47、;<p><b>  } st; </b></p><p>  EvaluateExpression()</p><p><b>  {</b></p><p><b>  char c;</b></p><p>  int i=0,sum=0;</p>

48、;<p>  int k=1,j=1;</p><p>  elmtype x,t,a,b;</p><p>  sqstack OPTR,OPND;</p><p>  Initstack(&OPTR);</p><p>  Push(&OPTR,f('#'));</p><

49、p>  Initstack(&OPND);</p><p>  c=getchar();</p><p>  while(c!='#'||ch[Gettop(OPTR)]!='#')</p><p><b>  {</b></p><p>  if(isdigit(c))&l

50、t;/p><p><b>  {</b></p><p><b>  sum=0;</b></p><p>  while(isdigit(c))</p><p><b>  {</b></p><p><b>  if(!j)</b>

51、</p><p>  { sum=sum*10-(c-'0'); }</p><p><b>  else</b></p><p>  sum=sum*10+(c-'0');</p><p>  c=getchar();}</p><p>  Push(&O

52、PND,sum);</p><p><b>  j=1;}</b></p><p><b>  else</b></p><p><b>  if(k)</b></p><p><b>  {</b></p><p>  switc

53、h(Compare(ch[Gettop(OPTR)],c))</p><p>  { case'<': Push(&OPTR,f(c));</p><p>  c=getchar();break;</p><p>  case'=': Pop(&OPTR,&x);</p><p>

54、;  c=getchar(); break;</p><p>  case'>': Pop(&OPTR,&t);</p><p>  Pop(&OPND,&b);</p><p>  Pop(&OPND,&a);</p><p>  Push(&OPND,Opera

55、te(a,t,b));</p><p>  printf("\n");</p><p><b>  break;} </b></p><p>  return(Gettop(OPND));</p><p><b>  }</b></p><p><b

56、>  main()</b></p><p>  { int result;</p><p>  textcolor(GREEN);</p><p>  cprintf("***************WELCOME **************n\r");</p><p>  cprintf(&quo

57、t;*Input arithmetic expression (end with '#')*\n\r");</p><p>  cprintf("*****************************************\n\r");</p><p>  cprintf("*

58、 *\n\r");</p><p>  result=EvaluateExpression();</p><p>  textcolor(RED);</p><p>  cprintf("*THE RESULT IS: %d \n\r",result);</p><

59、;p>  textcolor(GREEN);</p><p>  cprintf("* *\n\r");</p><p>  cprintf("*************Thanks for using************* \n\r");</p>&l

60、t;p>  cprintf("* *\n\r");</p><p>  cprintf("* Instructor : Chen Zhi *\n\r");</p><p>  cprintf("* Designers :

61、Chen Chunlin *\n\r");</p><p>  cprintf("* Number : 0841330197 *\n\r");</p><p>  cprintf("* School : ShaoYang University *\n\r")

溫馨提示

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

最新文檔

評論

0/150

提交評論