算術(shù)表達(dá)式求值課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩18頁(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>  學(xué)年論文(設(shè)計(jì))</b></p><p><b> ?。ū究疲?lt;/b></p><p>  學(xué) 院 </p><p>  專(zhuān) 業(yè) </p><p>  年 級(jí)

2、 </p><p>  姓 名 </p><p>  論文(設(shè)計(jì))題目 算術(shù)表達(dá)式求值 </p><p>  指導(dǎo)教師 職稱 </p><p> 

3、 成 績(jī) </p><p>  2012 年 月 日</p><p><b>  目錄</b></p><p>  概述……………………………………………………………………………………………3</p><p>  設(shè)計(jì)目的…………

4、……………………………………………………………………….3</p><p>  三、設(shè)計(jì)功能分析…………………………………………………………………………3</p><p>  四、概要設(shè)計(jì)說(shuō)明…………………………………………………………………………4</p><p>  五、詳細(xì)信息說(shuō)明…………………………………………………………………………5</p>

5、<p>  六、流程圖………………………………………………………………………………………10</p><p>  七、程序代碼…………………………………………………………………………………10</p><p>  八、調(diào)試及運(yùn)行結(jié)論……………………………………………………………………17</p><p>  九、總結(jié)…………………………………………………

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

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

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

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

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

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

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

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

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

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

16、xpr()</p><p>  初始條件:輸入表達(dá)式合法。</p><p>  操作結(jié)果:返回表達(dá)式的最終結(jié)果。</p><p>  }ADT Stack</p><p><b>  五、詳細(xì)設(shè)計(jì)說(shuō)明</b></p><p>  1、數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)</p><p>  因

17、為表達(dá)式是由操作符,運(yùn)算符和界限符組成的。如果只用一個(gè)char類(lèi)型棧,不能滿足2位以上的整數(shù),所以還要定義一個(gè)int類(lèi)型的棧用來(lái)寄存操作數(shù)。</p><p>  /* 定義字符類(lèi)型棧 */</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>  ①、Precede(char c1,char c2) 判斷運(yùn)算符優(yōu)先權(quán),返回優(yōu)先權(quán)高的。</p

20、><p>  算符間的優(yōu)先關(guān)系如下:</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ù)組存儲(chǔ)49種情況</p><p>  switch(c1) </p><p><b>  { </b></p><p>  /* i為下面ar

26、ray的橫標(biāo) */ </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的縱標(biāo) */ </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]); /* 返回運(yùn)算符array[7*i+j]為對(duì)應(yīng)的c1,c2優(yōu)先關(guān)系*/ </p><p><b>  }</b></p><

31、p> ?、?、利用該算法對(duì)算術(shù)表達(dá)式3*(7-2)求值操作過(guò)程如下:</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)) //不是運(yùn)算符即進(jìn)棧</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)先權(quán)底<

35、;/p><p>  Push(&OPTR,c); </p><p>  c = *ptr++; </p><p><b>  break; </b></p><p>  case '=': //脫括號(hào)并接收下一字符</p><p>  x=Pop(&OPTR); <

36、;/p><p>  c = *ptr++; </p><p><b>  break; </b></p><p>  case '>'://退棧并將運(yùn)算結(jié)果入棧 </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ùn)算符的優(yōu)先級(jí)</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("括號(hào)匹配錯(cuò)誤!\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!沒(méi)有左括號(hào)\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!沒(méi)有右括號(hào)!\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是否為七種運(yùn)算符之一</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為進(jìn)行二元運(yùn)算的a theta b的函數(shù)</p><p><b>  {</b></p><p>  char n=char(t

62、heta);//此處把double型強(qiáng)制轉(zhuǎn)換成int型,雖然會(huì)造成精度缺失,但本身theta是一個(gè)符號(hào),也算是整型</p><p>  switch(n) //轉(zhuǎn)換后相當(dāng)于和符號(hào)匹配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>  { //算符表達(dá)式的優(yōu)先算法。設(shè)OPTR和OPND分別為運(yùn)算符棧和運(yùn)算數(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);//構(gòu)造一個(gè)運(yùn)算符棧</p><p>  InitStack(OPND);//構(gòu)造一個(gè)運(yùn)算數(shù)棧</p><p&

68、gt;  Push(OPTR,'#');//將#壓入棧底</p><p>  c=getchar();</p><p>  GetTop(OPTR,e);</p><p>  while(c!='#'||e!='#')//棧頂不是#號(hào)且輸入不是#號(hào)</p><p><b>  {<

69、;/b></p><p>  if(In(c))//是符號(hào)則進(jìn)棧</p><p><b>  {</b></p><p>  switch(Precede(e,c))</p><p><b>  {</b></p><p>  case'<':

70、 //棧頂元素優(yōu)先級(jí)低</p><p>  Push(OPTR,c);</p><p>  c=getchar();</p><p><b>  break;</b></p><p>  case'=': //脫括號(hào)并接受下一字符</p><p>  Pop(OPTR,e);

71、</p><p>  c=getchar();</p><p><b>  break;</b></p><p>  case'>': //退棧并將運(yùn)算結(jié)果入棧</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ù)字沒(méi)有存滿,輸入字符串結(jié)束符</p><p>  d=atof(Data);//此處是把數(shù)組里的數(shù)字,實(shí)際上是按字符串;轉(zhuǎn)換為double類(lèi)型,然后把浮點(diǎn)型數(shù)字入棧</p><p>  Push(OPND,d);//atof函數(shù)的形參

76、是指針類(lèi)型,故用數(shù)組名</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("error!輸入錯(cuò)誤!\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("請(qǐng)輸入表達(dá)式,以#號(hào)結(jié)束\n");</p><p>  result=EvaluateExpression();</p><p>  printf("結(jié)果為:%f:\n",result);</p><p><b>  }</b></p><p><b>  八、調(diào)

80、試及運(yùn)行結(jié)果</b></p><p><b>  1、程序調(diào)試</b></p><p>  1)使用Microsoft visual c++ 編輯軟件進(jìn)行源程序的編寫(xiě)。</p><p>  2)使用Microsoft visual c++軟件進(jìn)行編譯,步驟:按F7。 </p><p>  3)使用Micros

81、oft visual c++運(yùn)行程序并調(diào)試,步驟:(1) 按F7;(2)按Ctrl+F5。</p><p><b>  2、運(yùn)行及程序界面</b></p><p><b>  1)編輯程序界面</b></p><p><b>  圖一</b></p><p>  2)執(zhí)行程序及

82、運(yùn)行后界面</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)運(yùn)行過(guò)程</b></p><p>  1、輸入正確的表達(dá)式后</p><p><b>  2、更改表達(dá)式</b></p><p><b>  九:總結(jié)</b

84、></p><p>  通過(guò)此次的課程設(shè)計(jì),更加清楚了算術(shù)表達(dá)式求值的過(guò)程,同時(shí)也更加深刻的理解了棧的相關(guān)知識(shí)。更加深刻的知道程序設(shè)計(jì)者要有較強(qiáng)的思維和動(dòng)手能力和更加了解編程思想和編程技巧,其次,設(shè)計(jì)界面與函數(shù)功能要?jiǎng)澐趾茫绦蛞欢ǖ淖⑨屢员阌诶斫?,程序要?jīng)得起測(cè)試,要做出有價(jià)值的程序。所以在以后的學(xué)習(xí)中要更加注重對(duì)自己動(dòng)手能力的練習(xí)。</p><p>  在課程設(shè)計(jì)的過(guò)程中,也有

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

溫馨提示

  • 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)論