2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩17頁(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é)院</b></p><p><b>  計(jì)算機(jī)科學(xué)與技術(shù)系</b></p><p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  20 12 ~20 13 學(xué)年第 2 學(xué)期</p><p>  20 13 年 3 月&l

2、t;/p><p><b>  【問(wèn)題描述】</b></p><p> ?。ㄋ銛?shù)表達(dá)式的求解)給定一個(gè)算數(shù)表達(dá)式,通過(guò)程序求出最后的結(jié)果。</p><p><b>  【要求】</b></p><p>  從鍵盤輸入要求解的算術(shù)表達(dá)式;</p><p>  采用棧結(jié)構(gòu)進(jìn)行算數(shù)表達(dá)式

3、的求解過(guò)程;</p><p>  能夠判斷算數(shù)表達(dá)式的正確與否;</p><p>  對(duì)于錯(cuò)誤表達(dá)式給出提示;</p><p>  對(duì)于正確表達(dá)時(shí)給出最后的結(jié)果。</p><p><b>  問(wèn)題分析和任務(wù)定義</b></p><p>  有題目可知,程序要求給定一算數(shù)表達(dá)式并計(jì)算最后的結(jié)果,我們

4、知道,在高級(jí)語(yǔ)言中,任何一個(gè)表達(dá)式都是有操作數(shù)、運(yùn)算符和界限符組成。在計(jì)算過(guò)程中,還要考慮表達(dá)式中有無(wú)括號(hào)以及左右括號(hào)之分。由于運(yùn)算符有優(yōu)先級(jí)的高低,因此一個(gè)算數(shù)表達(dá)是不可能總是按順序執(zhí)行。</p><p>  通過(guò)以上可知,可以用棧來(lái)實(shí)現(xiàn)運(yùn)算符的優(yōu)先級(jí)完成算術(shù)表達(dá)式的求解。</p><p>  為實(shí)現(xiàn)算法的優(yōu)先級(jí),設(shè)置兩個(gè)棧:一個(gè)稱為操作數(shù)棧opnd,用以寄存操作數(shù)和運(yùn)算結(jié)果,另一個(gè)為操

5、作符棧optr,用以寄存運(yùn)算符。</p><p>  該算法的基本思想是:</p><p>  首先置操作數(shù)棧opnd為空棧,表達(dá)式結(jié)束符“#”為操作符棧optr的棧底元素。</p><p> ?。?)依次讀入表達(dá)式中每個(gè)字符,若為操作數(shù),則進(jìn)opnd棧;若是運(yùn)算符,則與optr棧的棧頂運(yùn)算符比較優(yōu)先級(jí)后做相應(yīng)操作:若當(dāng)前操作符大于optr棧的棧頂,則當(dāng)前操作符入棧

6、;否則,opnd棧的棧頂元素、次棧頂元素出棧,同時(shí)optr棧的棧頂元素也出棧,形成運(yùn)算,并將結(jié)果壓入opnd棧,直至整個(gè)表達(dá)式求值完畢(即optr棧的棧頂元素和當(dāng)前讀入的字符均為“#”)。</p><p>  對(duì)于算術(shù)表達(dá)式的輸入,本程序采用gets()的方法讀入,將運(yùn)算符‘+’,‘-’,‘*’,‘/’,‘(’,‘)’,‘#’存儲(chǔ)在數(shù)組中時(shí),定義表達(dá)式求解函數(shù),在函數(shù)中判斷讀入的字符,如果是運(yùn)算符,將這些字符入操

7、作符optr棧,并比較優(yōu)先級(jí),判斷是否運(yùn)算。若讀入的字符為‘0’到‘9’之間的數(shù)字時(shí),用字符相減轉(zhuǎn)化為整型,然后將轉(zhuǎn)化后的整型再轉(zhuǎn)化為ASCII的形式壓入操作數(shù)棧opnd中。</p><p>  2、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計(jì)</p><p><b>  存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)</b></p><p>  本程序主要采用順序棧結(jié)構(gòu)類型(Stack)來(lái)存儲(chǔ)表

8、達(dá)式計(jì)算中的數(shù)據(jù)。程序中需要建立兩個(gè)棧,一個(gè)棧用于寄存運(yùn)算符,另一個(gè)則用于寄存操作數(shù)和計(jì)算結(jié)果,故需要建立兩個(gè)順序棧結(jié)構(gòu)類型。</p><p><b>  算數(shù)優(yōu)先級(jí)設(shè)計(jì)</b></p><p>  對(duì)一任意的表達(dá)式,由于表達(dá)式中運(yùn)算符的優(yōu)先級(jí)不同,可能會(huì)使表達(dá)式不按順序進(jìn)行計(jì)算。在本程序中定義函數(shù)Proceed()來(lái)比較運(yùn)算符的優(yōu)先級(jí),而函數(shù)中各優(yōu)先級(jí)的比較主要根據(jù)

9、以下優(yōu)先級(jí)比較的表格:</p><p><b>  表1:運(yùn)算符優(yōu)先級(jí)</b></p><p>  在Precede()函數(shù)中定義兩個(gè)字符型參數(shù)變量op和c,其中op表示棧頂運(yùn)算符,c表示當(dāng)前讀入運(yùn)算符,對(duì)于當(dāng)前運(yùn)算符是否入棧,進(jìn)行如下操作:</p><p>  比較當(dāng)前運(yùn)算符和棧頂運(yùn)算符的優(yōu)先級(jí)的大?。?lt;/p><p>

10、;  1、如果當(dāng)前運(yùn)算符的優(yōu)先級(jí)大于棧頂運(yùn)算符的優(yōu)先級(jí),即op<c;令函數(shù)返回值為'<',并將當(dāng)前運(yùn)算符進(jìn)optr棧。</p><p>  2、如果當(dāng)前運(yùn)算符的優(yōu)先級(jí)小于棧頂運(yùn)算符的優(yōu)先級(jí),即op>c;令函數(shù)返回值為'>',此時(shí)應(yīng)將棧頂運(yùn)算符出棧和棧頂、次棧頂操作數(shù)出棧并進(jìn)行相應(yīng)的運(yùn)算。</p><p>  3、如果當(dāng)前元素的優(yōu)先級(jí)等

11、于棧頂運(yùn)算符的優(yōu)先級(jí),即op=c;令函數(shù)的返回值為'=',此時(shí)界限符內(nèi)的表達(dá)式已計(jì)算完畢。</p><p><b> ?。?)程序模塊設(shè)計(jì)</b></p><p><b>  1)程序模塊</b></p><p>  本程序主要包含3個(gè)模塊:主程序模塊、計(jì)算模塊以及順序棧操作模塊,調(diào)用關(guān)系如圖所示:<

12、/p><p>  圖1:程序模塊圖 </p><p><b>  2)系統(tǒng)功能模塊</b></p><p>  本程序大致包含10個(gè)函數(shù),其中包含主函數(shù)。每個(gè)函數(shù)都有其相對(duì)應(yīng)的功能實(shí)現(xiàn)。</p><p>  操作符的輸入函數(shù) int In(char c);</p><p>  運(yùn)算符比較優(yōu)先級(jí)函

13、數(shù) char Proceed(char op,char c);</p><p>  進(jìn)行四則運(yùn)算函數(shù) int Operate(int a,char a1,int b);</p><p>  實(shí)現(xiàn)表達(dá)式的求值函數(shù) int EvalExpres(void);</p><p>  初始化棧函數(shù) void InitStack(Stack *s);</p>&l

14、t;p>  入棧函數(shù) void Push(Stack *s, int x);</p><p>  出棧函數(shù) int Pop(Stack *s);</p><p>  取棧頂元素函數(shù) int GetTop(Stack *s) ;</p><p>  判??蘸瘮?shù) void Empty(Stack *s);</p><p>  主函數(shù)

15、int main()</p><p>  3)函數(shù)之間主要調(diào)用的關(guān)系圖</p><p>  本程序主要包含10個(gè)程序,各程序之間的關(guān)系如圖所示:(部分函數(shù)用以上的編號(hào)表示)</p><p>  圖2:函數(shù)之間調(diào)用關(guān)系圖 </p><p><b>  3、詳細(xì)設(shè)計(jì)和編碼</b></p><p>  

16、(1)、結(jié)構(gòu)體類型的定義</p><p>  typedef struct</p><p><b>  { </b></p><p>  int data[MAXSIZE]; </p><p>  int top; </p><p>  int base; //

17、棧底 </p><p><b>  }Stack; </b></p><p><b>  、全局變量定義</b></p><p><b>  //以下為函數(shù)聲明</b></p><p>  void InitStack(Stack *); //初始化棧 </

18、p><p>  int Empty(Stack *); //判空棧</p><p>  void Push(Stack *, int ); //進(jìn)棧</p><p>  int Pop(Stack *);//出棧</p><p>  int GetTop(Stack *); //取棧頂元素</p><p> 

19、 int Operate(int ,char ,int ); // 計(jì)算結(jié)果</p><p>  char Proceed(char ,char ); // 比較優(yōu)先級(jí)</p><p>  int In(char ); //判斷輸入符</p><p>  int EvalExpres(void); //表達(dá)式計(jì)算函數(shù)</p><p&

20、gt;  // 定義兩個(gè)棧分別存放運(yùn)算符和操作數(shù)</p><p>  Stack StackR,StackD; </p><p>  、系統(tǒng)主要子程序的詳細(xì)設(shè)計(jì)</p><p>  1)、主函數(shù)模塊設(shè)計(jì)</p><p>  int main()//主函數(shù)</p><p><b>  { </b>

21、;</p><p><b>  int v; </b></p><p><b>  char ch;</b></p><p><b>  while(1)</b></p><p><b>  { </b></p><p> 

22、 printf("\t************歡迎使用算術(shù)表達(dá)式的求解的小程序************\n"); </p><p>  v = EvalExpres(); </p><p>  printf("\t表達(dá)式的計(jì)算結(jié)果為:%d",v); </p>

23、<p>  printf("\n\tInput 'n' to quit and ENTER run again:"); </p><p><b>  do</b></p><p>  { </p><p>  scanf("%c",&ch

24、); </p><p>  if(ch == 'n' || ch == 'N') </p><p>  exit(0); </p><p>  }while(ch!='\n'); </p><p>  system("cls"); <

25、/p><p><b>  }</b></p><p>  return 0; </p><p><b>  }</b></p><p>  在主函數(shù)中,設(shè)定用戶操作界面的形式,通過(guò)調(diào)用表達(dá)式求解的子函數(shù)實(shí)現(xiàn)算法所要實(shí)現(xiàn)的功能,然后通過(guò)while()循環(huán)語(yǔ)句控制,可以實(shí)現(xiàn)多次調(diào)試。</p>

26、<p>  2)、計(jì)算函數(shù)模塊 </p><p>  int Operate(int a,char a1,int b) </p><p><b>  { </b></p><p><b>  int s; </b></p><p>  int d1 = a;

27、</p><p>  int d2 = b; //把字符ab變?yōu)閷?duì)應(yīng)數(shù)字 </p><p>  switch(a1) </p><p>  { </p><p>  case '+': </p><p>  s = d1+d2; </p><p>

28、  break; </p><p>  case '-': </p><p>  s = d2-d1;</p><p>  break; </p><p>  case '*': </p><p>  s = d1*d2; </p>&l

29、t;p>  break; </p><p>  case '/': </p><p>  s = d2/d1; </p><p><b>  }</b></p><p>  return (s+'0'); //將運(yùn)算結(jié)果轉(zhuǎn)化為ascii碼的形式入

30、棧, </p><p><b>  }</b></p><p>  在計(jì)算函數(shù)中,定義3個(gè)變量,表示基本運(yùn)算中的變量。采用開(kāi)關(guān)語(yǔ)句實(shí)現(xiàn)表達(dá)式的基本運(yùn)算,將運(yùn)算結(jié)果轉(zhuǎn)化為ASCII的形式返回。</p><p>  3)、表達(dá)式求解的函數(shù)模塊</p><p>  int EvalExpres(void) // 表達(dá)式

31、求解函數(shù)</p><p><b>  { </b></p><p>  int a,b,i=0,s=0; </p><p>  char c[80],r; </p><p>  InitStack(&StackR); //初始化棧 </p><p>  Push

32、(&StackR,'#'); //將表達(dá)式起始符壓入棧 </p><p>  InitStack(&StackD); </p><p>  printf(" \t請(qǐng)輸入表達(dá)式并以‘#’結(jié)束:"); </p><p>  gets(c); </p><p>  w

33、hile(c[i]!='#' || GetTop(&StackR)!='#') </p><p>  { </p><p>  if(!In(c[i])) //判斷讀入的字符是不是運(yùn)算符 不是則進(jìn)opnd棧 </p><p>  { if(c[i] >= &#

34、39;0' && c[i] <= '9') </p><p><b>  { </b></p><p>  s += c[i]-'0'; //字符的ascii相減將字符型轉(zhuǎn)化為整型 </p><p>

35、  while(!In(c[++i])) //繼續(xù)判斷下一個(gè)字符,若不是運(yùn)算符,表明為多位數(shù),直到讀取到字符為運(yùn)算符為止 </p><p><b>  { </b></p><p>  s*=10; </p><p>  s += c[i]-'0';

36、 </p><p>  } </p><p>  Push(&StackD,s+'0'); //將整型轉(zhuǎn)化為ascii的形式入棧,使字符在棧內(nèi)以ascii的形式保存,實(shí)現(xiàn)多位數(shù)的計(jì)算 </p><p>  s = 0; //初始化s,繼續(xù)判斷</p>

37、<p>  } </p><p>  else </p><p>  { </p><p>  printf("你輸入的表達(dá)式有誤!\n"); </p><p>  return 0;

38、 </p><p>  } </p><p><b>  } </b></p><p>  else </p><p>  switch(Proceed(GetTop(&StackR),c[i])) //此函

39、數(shù)用來(lái)比較讀取的運(yùn)算符和棧頂運(yùn)算符的優(yōu)先級(jí) </p><p>  { </p><p>  case '<': //棧頂?shù)脑貎?yōu)先級(jí)低,當(dāng)前運(yùn)算符入棧 </p><p>  Push(&StackR,c[i]); </p

40、><p>  i++; </p><p>  break; </p><p>  case '=': </p><p>  Pop(&StackR); </p><p> 

41、 i++; </p><p>  break; </p><p>  case '>': //棧頂?shù)膬?yōu)先級(jí)高則出棧,并將計(jì)算結(jié)果壓入棧內(nèi) </p><p>  r = Pop(&StackR); </p&g

42、t;<p>  a = Pop(&StackD)-'0'; //操作數(shù)在棧內(nèi)以ascii的形式存儲(chǔ),出站后要將ascii轉(zhuǎn)化為整型,然后進(jìn)行運(yùn)算 </p><p>  b = Pop(&StackD)-'0'; </p><p>  Push(&StackD,Operat

43、e(a,r,b)) ; </p><p>  break; </p><p><b>  } </b></p><p><b>  }</b></p><p>  return (GetTop(&

44、StackD)-'0'); // 將棧頂元素轉(zhuǎn)化為整型的形式輸出</p><p><b>  }</b></p><p>  對(duì)于表達(dá)式求解函數(shù),在程序中主要思想是對(duì)讀入的表達(dá)式進(jìn)棧進(jìn)行判斷。若讀入的是‘0’到‘9’之間的字符,將這些字符采用ascii相減的形式轉(zhuǎn)化為整型,再入opnd棧,若讀入的字符為運(yùn)算符,則將運(yùn)算符入棧,并比較運(yùn)算符之間的優(yōu)先級(jí),

45、看是否運(yùn)算,若棧頂?shù)倪\(yùn)算符小于當(dāng)前輸入的運(yùn)算符,則不需運(yùn)算,只要將當(dāng)前運(yùn)算符入棧即可。否則,運(yùn)算。運(yùn)算時(shí)先將optr棧的棧頂運(yùn)算符和opnd棧的棧頂、次棧頂元素出棧,并將opnd棧中出棧的元素的ASCII形式轉(zhuǎn)化為整型再計(jì)算,最后講計(jì)算結(jié)果再轉(zhuǎn)化為ASCII碼的形式壓入opnd棧中。使表達(dá)式求解函數(shù)返回值為opnd的棧頂元素。</p><p><b>  4、上級(jí)調(diào)試過(guò)程</b></p

46、><p>  遇到問(wèn)題以及解決方案</p><p>  問(wèn)題1、調(diào)試時(shí)沒(méi)有錯(cuò)誤,但運(yùn)行時(shí)顯示錯(cuò)誤。</p><p>  解決方案:通過(guò)它提示的錯(cuò)誤和警告,在判斷是否為運(yùn)算符的子函數(shù)中出現(xiàn)錯(cuò)誤,如果為運(yùn)算符時(shí)返回1,其次返回0,在返回0時(shí)沒(méi)有用else,這樣使得整個(gè)子函數(shù)可以返回一個(gè)有效值。</p><p>  問(wèn)題2、調(diào)試時(shí)程序顯示沒(méi)有錯(cuò)誤,可以

47、運(yùn)行,但在運(yùn)行時(shí)結(jié)果卻出現(xiàn)錯(cuò)誤。</p><p>  解決方案:把程序從頭看了一遍,發(fā)現(xiàn)在比較優(yōu)先級(jí)的函數(shù)中,優(yōu)先級(jí)的比較比較亂,而且部分出錯(cuò),后來(lái)查了關(guān)于運(yùn)算符優(yōu)先級(jí)的資料,通過(guò)在紙上把各種優(yōu)先級(jí)列出,解決這個(gè)錯(cuò)誤。</p><p><b>  算法的時(shí)間復(fù)雜度</b></p><p>  由于在主函數(shù)用到嵌套循環(huán),故算法的時(shí)間復(fù)雜度為O(n

48、^2)。</p><p><b>  測(cè)試結(jié)果及其分析</b></p><p> ?。?)、實(shí)現(xiàn)基本的加減乘除運(yùn)算,當(dāng)想要繼續(xù)輸入表達(dá)式時(shí)點(diǎn)擊enter鍵,若要結(jié)束,點(diǎn)擊n或N鍵即可,而且可實(shí)現(xiàn)多位數(shù)的運(yùn)算。</p><p> ?。?)、實(shí)現(xiàn)復(fù)雜的算術(shù)表達(dá)式</p><p>  (3)、錯(cuò)誤表達(dá)式的處理</p>

49、;<p><b>  6、用戶使用說(shuō)明</b></p><p> ?。?)本程序執(zhí)行的文件為“算數(shù)表達(dá)式的求解問(wèn)題”。</p><p> ?。?)所求表達(dá)式中都只是僅包含加、減、乘、除4種基本運(yùn)算的,其中也包含括號(hào)的應(yīng)用,所有的運(yùn)算對(duì)象均為簡(jiǎn)單變量,要求將表達(dá)式中的數(shù)字字符轉(zhuǎn)化為整型,且輸入表達(dá)式以“#”結(jié)束。</p><p> 

50、?。?)輸入表達(dá)式時(shí),以‘#’結(jié)束,當(dāng)點(diǎn)擊回車鍵時(shí)即可得到運(yùn)算結(jié)果,當(dāng)想繼續(xù)輸入表達(dá)式時(shí),再次點(diǎn)擊回車鍵即可,當(dāng)想結(jié)束時(shí),點(diǎn)擊字母‘n’或‘N’。</p><p> ?。?)當(dāng)輸入錯(cuò)誤表達(dá)式時(shí),程序會(huì)給出相應(yīng)的提醒。</p><p><b>  參考文獻(xiàn)</b></p><p> ?。?)王昆侖 、李紅主編,數(shù)據(jù)結(jié)構(gòu)與算法,北京:中國(guó)鐵道出版社

51、,2007年5月</p><p> ?。?)阮宏一 、魯靜主編,數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)(C/C++描述),北京:電子工業(yè)出版社,2011年1月</p><p><b>  附錄(源程序):</b></p><p>  #include <malloc.h></p><p>  #include <stdio.

52、h></p><p>  #define MAXSIZE 16</p><p>  typedef struct</p><p><b>  { </b></p><p>  int data[MAXSIZE]; </p><p>  int top;

53、</p><p>  int base; //棧低 </p><p>  }Stack; // 順序棧的定義</p><p><b>  //以下為函數(shù)聲明</b></p><p>  void InitStack(Stack *); //初始化棧 </p><p>  int

54、 Empty(Stack *); //判空棧</p><p>  void Push(Stack *, int ); //進(jìn)棧</p><p>  int Pop(Stack *);//出棧</p><p>  int GetTop(Stack *); //取棧頂元素</p><p>  int Operate(int ,ch

55、ar ,int ); // 計(jì)算結(jié)果</p><p>  char Proceed(char ,char ); // 比較優(yōu)先級(jí)</p><p>  int In(char ); //判斷輸入符</p><p>  int EvalExpres(void); //表達(dá)式計(jì)算函數(shù)</p><p>  // 定義兩個(gè)棧分別存放運(yùn)算符和

56、操作數(shù)</p><p>  Stack StackR,StackD; </p><p>  int main()//主函數(shù)</p><p><b>  { </b></p><p><b>  int v; </b></p><p><b>  char c

57、h;</b></p><p><b>  while(1)</b></p><p><b>  { </b></p><p>  printf("\t************歡迎使用算術(shù)表達(dá)式的求解的小程序************\n"); </p><p>

58、;  v = EvalExpres(); </p><p>  printf("\t表達(dá)式的計(jì)算結(jié)果為:%d",v); </p><p>  printf("\n\tInput 'n' to quit and ENTER run again:");

59、</p><p><b>  do</b></p><p>  { </p><p>  scanf("%c",&ch); </p><p>  if(ch == 'n' || ch == 'N') </p&g

60、t;<p>  exit(0); </p><p>  }while(ch!='\n'); </p><p>  system("cls"); </p><p><b>  }</b></p><p>  return 0; </p><p&

61、gt;<b>  }</b></p><p>  void InitStack(Stack *s) //初始化棧</p><p><b>  { </b></p><p>  s->top = 0; </p><p>  s->base = 0; </p>

62、<p><b>  }</b></p><p>  int Empty(Stack *s)//判斷棧是否為空</p><p><b>  { </b></p><p>  if(s->top ==s->base) </p><p>  retur

63、n 1; //棧空時(shí)返回1,否則返回0 </p><p>  else </p><p><b>  return 0;</b></p><p><b>  } </b></p><p>  void Push(Stack *s, int x) // 進(jìn)棧 </p>

64、<p><b>  { </b></p><p>  if(s->top == MAXSIZE) </p><p><b>  { </b></p><p>  printf("\terror!\n");</p><p>  

65、exit(0); </p><p><b>  } </b></p><p>  else </p><p><b>  { </b></p><p>  s->data[s->top] = x; </p><p> 

66、 s->top++; </p><p><b>  } </b></p><p><b>  } </b></p><p>  int Pop(Stack *s)// 出棧</p><p><b>  { </b></p>

67、<p>  int e; </p><p>  if(Empty(s)) </p><p><b>  { </b></p><p>  printf("\terror!\n"); </p><p>  exit(0); </p&

68、gt;<p><b>  } </b></p><p>  else </p><p><b>  { </b></p><p>  s->top--; </p><p>  e = s->data[s->top];

69、 </p><p>  return e; </p><p><b>  }</b></p><p><b>  } </b></p><p>  int GetTop(Stack *s) //取棧頂元素</p><p><b

70、>  { </b></p><p>  if(Empty(s)) </p><p><b>  { </b></p><p>  printf("\terror!\n"); </p><p>  exit(0); </p>&l

71、t;p><b>  } </b></p><p>  else </p><p>  return s->data[s->top-1]; </p><p><b>  }</b></p><p>  int EvalExpres(void) // 表達(dá)

72、式求解函數(shù)</p><p><b>  { </b></p><p>  int a,b,i=0,s=0; </p><p>  char c[80],r; </p><p>  InitStack(&StackR); </p><p>  Push(&

73、;StackR,'#'); </p><p>  InitStack(&StackD); </p><p>  printf(" \t請(qǐng)輸入表達(dá)式并以‘#’結(jié)束:"); </p><p>  gets(c); </p><p>  while(c[i]!='#

74、' || GetTop(&StackR)!='#') </p><p>  { </p><p>  if(!In(c[i])) //判斷讀入的字符不是運(yùn)算符 是則進(jìn)棧 </p><p>  { if(c[i] >= '0' && c[

75、i] <= '9') </p><p><b>  { </b></p><p>  s += c[i]-'0'; //字符相減將字符型轉(zhuǎn)化為整型 </p><p>  while(!In(c[++i])) //繼續(xù)判斷下

76、一個(gè)字符,若不是運(yùn)算符,表明為多位數(shù),直到讀取到字符為運(yùn)算符為止 </p><p><b>  { </b></p><p>  s*=10; </p><p>  s += c[i]-'0'; </p><p>  }

77、 </p><p>  Push(&StackD,s+'0'); //將整型轉(zhuǎn)化為ascii的形式入棧,使字符在棧內(nèi)以ascii的形式保存,實(shí)現(xiàn)多位數(shù)的計(jì)算 </p><p>  s = 0; //初始化s,繼續(xù)判斷</p><p>  } </p

78、><p>  else </p><p>  { </p><p>  printf("\t你輸入的表達(dá)式有誤!\n"); </p><p>  exit(0); </p><p>

79、  } </p><p><b>  } </b></p><p>  else </p><p>  switch(Proceed(GetTop(&StackR),c[i])) //此函數(shù)用來(lái)比較讀取的運(yùn)算符和棧頂運(yùn)算符的優(yōu)先級(jí)

80、 </p><p>  { </p><p>  case '<': //棧頂?shù)脑貎?yōu)先級(jí)低,當(dāng)前運(yùn)算符入棧 </p><p>  Push(&StackR,c[i]); </p><p>  i++;

81、 </p><p>  break; </p><p>  case '=': </p><p>  Pop(&StackR); </p><p>  i++; </p&

82、gt;<p>  break; </p><p>  case '>': //棧頂?shù)膬?yōu)先級(jí)高則出棧,并將計(jì)算結(jié)果壓入棧內(nèi) </p><p>  r = Pop(&StackR); </p><p>  a = Pop(&St

83、ackD)-'0'; //操作數(shù)在棧內(nèi)以ascii的形式存儲(chǔ),出站后要將ascii轉(zhuǎn)化為整型,然后進(jìn)行運(yùn)算 </p><p>  b = Pop(&StackD)-'0'; </p><p>  Push(&StackD,Operate(a,r,b)) ; &l

84、t;/p><p>  break; </p><p><b>  } </b></p><p><b>  }</b></p><p>  return (GetTop(&StackD)-'0'); // 將棧頂

85、元素轉(zhuǎn)化為整型的形式輸出</p><p><b>  }</b></p><p>  int In(char c) //判斷C是否為運(yùn)算符是返回1否則返回0</p><p><b>  { </b></p><p>  char ch[7]={'+','

86、-','*','/','#','(',')'}; </p><p><b>  int i; </b></p><p>  for(i = 0; i < 7; i++) </p><p>  if(c == ch[i])

87、 </p><p>  return 1; </p><p>  return 0; </p><p><b>  } </b></p><p>  char Proceed(char op,char c) //op為棧頂元素,c為當(dāng)前讀入的運(yùn)算符,比較二者的優(yōu)先級(jí)</p&g

88、t;<p><b>  { </b></p><p>  char ch; </p><p>  if(op=='(' && c==')' || op=='#' && c=='#' ) </p&

89、gt;<p>  ch = '='; </p><p>  else if(op=='+' || op=='-') /*棧頂元素為‘+’或‘-’的時(shí)候*/ </p><p>  switch(c) </p><p><b>  { </b>&

90、lt;/p><p>  case '+': </p><p>  case '-': </p><p>  case ')': </p><p>  case '#': ch = '>'; break;

91、 </p><p>  case '*': </p><p>  case '/': </p><p>  case '(': ch = '<'; </p><p><b>  } </b>&l

92、t;/p><p>  else if(op=='*' || op=='/') /*棧頂元素為‘*’或‘/’的時(shí)候*/ </p><p>  switch(c) </p><p>  { </p><p>  case '+': &l

93、t;/p><p>  case '-': </p><p>  case '*': </p><p>  case '/': </p><p>  case ')': </p><p&g

94、t;  case '#': ch = '>'; break; </p><p>  case '(': ch = '<'; </p><p><b>  } </b></p><p>  else if(op=='(&#

95、39;) /*棧頂元素為‘(’的時(shí)候*/ </p><p>  switch(c) </p><p><b>  { </b></p><p>  case '+': </p><p>  case '-':

96、 </p><p>  case '*': </p><p>  case '/': </p><p>  case '(': ch = '<'; break; </p><p>  case

97、 '#': </p><p>  printf("\tError!沒(méi)有右括號(hào)!\n"); </p><p>  exit(0); </p><p><b>  } </b></p><p>  else if(op==')') //棧頂元

98、素為‘)’的時(shí)候 </p><p>  switch(c) </p><p><b>  { </b></p><p>  case '+': </p><p>  case '-': </p><

99、p>  case '*': </p><p>  case '/': </p><p>  case '#': ch = '>'; break; </p><p>  case '(': </p><p

100、>  printf("\tError!括號(hào)匹配錯(cuò)誤!\n"); </p><p>  exit(0); </p><p><b>  } </b></p><p>  else if(op=='#') //棧頂元素為‘#’的時(shí)候 </p>

101、<p>  switch(c) </p><p><b>  { </b></p><p>  case '+': </p><p>  case '-': </p><p>  case '*'

102、: </p><p>  case '/': </p><p>  case '(': ch = '<'; break; </p><p>  case ')': </p><p>  printf(&quo

103、t;\tError!沒(méi)有左括號(hào)!\n");</p><p>  exit(0); </p><p><b>  } </b></p><p>  return ch; </p><p><b>  } </b></p><p&

104、gt;  int Operate(int a,char a1,int b) </p><p><b>  { </b></p><p><b>  int s; </b></p><p>  int d1 = a; </p><p>  int d2 = b; //把字符ab變

105、為對(duì)應(yīng)數(shù)字 </p><p>  switch(a1) </p><p>  { </p><p>  case '+': </p><p>  s = d1+d2; </p><p>  break; </p><p>  case

106、 '-': </p><p>  s = d2-d1;</p><p>  break; </p><p>  case '*': </p><p>  s = d1*d2; </p><p>  break; </p><p>

107、;  case '/': </p><p><b>  if(d1!=0)</b></p><p><b>  {</b></p><p>  s = d2/d1;}</p><p><b>  else </b></p><p>  

108、{printf("\t除數(shù)不可以為0!\n");</p><p>  exit(0);} </p><p><b>  }</b></p><p>  return (s+'0'); //將運(yùn)算結(jié)果轉(zhuǎn)化為ascii碼的形式入棧, </p><p><b>

溫馨提示

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