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

下載本文檔

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

文檔簡介

1、<p>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告</p><p>  題目:利用棧求表達式的值</p><p>  學 院: 信息工程學院</p><p>  專 業(yè):計算機科學與技術(shù)</p><p>  指導老師: ****** </p><p>  姓 名: ********

2、 </p><p>  學 號: ********* </p><p><b>  2011-6-27</b></p><p><b>  目 錄</b></p><p>  1.摘要 ………………………………………………………………………1</p><p&g

3、t;  2.設(shè)計方案…………………………………………………………………01</p><p>  2.1整體設(shè)計方案………………………………………………………01</p><p>  2.1.1創(chuàng)建試題庫模塊設(shè)計方案……………………………………02</p><p>  2.1.2試題測試模塊設(shè)計方案………………………………………03</p><p&

4、gt;  2.1.3查看歷史分數(shù)模塊設(shè)計方案…………………………………06</p><p>  2.1.4隨時退出模塊設(shè)計方案………………………………………07</p><p>  2.1.5主程序設(shè)計方案………………………………………………07</p><p>  3.本程序涉及的結(jié)構(gòu)體………………………………………………………08</p><

5、p>  4.程序演示………………………………………………………………………09</p><p>  5.課程設(shè)計心得………………………………………………………………14</p><p><b>  1.摘 要</b></p><p>  設(shè)計一個用于小學生使用的數(shù)學表達式求值的系統(tǒng)。在系統(tǒng)中,充分利用數(shù)據(jù)結(jié)構(gòu)中棧的知識,并用到了C語言

6、中的文件操作,主要是:如何從試題庫中讀取題目以及將試題寫入試題庫中。完成了試題庫的錄入更新,考試,打分,評價和與歷史分數(shù)的對比評價等功能。在系統(tǒng)中,充分體現(xiàn)了數(shù)據(jù)結(jié)構(gòu)這門學科的特色。</p><p>  其中涉及到的文件主要有:shitiku.txt——用來存放試題;markrec.txt——存放歷史分數(shù);n_rec.txt存放測試次數(shù)。</p><p><b>  2設(shè)計方案

7、</b></p><p>  2.1整體設(shè)計方案 </p><p>  此課題是研究表達式求值的問題,以幫助小學生完成測試。為了達到這個功能,實際我們要做的就是出題,和計算分數(shù)給出評價的工作。整體設(shè)計都是以這個要求為軸心進行的。為了直觀和方便,現(xiàn)畫出軟件整體設(shè)計模塊圖。如下圖:</p><p>  2.1.1創(chuàng)建試題庫模塊設(shè)計方案</p>

8、<p>  首先在主函數(shù)中調(diào)用創(chuàng)建試題庫函數(shù),將試題存入到試題庫文件shitiku.txt中,然后將該調(diào)用從主函數(shù)中刪除。</p><p>  創(chuàng)建試題庫函數(shù):創(chuàng)建指向xuanti類型的指針,利用循環(huán)將輸入的測試題該指針的xuanti單元中,最后將該指針中的測試題寫入試題庫文件shitiku.txt中。</p><p>  在創(chuàng)建試題庫這個模塊中,還包含了兩個文件操作的函數(shù)的調(diào)用

9、,分別是將試題信息寫入shujuku.txt中的函數(shù)void WriteToFile(xuanti *pstu,int num)與講試題信息從shujuku.txt中讀出來的函數(shù)void ReadFromFile(xuanti *pstu,int num)。部分程序如下:</p><p>  void Built_shitiKu() /*建立試題庫文件*/</p><p>&

10、lt;b>  {</b></p><p>  int i,num;</p><p>  xuanti *pstu;</p><p>  printf("請輸入試題數(shù)目:\n"); /*輸入試題數(shù)目*/</p><p>  scanf("%d",&num);&l

11、t;/p><p>  fflush(stdin);</p><p>  pstu=(xuanti *)malloc(num*sizeof(xuanti)); /*動態(tài)分配內(nèi)存*/</p><p>  if(pstu==NULL)</p><p><b>  {</b></p><p>

12、  printf("沒有足夠的內(nèi)存空間!\n"); /*沒有足夠內(nèi)存空間*/</p><p><b>  return;</b></p><p><b>  }</b></p><p>  for(i=0;i<num;i++) /*輸入試題*/</p><p&

13、gt;<b>  {</b></p><p>  printf("第 %d 道題目:",i+1);</p><p>  gets(pstu[i].a);</p><p>  fflush(stdin);</p><p>  printf("\n");</p><

14、p><b>  }</b></p><p>  void WriteToFile(xuanti *pstu,int num) /*將pstu所指向的試題息寫入文件shitiku.txt中*/</p><p><b>  {</b></p><p><b>  FILE *fp;</b&

15、gt;</p><p>  fp=fopen("shitiku.txt","at");</p><p>  if(fp==NULL)</p><p><b>  {</b></p><p>  printf("不能創(chuàng)建試題庫!\n"); /*不能創(chuàng)建試題

16、庫*/</p><p>  free(pstu);</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  fwrite(pstu,sizeof(xuanti),num,fp);</p><p>  fclose(fp

17、);</p><p><b>  }</b></p><p>  void ReadFromFile(xuanti *pstu,int num) /*從試題庫中提取試題*/</p><p><b>  {</b></p><p><b>  FILE *fp;<

18、/b></p><p>  fp=fopen("shitiku.txt","rt");</p><p>  if(fp==NULL)</p><p><b>  {</b></p><p>  printf("不能打開shitiku.txt文件!\n");

19、 /*不能打開shitiku.txt文件*/</p><p>  free(pstu);</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  fread(pstu,sizeof(xuanti),num,fp);</p>

20、<p>  fclose(fp);</p><p><b>  }</b></p><p>  2.1.2試題測試模塊設(shè)計方案</p><p>  試題計算:建立兩個棧,分別存放數(shù)字、運算符,建立一個二維數(shù)組,存放任意兩個運算符之間的優(yōu)先級關(guān)系,通過比較符號棧中后兩個運算符的優(yōu)先級關(guān)系,決定數(shù)字棧中后兩個數(shù)據(jù)是直接入棧還是運算之后

21、入棧,最后在數(shù)字棧中得到最后的運算結(jié)果。</p><p>  通過比較用戶輸入的結(jié)果與程序計算的結(jié)果來決定測試者的分數(shù)mark是否加分,測試完成時,將分數(shù)mark寫入記錄分數(shù)文件markrec.txt中,并將總共的測試次數(shù)記錄如n_rec.txt中?,F(xiàn)將開始測試(int excersice_begin())和試題計算(long result(char *a,SqStack1 *OPND,SqStack2 *OPT

22、R))的函數(shù)附下:</p><p>  開始測試(int excersice_begin())函數(shù):</p><p>  int excersice_begin()</p><p><b>  {</b></p><p>  int i, j, temp,useresult, KEY[20]; </p>&

23、lt;p>  int mark,count=0;</p><p>  int *Mark;</p><p><b>  char g;</b></p><p>  SqStack1 s1,*OPND; /*數(shù)字棧*/</p><p>  SqStack2 s2,*OPTR; /*運算符棧*

24、/</p><p>  xuanti *XT;</p><p><b>  OPND=&s1;</b></p><p><b>  OPTR=&s2;</b></p><p>  Mark=(int *)malloc(20*sizeof(int)); </p>

25、<p>  XT=(xuanti *)malloc(20*sizeof(xuanti));</p><p>  ReadFromFile(XT,20);</p><p><b>  do</b></p><p><b>  {</b></p><p><b>  mark=0

26、;</b></p><p>  srand((unsigned)time(NULL)); </p><p>  KEY[0] = rand()%20; </p><p>  for(i=1;i<20;i++) </p><p><b>  { </b></p><p><b

27、>  while(1) </b></p><p><b>  { </b></p><p>  temp = rand()%20; </p><p>  for(j=0;j<i;j++) </p><p><b>  { </b></p><p>  

28、if(KEY[j]==temp)</p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  if(j==i)</b></p><p><b>  { </b></p><p

29、>  KEY[i]=temp;</p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p>

30、  system("cls"); </p><p>  printf("Random 10 expressions :\n"); </p><p>  for(i=0;i<10;i++)</p><p><b>  {</b></p><p>  printf("T

31、he %dth expression:",i+1);</p><p>  printf("%s\n",XT[KEY[i]].a);</p><p>  printf("Please input your answer:");</p><p>  scanf("%ld",&XT[KEY[i]

32、].result); /*將用戶輸入的值存入xuanti數(shù)據(jù)結(jié)構(gòu)的result中*/</p><p>  fflush(stdin);</p><p>  if(XT[KEY[i]].result==result(XT[KEY[i]].a,OPND,OPTR)) /*將用戶輸入的值與計算得出的值比較是否相等*/</p><p><b

33、>  {</b></p><p><b>  mark+=10;</b></p><p>  printf("Your answer is right!");</p><p>  printf("\n\n");</p><p><b>  }else&l

34、t;/b></p><p><b>  {</b></p><p>  printf("Your answer is wrong!");</p><p>  printf("\n\n");</p><p><b>  }</b></p>&

35、lt;p><b>  }</b></p><p>  printf("****Scores****\n");</p><p>  printf("Your last Score is:%d\n",mark); </p><p>  if(mark>=90)

36、 /*給出此次測試的評價*/</p><p>  printf("Very Good!\n");</p><p>  else if(mark>=60)</p><p>  printf("Good!\n");</p><p>  else printf(&quo

37、t;Need more practice!\n");</p><p>  printf("\n"); </p><p>  RecMark(Mark,count); </p><p>  Mark[count]=mark;</p><p>  count++; </p><

38、p>  printf("Continue the test?('y'-Yes,'n'-No):");</p><p>  g=getchar();</p><p>  fflush(stdin);</p><p>  printf("\n");</p><p>  

39、if(count>=20)</p><p><b>  count=0;</b></p><p>  }while(g=='y');</p><p>  RecMark(Mark,count); </p><p>  return count;</p><

40、p><b>  }</b></p><p>  試題計算(long result(char *a,SqStack1 *OPND,SqStack2 *OPTR))函數(shù):</p><p>  long result(char *a,SqStack1 *OPND,SqStack2 *OPTR) /*求表達式的值*/</p><p&g

41、t;<b>  {</b></p><p>  char theta;</p><p>  int b,d,k=0,i=0,j=0,num2=0;</p><p>  IntInitStack(OPND);</p><p>  CharInitStack(OPTR);</p><p>  Char

42、Push(OPTR,'#');</p><p>  while(a[i]!='=' ) /*表達式結(jié)束時停止運算*/</p><p><b>  {</b></p><p>  if(!IsOptr(a[i])) /*判斷是否為數(shù)字*/</p><p&

43、gt;<b>  {</b></p><p><b>  k++;</b></p><p><b>  if(k<=j)</b></p><p><b>  {</b></p><p>  num2=a[i]-48;</p><p

44、><b>  i++;</b></p><p><b>  }</b></p><p><b>  if(k>j)</b></p><p><b>  {</b></p><p>  num2=num2*10+(a[i]-48);</p&

45、gt;<p><b>  k=j=0;</b></p><p><b>  i++;</b></p><p><b>  }</b></p><p>  if(!IsOptr(a[i]))</p><p><b>  k++;</b><

46、/p><p><b>  if(k==j)</b></p><p>  IntPush(OPND,num2);</p><p>  }else if(IsOptr(a[i])) /*判斷是否為運算符*/</p><p><b>  {</b></p><p>  swit

47、ch(Precede(a[i],CharGetTop(OPTR))) /*比較棧頂運算符top與當前運算符a[i]的優(yōu)先級*/</p><p><b>  {</b></p><p>  case '<':CharPush(OPTR,a[i++]); /*top優(yōu)先級小于a[i]時,將a[i]入棧*/</p>

48、<p>  if(a[i]!='('&&a[i]!=')') </p><p><b>  j++;</b></p><p><b>  break;</b></p><p>  case '=': CharPop(OPTR

49、);i++;break; /*top優(yōu)先級與a[i]相等時,top出棧*/</p><p>  case '>': theta=CharPop(OPTR); /*top優(yōu)先級大于a[i]時,將數(shù)字棧中后兩個數(shù)據(jù)進行top運算,并將運算后結(jié)果入棧*/</p><p>  d=IntPop(OPND);</p><

50、p>  b=IntPop(OPND);</p><p>  IntPush(OPND,Operate(b,theta,d));</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  } </b><

51、;/p><p><b>  }</b></p><p>  if(a[i]=='=') /*將數(shù)字棧中剩下的最后兩個數(shù)據(jù)進行top運算,并將結(jié)果入棧*/</p><p><b>  {</b></p><p>  theta=CharPop(OPTR);<

52、;/p><p>  d=IntPop(OPND);</p><p>  b=IntPop(OPND);</p><p>  IntPush(OPND,Operate(b,theta,d));</p><p><b>  }</b></p><p>  printf("正確答案是:"

53、;); </p><p>  printf("%d\n",IntGetTop(OPND)); /*輸出運算后的表達式的值*/</p><p>  return (IntGetTop(OPND));</p><p><b>  }</b></p><p>  

54、2.1.3查看歷史分數(shù)模塊設(shè)計方案</p><p>  通過查看n_rec.txt中總共的測試次數(shù)n,得到markrec.txt中n個歷史分數(shù),將結(jié)果顯示個用戶。</p><p>  void LookN(int *m,int num) /*查看測試次數(shù)m的值*/</p><p><b>  {</b></p><p&g

55、t;<b>  FILE *mp;</b></p><p>  mp=fopen("n_rec.txt","rt");</p><p>  if(mp==NULL)</p><p><b>  {</b></p><p>  printf("Cann

56、't open n_rec.txt!\n");</p><p><b>  free(m);</b></p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  fread(m,sizeof(int),nu

57、m,mp);</p><p>  fclose(mp);</p><p><b>  }</b></p><p>  void LookMark(int *m,int num) /*查看得分記錄*/</p><p><b>  {</b></p><p><b

58、>  FILE *mp;</b></p><p>  mp=fopen("markrec.txt","rt");</p><p>  if(mp==NULL)</p><p><b>  {</b></p><p>  printf("Cann'

59、t open markrec.txt!\n");</p><p><b>  free(m);</b></p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  fread(m,sizeof(int),num,m

60、p);</p><p>  fclose(mp);</p><p><b>  }</b></p><p>  2.1.4隨時退出模塊設(shè)計方案</p><p>  測試完或?qū)⒉榭礆v史分數(shù)后,按任意鍵將返回到菜單,菜單中輸入0即可退出。(略)</p><p>  2.1.5主程序設(shè)計方案</p

61、><p>  到此為止,所有功能已經(jīng)分別實現(xiàn)了,通過執(zhí)行各個函數(shù),就可以完成相應(yīng)的功能?,F(xiàn)在唯一需要做的就是找個函數(shù)來將他們“集中起來”,用來組合在一起,才能讓它們互相配合,一起工作。這個任務(wù)當然是由main()來完成了:</p><p>  void main()</p><p><b>  {</b></p><p>&

62、lt;b>  int m=0;</b></p><p><b>  int *RN;</b></p><p><b>  char ch;</b></p><p>  RN=(int *)malloc(1*sizeof(int));</p><p><b>  RN[0]

63、=0;</b></p><p>  printf("***如果是第一次運行***\n");</p><p>  printf("**請先建立n_rec.txt**\n");</p><p>  printf("*****否則會出錯!*****\n");</p><p> 

64、 printf("('y'--創(chuàng)建**'n'--不建)\n");</p><p>  ch=getchar();</p><p>  if(ch=='y')</p><p>  RecN(RN,1);</p><p>  LookN(RN,1);</p><

65、;p><b>  RN[0]+=m;</b></p><p>  fflush(stdin);</p><p>  printf("是否向試題庫中添加試題: ");</p><p>  printf("('y'--是,'n'--否)?\n");</p>

66、<p>  ch=getchar();</p><p>  if(ch=='y')</p><p>  Built_shitiKu();</p><p>  menu: page_title("操作選單");</p><p>  printf("請用數(shù)字鍵選擇操作\n\n");

67、</p><p>  printf("1 開始練習\n");</p><p>  printf("2 查看得分記錄\n");</p><p>  printf("0 退出\n");</p><p>  printf("******************\n");

68、</p><p><b>  RN[0]+=m;</b></p><p><b>  m=0;</b></p><p>  switch(getch())</p><p><b>  {</b></p><p>  case '1' :

69、m=excersice_begin();</p><p><b>  break;</b></p><p>  case '2' : Look_Mark(RN[0]);</p><p><b>  break;</b></p><p>  case '0' : {&l

70、t;/p><p>  RecN(RN,1);</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  system("cls"); <

71、/p><p>  goto menu;</p><p><b>  }</b></p><p>  3.本程序設(shè)計的結(jié)構(gòu)體 </p><p><b>  定義表達式:</b></p><p>  typedef struct shiti /*定義表達

72、式*/</p><p><b>  {</b></p><p>  char a[20]; /*存放表達式*/</p><p>  long result; /*存放用戶輸入的答案*/</p><p><b>  }xuanti;</b></p>&

73、lt;p><b>  建立數(shù)字棧:</b></p><p>  typedef struct SqStack1 /*建立數(shù)字棧*/</p><p><b>  { </b></p><p>  int *base;</p><p><b>  int *top;&

74、lt;/b></p><p>  int stacksize;</p><p>  }SqStack1; </p><p><b>  建立運算符棧:</b></p><p>  typedef struct SqStack2 /*建立運算符棧*/</p>

75、<p><b>  {</b></p><p>  char *base;</p><p>  char *top;</p><p>  int stacksize;</p><p>  }SqStack2; </p><p><b>  4.程

76、序演示:</b></p><p>  由于不是第一次運行,所以選擇‘n’,那么會出現(xiàn)下面結(jié)果,并且向試題庫添加試題如下:</p><p>  向試題庫添加的試題如下:</p><p>  然后選“1”開始測試:(隨機抽取10道題目測試)</p><p>  n返回主菜單,選擇查看歷史成績。如下圖示:</p><

77、p>  按任意鍵返回菜單,輸入0退出整個程序,完成測試!</p><p><b>  5.課程設(shè)計心得</b></p><p>  經(jīng)過一個星期的課程設(shè)計感觸頗深,感覺自己的能力得到了提高。說實話,剛開始覺得這題目就那幾個功能,分析起來很簡單的,但是當老師說要用文件做的時候,腦袋都大了,根本不知從何下手。琢磨好久,最終在老師及同學的幫助下,以及查看網(wǎng)上的相關(guān)資料

溫馨提示

  • 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

提交評論