數(shù)據(jù)結構課程設計--表達式求值—mfc圖形界面_第1頁
已閱讀1頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)據(jù)結構</b></p><p><b>  課程設計說明書</b></p><p>  題目: 表達式求值 </p><p>  院 系: 計算機科學與工程學院 </p><p>  專業(yè)班級: 計算機1

2、2-1班 </p><p>  學 號: </p><p>  學生姓名: </p><p>  指導教師:   </p><p>  2014年 01 月 17 日</p><p&

3、gt;  課程設計(論文)任務書</p><p>  計算機科學與工程 學院 </p><p>  2013年 11 月 21 日 </p><p><b>  目  錄</b></p><p><b>  1需求分析1<

4、/b></p><p><b>  2概要設計1</b></p><p><b>  2.1設計思路1</b></p><p>  2.2功能模塊設計1</p><p>  2.3算法流程圖2</p><p><b>  3詳細設計4</b

5、></p><p>  3.1數(shù)據(jù)存儲設計4</p><p>  3.2詳細代碼設計4</p><p>  3.2.1基本功能實現(xiàn)4</p><p>  3.2.2圖形界面各按鈕功能實現(xiàn)8</p><p>  4調試與運行12</p><p><b>  5總結1

6、6</b></p><p><b>  參考文獻17</b></p><p><b>  需求分析</b></p><p>  程序功能:能夠處理以字符序列的形式輸入的不含變量的實數(shù)表達式,正確處理小數(shù),判斷表達式是還語法正確,正確實現(xiàn)對算術四則混合運算表達式的求值。 </p><

7、;p>  輸入形式和輸入值的范圍:以字符串的形式輸入表達式。 </p><p>  輸出的形式:在計算過程中遇到的問題或最終的答案將顯示在屏幕上。 </p><p>  測試數(shù)據(jù):輸入“(5.2+3.4)*8/(6.1-3)”時,輸出“22.1936”,測試正確;輸入“.8”時,輸出“輸入錯誤!”,測試正確。</p><p><b&g

8、t;  概要設計</b></p><p><b>  2.1設計思路</b></p><p>  為了實現(xiàn)算符優(yōu)先算法,可以使用兩個工作棧。一個稱為OPTR,用以寄存運算符,另一個稱作OPND,用以寄存操作數(shù)或運算結果。算法的基本思想是:</p><p> ?。?)首先置非運算符棧為空棧,表達式起始符“#” 為運算符棧的棧

9、底元素;</p><p> ?。?)依次讀入表達式中每個字符,若是非運算符則進OPND棧,若是運算符則和OPTR棧的棧頂運算符比較優(yōu)先權后做相應的操作,直至整個表達式求值完畢。</p><p>  算法中還調用了兩個函數(shù),其中Precede是判定運算符棧頂運算符a與讀入的運算符b之間優(yōu)先關系的函數(shù);Operate為進行二元運算a theta b的函數(shù),如果是編譯表達式,則產(chǎn)生這個運算的一組

10、相應指令并返回存放結果的中間變量名;如果是解釋執(zhí)行表達式,則直接進行該運算,并返回運算結果。</p><p><b>  2.2功能模塊設計</b></p><p>  (1) InitStackchar(Stackchar &S):構造運算符棧。</p><p> ?。?) InitStackint(Stackint &S):

11、構造非運算符棧。</p><p> ?。?) Pushchar(SqStackchar &S,char e):運算符棧插入元素e為新的棧頂元素。</p><p> ?。?) Pushint(SqStackint &S,float e):非運算符棧插入元素e為新的棧頂元素。</p><p> ?。?) Popchar(SqStackchar &

12、S,char &e): 刪除運算符棧S的棧頂元素,用e返回其值。</p><p> ?。?) Popint(SqStackint &S,float &e):刪除非運算符棧S的棧頂元素,用e返回其值。</p><p> ?。?) GetTopchar(SqStackchar S):用e返回運算符棧S的棧頂元素。</p><p>  (

13、8) float GetTopint(SqStackint S):用e返回操作數(shù)棧S的棧頂元素。</p><p>  (9) Xiaoshu(char c):用于計算個位數(shù)。</p><p>  (10) Precede(char a,char b):判斷運算符的優(yōu)先權功能。</p><p>  a<b a的優(yōu)先權低于b</p>&l

14、t;p>  a=b a的優(yōu)先權等于b</p><p>  a>b a的優(yōu)先權高于b</p><p>  算符間的優(yōu)先關系見表1:</p><p>  表1 算符間的優(yōu)先關系</p><p> ?。?1)Operate(float a,char theta,float b):操作數(shù)用對應的運算符進行運算功能,運算結果直接返回&l

15、t;/p><p><b>  2.3算法流程圖</b></p><p>  算法流程圖如圖1所示。</p><p><b>  圖1 算法流程圖</b></p><p><b>  詳細設計</b></p><p><b>  3.1數(shù)據(jù)存儲設計&

16、lt;/b></p><p>  因為表達式是由操作符,運算符和界限符組成的。如果只用一個char類型棧,不能滿足2位以上的整數(shù),所以還需要定義一個int類型的棧用來寄存操作數(shù)。</p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  

17、#define MAXSIZE 100 //存儲空間初始分配量</p><p>  #define STACKINCREMENT 10 //存儲空間分配增量</p><p>  //定義結點元素結構(用于存放運算符)</p><p>  typedef struct charstack</p><p><

18、b>  {</b></p><p>  char *base; //在棧構造之前,base的值為NULL</p><p>  char *top; //棧頂指針</p><p>  int stacksize; //當前已分配的存儲空間,以元素為單位</p><p>  }SqSt

19、ackchar; </p><p>  //定義結點元素結構(用于存放非運算符)</p><p>  typedef struct intstack</p><p><b>  {</b></p><p>  float *base; //在棧構造之前,base的值為NULL</p

20、><p>  float *top; //棧頂指針</p><p>  int stacksize; //當前已分配的存儲空間,以元素為單位</p><p>  }SqStackint; </p><p><b>  3.2詳細代碼設計</b></p><p

21、>  3.2.1基本功能實現(xiàn)</p><p><b>  (1)構造一個空棧</b></p><p>  以構造一個用于存放運算符的空棧為例。</p><p>  算法思想:在棧中分配一定的存儲空間,用于存放運算符。</p><p>  其功能實現(xiàn)代碼如下:</p><p>  int I

22、nitStackchar(SqStackchar &S){</p><p>  //構造一個空棧(用于存放運算符)</p><p>  S.base=(char *)malloc(MAXSIZE * sizeof(char));</p><p>  if(!S.base)</p><p>  return 0; //存儲分配

23、失敗</p><p>  S.top=S.base; //空棧</p><p>  S.stacksize=MAXSIZE;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p> ?。?)元素進運算符的棧&

24、lt;/p><p>  算法思想:如果棧滿,則增加存儲空間;元素入棧,棧頂指針增1,并用e返回其值。</p><p>  其功能實現(xiàn)代碼如下:</p><p>  int Pushchar(SqStackchar &S,char e){</p><p>  //元素進運算符的棧</p><p>  if(S.to

25、p-S.base>=S.stacksize){ //棧滿,追加存儲空間</p><p>  S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));</p><p>  if(!S.base)</p><p>  return 0; //存儲

26、分配失敗</p><p>  S.top=S.base+S.stacksize;; //因為s.base可能不是原來值</p><p>  S.stacksize+=STACKINCREMENT;</p><p><b>  }</b></p><p>  *S.top++=e; //元素

27、入棧,棧頂指針增1</p><p><b>  return 1;</b></p><p><b>  }</b></p><p> ?。?)取棧頂元素(存放運算符的棧頂元素)</p><p>  算法思想:如果棧不空,棧頂指針減1,并用e返回其值。</p><p>  其功

28、能實現(xiàn)代碼如下:</p><p>  char GetTopchar(SqStackchar S){</p><p><b>  char e;</b></p><p>  if(S.top==S.base)</p><p><b>  return 0;</b></p><p

29、>  e=*(S.top-1); //棧本身不改變</p><p><b>  return e;</b></p><p><b>  }</b></p><p> ?。?)出棧(運算符)</p><p>  算法思想:將棧指針的內容減1,即指向棧頂元素,并取出目前棧頂指針所指向

30、元素,并用e返回其值。</p><p>  其功能實現(xiàn)代碼如下:</p><p>  int Popchar(SqStackchar &S,char &e){</p><p>  if(S.top==S.base)</p><p><b>  return 0;</b></p><p&

31、gt;  e=*--S.top; //棧頂指針減1,并取出當前指向元素</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  (5)用于計算個位數(shù)。</p><p>  算法思想:利用ASCII碼轉換。</p>

32、<p>  其功能實現(xiàn)代碼如下:</p><p>  int Xiaoshu(char c){</p><p>  if(c>=48&&c<=57) </p><p><b>  {</b></p><p><b>  c- =48;</b&g

33、t;</p><p><b>  return c;</b></p><p><b>  }</b></p><p><b>  else </b></p><p><b>  return 0;</b></p><p><b

34、>  }</b></p><p>  (6)判斷運算符棧的棧頂元素與讀入的運算符之間優(yōu)先關系的函數(shù)。</p><p>  算法思想:a<b a的優(yōu)先權低于b</p><p>  a=b a的優(yōu)先權等于b</p><p>  a>b a的優(yōu)先權高于b</p><p>  其功能實現(xiàn)代碼

35、如下:</p><p>  char Precede(char a,char b){</p><p><b>  char c;</b></p><p>  if(a=='+'||a=='-'){</p><p>  if(b=='*'||b=='/'||

36、b=='(') return c='<';</p><p>  else return c='>';</p><p><b>  }</b></p><p>  else if(a=='*'||a=='/'){</p><p&

37、gt;  if(b=='(') return c='<';</p><p>  else return c='>';</p><p><b>  }</b></p><p>  else if(a=='('){</p><p>  if(

38、b==')') return c='=';</p><p>  else if(b=='#'){</p><p>  printf(" ");</p><p><b>  exit(0);</b></p><p><b>  }</b

39、></p><p>  else return c='<';</p><p><b>  }</b></p><p>  else if(a==')'){</p><p>  if(b=='('){</p><p>  printf(

40、" ");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  else return c='>';</p><p><b>  }</b></p><

41、;p>  else if(a=='#'){</p><p>  if(b=='#') return c='=';</p><p>  else if(b==')'){</p><p>  printf(" ");</p><p><b> 

42、 exit(0);</b></p><p><b>  }</b></p><p>  else return c='<';</p><p><b>  }</b></p><p><b>  }</b></p><p&

43、gt; ?。?)執(zhí)行相應的運算操作。</p><p>  算法思想:執(zhí)行相應的加減乘除運算,除數(shù)不能為零,否則錯誤。</p><p>  其功能實現(xiàn)代碼如下:</p><p>  float Operate(float a,char theta,float b){</p><p><b>  float c;</b>&

44、lt;/p><p>  switch(theta)</p><p><b>  {</b></p><p>  case '+':c=a+b;break;</p><p>  case '-':c=a-b;break;</p><p>  case '*'

45、;:c=a*b;break;</p><p>  case '/':if(b!=0)c=a/b;</p><p><b>  else</b></p><p>  printf("輸入錯誤!\n");</p><p><b>  break;</b></p&

46、gt;<p><b>  }</b></p><p><b>  return c;</b></p><p><b>  }</b></p><p>  3.2.2圖形界面各按鈕功能實現(xiàn)</p><p>  (1)加號按鈕實現(xiàn)代碼如下:</p>&l

47、t;p>  void CMyDlg::OnButton11() </p><p><b>  {// 加號</b></p><p><b>  ++i;</b></p><p><b>  a[i]='+';</b></p><p><b>  

48、m_show=a;</b></p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p> ?。?)減號按鈕實現(xiàn)代碼如下:</p><p>  void CMyDlg::OnButton12() </p><p><b> 

49、 {// 減號</b></p><p><b>  ++i;</b></p><p><b>  a[i]='-';</b></p><p><b>  m_show=a;</b></p><p>  UpdateData(FALSE);</p

50、><p><b>  }</b></p><p> ?。?)乘號按鈕實現(xiàn)代碼如下:</p><p>  void CMyDlg::OnButton13() </p><p><b>  {// 乘號</b></p><p><b>  ++i;</b><

51、;/p><p><b>  a[i]='*';</b></p><p><b>  m_show=a;</b></p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p> ?。?)除號按

52、鈕實現(xiàn)代碼如下:</p><p>  void CMyDlg::OnButton14() </p><p><b>  {//除號</b></p><p><b>  ++i;</b></p><p><b>  a[i]='/';</b></p>

53、<p><b>  m_show=a;</b></p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p> ?。?)左括號按鈕實現(xiàn)代碼如下:</p><p>  void CMyDlg::OnButton16() </p>

54、;<p><b>  {// 左括號</b></p><p><b>  ++i;</b></p><p><b>  a[i]='(';</b></p><p><b>  m_show=a;</b></p><p>  U

55、pdateData(FALSE);</p><p><b>  }</b></p><p>  (6)右括號按鈕實現(xiàn)代碼如下:</p><p>  void CMyDlg::OnButton17() </p><p><b>  {// 右括號</b></p><p><

56、;b>  ++i;</b></p><p><b>  a[i]=')';</b></p><p><b>  m_show=a;</b></p><p>  UpdateData(FALSE);</p><p><b>  }</b><

57、/p><p>  (7)小數(shù)點按鈕實現(xiàn)代碼如下:</p><p>  void CMyDlg::OnButton18() </p><p><b>  {// 小數(shù)點</b></p><p><b>  ++i;</b></p><p><b>  a[i]='

58、.';</b></p><p><b>  m_show=a;</b></p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p> ?。?)撤銷按鈕實現(xiàn)代碼如下:</p><p>  void CMy

59、Dlg::OnButton19() </p><p><b>  {// 撤銷按鈕</b></p><p><b>  if(i>=0){</b></p><p>  a[i]=NULL;</p><p><b>  i--;</b></p><p&g

60、t;<b>  m_show=a;</b></p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p><b>  }</b></p><p> ?。?)清除按鈕實現(xiàn)代碼如下:</p><p>  v

61、oid CMyDlg::OnButton21() </p><p><b>  {// 清除按鈕</b></p><p>  while(i>=0){</p><p>  a[i]=NULL;</p><p><b>  i--;</b></p><p><b&g

62、t;  }</b></p><p><b>  m_show=a;</b></p><p>  m_result=0;</p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p> ?。?0)數(shù)字按鈕(以數(shù)字1

63、為例)實現(xiàn)代碼如下:</p><p>  void CMyDlg::On1() </p><p><b>  {// 數(shù)字1按鈕</b></p><p><b>  ++i;</b></p><p><b>  a[i]='1';</b></p>

64、<p><b>  m_show=a;</b></p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p>  (11)等號按鈕實現(xiàn)代碼如下:</p><p>  void CMyDlg::OnButton15() </p>

65、<p><b>  {// 等號</b></p><p>  SqStackchar OPTR;</p><p>  SqStackint OPND;</p><p>  float aa,b,f;</p><p>  int m=1,n=0,sum=0;</p><p>  cha

66、r c,x,theta;</p><p>  InitStackchar(OPTR);</p><p>  Pushchar(OPTR,'#');</p><p>  InitStackint(OPND);</p><p><b>  c=a[n++];</b></p><p> 

67、 if(n>i||(c>=40&&c<=43)||c==45||(c>=47&&c<=57)){</p><p>  while(n<=i||GetTopchar(OPTR)!='#'){</p><p>  if(Xiaoshu(c)){</p><p>  sum=sum*10+

68、Xiaoshu(c);</p><p><b>  c=a[n++];</b></p><p>  while(Xiaoshu(c)||c=='.'){</p><p>  if(c=='.'){</p><p><b>  c=a[n++];</b></p&g

69、t;<p>  while(Xiaoshu(c)){</p><p><b>  m*=10;</b></p><p>  sum=sum*10+Xiaoshu(c);</p><p><b>  c=a[n++];</b></p><p><b>  }</b>

70、</p><p><b>  }</b></p><p><b>  else{</b></p><p>  sum=sum*10+Xiaoshu(c);</p><p><b>  c=a[n++];</b></p><p><b>  }&

71、lt;/b></p><p><b>  }</b></p><p>  f=sum/(float)m;</p><p>  Pushint(OPND,f);</p><p><b>  sum=0;</b></p><p><b>  m=1;</b&

72、gt;</p><p>  } //不是運算符就進棧</p><p><b>  else{</b></p><p>  switch(Precede(GetTopchar(OPTR),c)){</p><p>  case '<': { //棧頂元素優(yōu)先權低{&l

73、t;/p><p>  Pushchar(OPTR,c);</p><p><b>  c=a[n++];</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  case '=':

74、 { //拖脫括號并接受下一個字符</p><p>  Popchar(OPTR,x);</p><p><b>  c=a[n++];</b></p><p><b>  break;</b></p><p><b>  }</b></p>&l

75、t;p>  case '>':{ //退棧并將運算結果進棧</p><p>  Popchar(OPTR,theta);</p><p>  Popint(OPND,b);</p><p>  Popint(OPND,aa);</p><p>  Pushint(OPND,Operate(aa,th

76、eta,b));</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }&l

77、t;/b></p><p>  m_result=GetTopint(OPND);</p><p>  UpdateData(FALSE);</p><p><b>  }</b></p><p><b>  else</b></p><p>  MessageBox(

78、"輸入錯誤!");</p><p><b>  }</b></p><p><b>  調試與運行</b></p><p>  (1)系統(tǒng)界面如圖2所示。</p><p><b>  圖2 主界面</b></p><p> ?。?)加

79、法測試,輸入正確,輸出正確,測試正確,如圖3所示。</p><p><b>  圖3 加法測試</b></p><p> ?。?)減法測試,輸入正確,輸出正確,測試正確,如圖4所示。</p><p><b>  圖4 減法測試</b></p><p> ?。?)乘法測試,輸入正確,輸出正確,測試正確

80、,如圖5所示。</p><p><b>  圖5 乘法測試</b></p><p> ?。?)除法測試,輸入正確,輸出正確,測試正確,如圖6所示。</p><p><b>  圖6 除法測試</b></p><p> ?。?)輸入表達式正確,輸出正確,測試正確,如圖7所示。</p>&

81、lt;p><b>  圖7 表達式測試</b></p><p> ?。?)輸入表達式錯誤,能正確判斷,測試正確,如圖8所示。</p><p>  圖8 錯誤表達式測試</p><p><b>  總結</b></p><p>  通過這段時間的課程設計,我對計算機的應用、數(shù)據(jù)結構的作用以及C語

82、言的使用都有了更深的了解。當然也遇到不少問題,也正是國為這些問題引發(fā)的思考給我?guī)砹耸斋@。從當初不喜歡上機寫程序到現(xiàn)在能主動寫程序,從當初拿著程序不知從何下手到現(xiàn)在知道如何分析問題,如何用專業(yè)知識解決實際問題的轉變。我發(fā)現(xiàn)無論是專業(yè)知識還是動手能力,自己都有很大程度的提高。在實際上機操作過程中,不僅是讓我們了解數(shù)據(jù)結構的理論知識,更重要的是培養(yǎng)解決實際問題的能力,為后續(xù)課程的學習及實踐打下良好的基礎。</p><p&

83、gt;  這次課程設計讓我更加了解大一學到的C語言和這個學期學到的數(shù)據(jù)結構的緊密聯(lián)系,而且還鞏固了先前學的MFC程序設計知識,對圖形界面有了更深的了解,也培養(yǎng)了我的動手能力,更令我的創(chuàng)造性思維得到拓展。不僅要求設計者對課本知識有較深刻的了解,同時要有較強的思維動手能力。 </p><p>  這次的課程設計讓我有一個深刻的體會:嚴謹!編程最需要的就是嚴謹,往往檢查到的錯誤是在某個括號、分號、引號等不應該

84、犯錯的地方上。程序設計時難免遇到錯誤,但這不是壞事情,它可以讓我發(fā)現(xiàn)自己的薄弱環(huán)節(jié),在具體操作中還可以鞏固所學的C語言、MFC及數(shù)據(jù)結構,更加體會到了C語言的語句簡潔、使用靈活、執(zhí)行效率高等特點。</p><p>  通過此次課程設計,我懂得了實踐的重要性,要理論聯(lián)系實際,才能把自己所掌握的知識更好地運用。并且切實地感受到同學之間的相互幫助,遇到自己實在弄不懂的地方,和同學討論一下,兩個人共同提高。</p&

85、gt;<p><b>  參考文獻</b></p><p>  [1]何欽銘主編.C語言程序設計(第2版).北京:高等教育出版社,2008.</p><p>  [2]譚浩強編著.C程序設計(第四版).北京:清華大學出版社,2008.</p><p>  [3]嚴蔚敏,吳偉民編著.數(shù)據(jù)結構(C語言版).北京:清華大學出版社,200

溫馨提示

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

評論

0/150

提交評論