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

下載本文檔

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

文檔簡介

1、<p>  課 程 設(shè) 計(jì)</p><p>  課程設(shè)計(jì)名稱: 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) </p><p>  專 業(yè) 班 級 : </p><p>  學(xué) 生 姓 名 : </p><p>  學(xué) 號 :

2、 </p><p>  指 導(dǎo) 教 師 : </p><p>  課程設(shè)計(jì)時(shí)間: </p><p>  計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)課程設(shè)計(jì)任務(wù)書</p><p><b>  1.需求分析</b></

3、p><p>  24點(diǎn)游戲主要有兩個(gè)功能:</p><p>  (1)用戶記算24點(diǎn)</p><p>  程序隨機(jī)產(chǎn)生四個(gè)1-13的數(shù),分別代表4張牌, 提示用戶輸入算式。如果用戶認(rèn)為程序給出的一組數(shù)字不能算出24點(diǎn)(如1,1,2,2),則輸入‘?’,然后程序?qū)λ膫€(gè)數(shù)字進(jìn)行計(jì)算,如果真的不能算出24點(diǎn),則輸出用戶正確的信息,否則給出一個(gè)正確的算式,并顯示用戶錯(cuò)誤的信息。

4、</p><p>  (2).程序計(jì)算24點(diǎn)</p><p>  用戶輸入四個(gè)1-13的數(shù),代表4張牌,程序需要通過一定的規(guī)則添加括號和運(yùn)算符來使算式的值等于24,如果用戶給出的四個(gè)數(shù)字不能算出24點(diǎn),則輸出錯(cuò)誤信息!</p><p><b>  2.概要設(shè)計(jì)</b></p><p><b>  抽象數(shù)據(jù)結(jié)構(gòu)定

5、義:</b></p><p><b>  ADT{</b></p><p>  數(shù)據(jù)對象:D={a|a為大于0小于14的整數(shù)}</p><p>  push(sqstack *s,int e) //壓棧</p><p>  gettop(sqstack *s) //取得棧頂元素</p>&l

6、t;p>  pop(sqstack *s,int *e) //出棧</p><p>  randomm() //產(chǎn)生四個(gè)隨機(jī)數(shù)</p><p>  EvaluateExpression(char* MyExpression) </p><p>  //課本算法3.4---計(jì)算表達(dá)式的值</p><p>  init_sq(sqlis

7、t *l) //初始化鏈表</p><p>  insert_sq(sqlist **p,int e,int bl) //鏈表插入操作</p><p>  chang(char *s,sqlist *l) //將用戶的輸入轉(zhuǎn)化為單鏈表</p><p>  check(sqlist l) //保證輸入的數(shù)字是給出的四個(gè)數(shù)字</p><p&g

8、t;  Operate(int a,int theta, int b) //計(jì)算</p><p>  precede(char Aop, char Bop) //求運(yùn)算符優(yōu)先級</p><p>  ReturnOpOrd(char op,char* TestOp) //返回運(yùn)算符優(yōu)先級</p><p>  CalcOneExpress(int expressi

9、on[][2])</p><p>  //課本算法3.4--計(jì)算表達(dá)式的值</p><p>  Calc24(int number[2][4])</p><p>  //包含下面五個(gè)函數(shù),即表達(dá)式的五種形式</p><p>  CalcArray1(int iNumInput[2][4])</p><p>  // a

10、 * b * c * d //7 個(gè)字符</p><p>  CalcArray2(int iNumInput[2][4])</p><p>  // (a * b) * c * d //9 number</p><p>  CalcArray3(int iNumInput[2][4])</p><p>  // (a * b * c)

11、 * d //9 number</p><p>  CalcArray4(int iNumInput[2][4])</p><p>  // (a * b) * (c * d) //11 numbers</p><p>  CalcArray5(int iNumInput[2][4])</p><p>  // ((a * b) * c

12、) * d //11 numbers</p><p>  Equal24(int n) //判定結(jié)果是否等于24</p><p>  gameinformation() //游戲介紹</p><p>  menu() //菜單</p><p>  main() //主函數(shù)</p><p><b> 

13、 }ADT</b></p><p><b>  模塊劃分</b></p><p><b>  3 運(yùn)行環(huán)境</b></p><p><b>  硬件環(huán)境:PC機(jī)</b></p><p>  軟件環(huán)境:Windows XP</p><p>  

14、Microsoft Visual C++ 6.0</p><p>  4 開發(fā)工具和編程語言</p><p>  開發(fā)工具:Microsoft Visual C++ 6.0 </p><p><b>  編程語言:C語言</b></p><p><b>  5 詳細(xì)設(shè)計(jì)</b></p>

15、<p> ?。?)全局變量和棧,鏈表的定義</p><p>  int number[2][4];</p><p><b>  enum{</b></p><p>  eNumber = 0,//操作數(shù)</p><p>  eOperator = 1//算子</p><p><b

16、>  };</b></p><p>  int oper[7]={43,45,42,47,40,41,35};</p><p>  課本 表3.1 算符間的優(yōu)先關(guān)系:</p><p>  unsigned char Prior[7][7] = {</p><p>  '>','>'

17、,'<','<','<','>','>',</p><p>  '>','>','<','<','<','>','>',</p><

18、p>  '>','>','>','>','<','>','>',</p><p>  '>','>','>','>','<','>&

19、#39;,'>',</p><p>  '<','<','<','<','<','=',' ',</p><p>  '>','>','>','>&

20、#39;,' ','>','>',</p><p>  '<','<','<','<','<',' ','='</p><p><b>  };</b></p&g

21、t;<p><b>  線性表的定義:</b></p><p>  typedef struct sqlist{ </p><p>  int bol; //bol是0時(shí),num-ch是數(shù)字;bol是1時(shí)num_ch是運(yùn)算符</p><p>  int num_ch;</p><p>  struct s

22、qlist *next;</p><p><b>  }sqlist;</b></p><p><b>  棧的定義:</b></p><p>  typedef struct sqstack{ </p><p>  int *base;</p><p><b> 

23、 int *top;</b></p><p>  int stacksize;</p><p>  }sqstack; </p><p> ?。?)main()函數(shù)及用戶界面</p><p>  void main(){</p><p>  gameinformation(); //輸出作者信息</

24、p><p>  menu(); //輸出功能菜單,游戲開始</p><p><b>  }</b></p><p>  用戶界面如 圖1 所示。</p><p>  (3)由程序計(jì)算24點(diǎn)的算法分析:</p><p>  用戶輸入四個(gè)1-13的數(shù),代表4張牌,程序算24點(diǎn)。這要考慮到各種情況。首先是

25、加入括號,有以下5種可能的形式:</p><p>  . a b c d</p><p>  . (a b) c d</p><p>  同 a b (c d) 和 a (b c) d</p><p>  . (a b c) d</p><p>  . (a

26、 b) (c d)</p><p>  . ( (a b) c) d</p><p>  同 (a (b c)) d</p><p>  然后根據(jù)上述 5 種情況加入運(yùn)算符。</p><p>  對于每種不同的算式形式,先在固定的位置加入括號。程序通過4層循環(huán)對四個(gè)數(shù)字進(jìn)行賦值,并對循環(huán)加以控制,使每個(gè)數(shù)字只用一次,

27、然后再通過三層循環(huán)對三個(gè)位置的運(yùn)算符賦值。每一次循環(huán)都會(huì)產(chǎn)生一個(gè)數(shù)組,別調(diào)用下面的CalcOneExpress函數(shù)求算式的值!結(jié)果可能算出24點(diǎn),或者算不出24點(diǎn) (如圖2,圖3)。</p><p>  以下兩段代碼是對針對第一種形式的算式求24點(diǎn)。過程為:對四個(gè)數(shù)字和三個(gè)運(yùn)算符賦值(CalcArray1(int iNumInput[2][4]))----計(jì)算算式的值(CalcOneExpress(int exp

28、ression[][2]))---驗(yàn)證是否等于24---輸出結(jié)果:</p><p><b>  代碼1. </b></p><p>  // a * b * c * d7 個(gè)字符</p><p>  int CalcArray1(int iNumInput[2][4])</p><p><b>  {<

29、/b></p><p>  int expression[8][2],ii,jj,kk;</p><p>  int i,j,k,l,dRes;</p><p>  for(i=0;i<4;i++)</p><p><b>  {</b></p><p>  for(j=0;j<

30、4;j++)</p><p><b>  {</b></p><p>  if(j==i) continue;</p><p>  for(k=0;k<4;k++)</p><p><b>  {</b></p><p>  if(k==i||k==j) conti

31、nue;</p><p>  for(l=0;l<4;l++)</p><p><b>  {</b></p><p>  if(l==i||l==j||l==k) continue;</p><p>  expression[0][0]=iNumInput[0][i];</p><p>

32、  expression[2][0]=iNumInput[0][j];</p><p>  expression[4][0]=iNumInput[0][k];</p><p>  expression[6][0]=iNumInput[0][l];</p><p>  expression[0][1]=eNumber;</p><p>  ex

33、pression[2][1]=eNumber;</p><p>  expression[4][1]=eNumber;</p><p>  expression[6][1]=eNumber;</p><p>  for (ii=0;ii<4;ii++)</p><p><b>  {</b></p>

34、<p>  for (jj=0;jj<4;jj++)</p><p><b>  {</b></p><p>  for (kk=0;kk<4;kk++)</p><p><b>  {</b></p><p>  expression[1][0] = oper[ii];<

35、;/p><p>  expression[1][1] = eOperator;</p><p>  expression[3][0] = oper[jj];</p><p>  expression[3][1] = eOperator;</p><p>  expression[5][0] = oper[kk];</p><p

36、>  expression[5][1] = eOperator;</p><p>  expression[7][0] = oper[6];</p><p>  expression[7][1] = eOperator;</p><p>  dRes = CalcOneExpress(expression);</p><p>  //

37、對每一個(gè)算式求值,直到算出24點(diǎn)</p><p>  if(Equal24(dRes))</p><p>  //判定表達(dá)式的值是否為24</p><p><b>  {</b></p><p>  printf("可以這樣運(yùn)算:%d%c%d%c%d%c%d\n",expression[0][0],o

38、per[ii],</p><p>  expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]);</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><

39、b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>

40、  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  代碼2.</b></p><p>  //課本算法3.4---計(jì)算 算式的值</p><p>  in

41、t CalcOneExpress(int expression[][2])</p><p><b>  {</b></p><p>  // 算術(shù)表達(dá)式求值的算符優(yōu)先算法。</p><p>  // 設(shè)OPTR和&&OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧,OP為運(yùn)算符集合。</p><p>  int inde

42、x=0,result,c,theta,a,b;</p><p>  sqstack OPTR; // 運(yùn)算符棧,字符元素</p><p>  sqstack OPND; // 運(yùn)算數(shù)棧,實(shí)數(shù)元素</p><p>  initstack(&OPTR);</p><p>  push(&OPTR, 35);</p&g

43、t;<p>  initstack (&OPND);</p><p>  c=expression[index][0];</p><p>  while (c!= 35 || gettop(&OPTR)!=35)</p><p><b>  {</b></p><p>  if(expres

44、sion[index][1]!=1)</p><p><b>  {</b></p><p>  push(&OPND, c);</p><p><b>  index++;</b></p><p>  c=expression[index][0];</p><p>

45、  } // 不是運(yùn)算符則進(jìn)棧</p><p><b>  else</b></p><p><b>  {</b></p><p>  switch ( precede((char)gettop(&OPTR), (char)c) )</p><p><b>  {</b&g

46、t;</p><p>  case '<': // 棧頂元素優(yōu)先權(quán)低</p><p>  push(&OPTR, c);</p><p><b>  index++;</b></p><p>  c=expression[index][0];</p><p>&l

47、t;b>  break;</b></p><p>  case '=': // 脫括號并接收下一字符</p><p>  pop(&OPTR, &c); </p><p><b>  index++;</b></p><p>  c=expression[index]

48、[0]; </p><p><b>  break;</b></p><p>  case '>': // 退棧并將運(yùn)算結(jié)果入棧</p><p>  pop(&OPTR, &theta);</p><p>  pop(&OPND, &b); </p>

49、<p>  pop(&OPND, &a);</p><p>  push(&OPND, Operate(a, theta, b));</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  pri

50、ntf("沒有這個(gè)運(yùn)算符\n");</p><p><b>  return 0;</b></p><p>  } // switch</p><p><b>  }//else</b></p><p>  } // while</p><p>  res

51、ult=gettop(&OPND);</p><p>  return result;</p><p>  } // end CalcOneExpress</p><p> ?。?)由用戶計(jì)算24點(diǎn)的算法分析:</p><p>  先由程序產(chǎn)生4個(gè)隨機(jī)數(shù);</p><p>  int randomm()<

52、/p><p><b>  {</b></p><p><b>  int i=0;</b></p><p>  srand((unsigned)time(NULL));</p><p>  for(;i<4;i++){</p><p>  number[0][i]=0;&l

53、t;/p><p>  number[0][i]=rand();</p><p>  number[0][i]%=13;</p><p>  number[0][i]++;</p><p>  number[1][i]=0;</p><p><b>  }</b></p><p>

54、;  return number[2][4];</p><p><b>  }</b></p><p><b>  用戶判定</b></p><p>  如果用戶認(rèn)為程序產(chǎn)生的四個(gè)隨機(jī)數(shù)不能算出24點(diǎn)則輸入‘?’,程序接收到該字符后,則進(jìn)行步驟(3)的操作,如果真的不能算出24點(diǎn),則輸出用戶正確的信息,否者輸出用戶錯(cuò)誤的信

55、息,并輸出一個(gè)正確的算式。(請看圖4,圖5,圖6)</p><p>  如果用戶認(rèn)為可以算出24點(diǎn),則輸入算式,程序?qū)Υ怂闶角笾?,若結(jié)果為24,程序輸出用戶正確的信息,否則輸出用戶錯(cuò)誤的信息。</p><p>  此過程中,程序先將用戶輸入的算式轉(zhuǎn)化成單鏈表的形式,其功能和步驟(2)中的數(shù)組是基本一樣的。然后檢驗(yàn)用戶輸入的算式中是否有非法字符,若有這輸出錯(cuò)誤信息并結(jié)束;若沒有則計(jì)算算式的值

56、,驗(yàn)證是否等于24,并輸出正確或錯(cuò)誤的信息!</p><p><b>  部分重要代碼:</b></p><p><b>  代碼1.</b></p><p>  算法 3.4 計(jì)算表達(dá)式的值:</p><p>  EvaluateExpression(char* MyExpression) <

57、;/p><p><b>  {</b></p><p>  // 算術(shù)表達(dá)式求值的算符優(yōu)先算法。</p><p>  // 設(shè)OPTR和&&OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧</p><p>  int result;</p><p>  sqstack OPTR; // 運(yùn)算符

58、棧,字符元素</p><p>  sqstack OPND; // 運(yùn)算數(shù)棧,實(shí)數(shù)元素</p><p>  int c,bl,a,b,theta,top;</p><p>  sqlist *q,l;</p><p>  char *s=MyExpression;</p><p>  init_sq(&

59、;l);</p><p>  if(chang(s,&l)!=0)//將表達(dá)式轉(zhuǎn)為鏈表</p><p><b>  {</b></p><p><b>  q=&l;</b></p><p>  initstack(&OPTR);</p><p>  

60、push(&OPTR, 35);</p><p>  initstack (&OPND);</p><p>  q=q->next;</p><p>  c=q->num_ch;</p><p>  bl=q->bol;</p><p>  while ((c!= 35 || gett

61、op(&OPTR)!=35)){</p><p>  if (bl!=1){</p><p>  push(&OPND, c);</p><p>  q=q->next;</p><p>  c=q->num_ch;</p><p>  bl=q->bol;</p>&l

62、t;p>  } // 不是運(yùn)算符則進(jìn)棧</p><p><b>  else{</b></p><p>  top=gettop(&OPTR);</p><p>  switch (precede((char)top, (char)c)){</p><p>  case '<':

63、// 棧頂元素優(yōu)先權(quán)低</p><p>  push(&OPTR, c);</p><p>  q=q->next;</p><p>  c=q->num_ch;</p><p>  bl=q->bol;</p><p><b>  break;</b></p>

64、;<p>  case '=': // 脫括號并接收下一字符</p><p>  pop(&OPTR, &c);</p><p>  q=q->next;</p><p>  c=q->num_ch;</p><p>  bl=q->bol;</p><p

65、><b>  break;</b></p><p>  case '>': // 退棧并將運(yùn)算結(jié)果入棧</p><p>  pop(&OPTR, &theta);</p><p>  pop(&OPND, &b);</p><p>  pop(&OP

66、ND, &a);</p><p>  push(&OPND, Operate(a, theta, b));</p><p><b>  break;</b></p><p><b>  default :</b></p><p>  printf("沒有這個(gè)運(yùn)算符!\n&q

67、uot;);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  result=gett

68、op(&OPND);</p><p>  return result;</p><p><b>  }</b></p><p><b>  else {</b></p><p>  printf("你的輸入有錯(cuò)誤!\n");</p><p><

69、;b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  代碼2. </b></p><p>  將用戶的輸入轉(zhuǎn)化為單鏈表:</p><p>  i

70、nt chang(char *s,sqlist *l){ </p><p><b>  int t=0;</b></p><p>  unsigned int i=0;</p><p>  int bl,ch;</p><p>  int a1,a2,a;</p><p>  sqlist *p=

71、l;</p><p>  for (;i<strlen(s);i++)</p><p><b>  {</b></p><p>  if(s[i]>47&&s[i]<58&&t==0){</p><p>  a1=(int)s[i]-48;</p><

72、p><b>  t++;</b></p><p><b>  }</b></p><p>  else if(s[i]>47&&s[i]<58&&t==1){</p><p>  a2=(int)s[i]-48;</p><p>  a=a1*10+

73、a2;</p><p><b>  t++;</b></p><p><b>  }</b></p><p>  else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){</p><p><b>

74、;  if(t==1){</b></p><p><b>  bl=0;</b></p><p>  insert_sq(&p,a1,bl);</p><p><b>  t=0;</b></p><p><b>  }</b></p><

75、;p>  else if(t==2){</p><p><b>  bl=0;</b></p><p>  insert_sq(&p,a,bl);</p><p><b>  t=0;</b></p><p><b>  }</b></p><

76、p><b>  bl=1;</b></p><p>  ch=(int)s[i];</p><p>  insert_sq(&p,ch,bl);</p><p><b>  t=0;</b></p><p><b>  }</b></p><p

77、><b>  else {</b></p><p>  printf("%c不是有效的運(yùn)算符!\n",s[i]);</p><p><b>  }</b></p><p><b>  }</b></p><p>  i=strlen(s)-1;<

78、/p><p>  if(s[i]>47&&s[i]<58){</p><p>  if(s[i-1]>47&&s[i-1]<58){</p><p><b>  bl=0;</b></p><p>  insert_sq(&p,a,bl);</p>

79、<p><b>  }</b></p><p><b>  else {</b></p><p><b>  bl=0;</b></p><p>  insert_sq(&p,a1,bl);</p><p><b>  }</b><

80、;/p><p><b>  }</b></p><p><b>  bl=1;</b></p><p><b>  a=35;</b></p><p>  insert_sq(&p,a,bl);</p><p>  return (check(*l)

81、);</p><p><b>  }</b></p><p><b>  代碼3. </b></p><p><b>  鏈表插入操作:</b></p><p>  int insert_sq(sqlist **p,int e,int bl){ </p><

82、p>  sqlist *q;</p><p>  q=(sqlist*)malloc(sizeof(sqlist));</p><p>  q->num_ch=e;</p><p>  q->bol=bl;</p><p>  q->next=NULL;</p><p>  (*p)->n

83、ext=q;</p><p>  (*p)=(*p)->next;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  6.調(diào)式分析</b></p><p>  1.在解決某一

84、個(gè)問題之前一定要把算法想清楚,考慮到全局,以免造成大量不必要的改動(dòng)。</p><p>  2.用scanf輸入數(shù)據(jù)時(shí),一定要注意格式,否則就會(huì)出錯(cuò)!</p><p>  3.在函數(shù)調(diào)用時(shí),參數(shù)類型一定要一致,否者會(huì)產(chǎn)生警告信息,甚至導(dǎo)致結(jié)果出錯(cuò)。</p><p>  4.如果不使用time函數(shù),則產(chǎn)生的隨機(jī)數(shù)是重復(fù)出現(xiàn)的。</p><p> 

85、 5.用戶輸入的算式,也可以轉(zhuǎn)化為數(shù)組進(jìn)行操作,但算式的形式不確定,轉(zhuǎn)化為鏈表似乎省去了很多麻煩。</p><p>  6.剛開始沒有對CalcArray(int iNumInput[2][4])函數(shù)中的循環(huán)加以控制,結(jié)果造成數(shù)字重復(fù)使用。</p><p>  7.在單鏈表形成之后,在其中取數(shù)據(jù)元素,要從q->next開始,其頭結(jié)點(diǎn)中不含要用的數(shù)據(jù),應(yīng)跳過,否則結(jié)果不可預(yù)料。<

86、/p><p>  8.如果想通過調(diào)用函數(shù)來改變幾個(gè)變量的值,那么用指針應(yīng)該是很方便的。</p><p>  9.要改變指針值,需要使用二級指針</p><p>  10.由于在C語言中函數(shù)都是全局作用域的,因此不要使用和庫中的函數(shù)名相同的標(biāo)識符,否則會(huì)出現(xiàn)錯(cuò)誤。包括宏標(biāo)識符也有這樣的問題。</p><p><b>  7.測試結(jié)果圖&l

87、t;/b></p><p><b> ?。?)用戶界面</b></p><p><b>  圖1</b></p><p> ?。?)用戶輸入數(shù)據(jù),程序算出結(jié)果</p><p><b>  圖2</b></p><p> ?。?)用戶輸入的數(shù)據(jù)算不出

88、24點(diǎn)</p><p><b>  圖3</b></p><p>  (4)程序給出數(shù)字,用戶認(rèn)為算不出24點(diǎn)</p><p><b>  圖4</b></p><p><b> ?。?)用戶計(jì)算出錯(cuò)</b></p><p><b>  圖5&

89、lt;/b></p><p> ?。?)程序給出數(shù)字,用戶算出正確結(jié)果</p><p><b>  圖6</b></p><p><b>  8.參考文獻(xiàn)</b></p><p>  1 張鳳琴,張青鳳.數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)指導(dǎo)與習(xí)題詳解,清華大學(xué)出版社,2007</p><p&g

90、t;  2 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu)(C語言版). 清華大學(xué)出版社,2008</p><p>  3 潭浩強(qiáng).C語言程序設(shè)計(jì)(第三版). 清華大學(xué)出版社,2005</p><p>  4 潭浩強(qiáng).C語言程序設(shè)計(jì)題解與上機(jī)指導(dǎo)(第三版). 清華大學(xué)出版社,2005</p><p>  5張 曼,朱小谷,呂士俊.數(shù)據(jù)結(jié)構(gòu)習(xí)題與解答 . 北京希望電子出版社.2005<

91、;/p><p><b>  課程設(shè)計(jì)總結(jié)</b></p><p>  源代碼:(此為可運(yùn)行的源代碼直接復(fù)制粘貼過來的,如直接復(fù)制不能運(yùn)行,可粘貼到文本中進(jìn)行字符過濾,然后自粘貼到編譯器中)</p><p>  #include<stdio.h></p><p>  #include<string.h>

92、</p><p>  #include<stdlib.h></p><p>  #include<time.h></p><p>  #define OPSETSIZE 7</p><p>  #define STACK_INIF_SIZE 50</p><p>  #define STACKI

93、NCREMENT 10</p><p>  int number[2][4];</p><p><b>  enum</b></p><p><b>  {</b></p><p>  eNumber = 0,//操作數(shù)</p><p>  eOperator = 1//

94、算子</p><p><b>  };</b></p><p>  int oper[7]={43,45,42,47,40,41,35};</p><p>  char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , &

95、#39;)' , '#'};</p><p>  typedef struct sqlist{</p><p>  int bol;//bol 是 0 時(shí),num-ch是一個(gè)數(shù)字;bol 是 1 時(shí) num_ch 運(yùn)算符</p><p>  int num_ch;</p><p>  struct sqlist *ne

96、xt;</p><p>  }sqlist;//線性表</p><p>  typedef struct sqstack{</p><p>  int *base;</p><p><b>  int *top;</b></p><p>  int stacksize;</p>&l

97、t;p>  }sqstack;//棧的定義</p><p>  unsigned char Prior[7][7] = {// 課本 表3.1 算符間的優(yōu)先關(guān)系</p><p>  '>','>','<','<','<','>','>

98、9;,</p><p>  '>','>','<','<','<','>','>',</p><p>  '>','>','>','>','&

99、lt;','>','>',</p><p>  '>','>','>','>','<','>','>',</p><p>  '<','<',

100、'<','<','<','=',' ',</p><p>  '>','>','>','>',' ','>','>',</p><p>  

101、9;<','<','<','<','<',' ','='</p><p><b>  };</b></p><p>  int init_sq(sqlist *l){//初始化鏈表</p><p>  l=(sq

102、list*)malloc(sizeof(sqlist));</p><p>  if(l==NULL){</p><p><b>  exit(-2);</b></p><p><b>  }</b></p><p>  l->next=NULL;</p><p>&l

103、t;b>  return 1;</b></p><p><b>  }</b></p><p>  int insert_sq(sqlist **p,int e,int bl){//鏈表插入操作</p><p>  sqlist *q;</p><p>  q=(sqlist*)malloc(sizeo

104、f(sqlist));</p><p>  q->num_ch=e;</p><p>  q->bol=bl;</p><p>  q->next=NULL;</p><p>  (*p)->next=q;</p><p>  (*p)=(*p)->next;</p><

105、;p><b>  return 1;</b></p><p><b>  }</b></p><p>  int check(sqlist l)//保證輸入的數(shù)字是給出的四個(gè)數(shù)字</p><p><b>  {</b></p><p>  int right=1,find

106、=0,i;</p><p>  sqlist *q=&l;</p><p>  q=q->next ;</p><p>  for (;q->next!=NULL;q=q->next){</p><p>  if(q->bol==1){</p><p>  if(q->num_ch

107、 <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){</p><p><b>  right=0;</b></p><p>  printf("%c不是有效的運(yùn)算符!\n");</p><p><b>  }</b><

108、/p><p><b>  }</b></p><p><b>  else {</b></p><p><b>  find=0;</b></p><p>  for(i=0;i<4;i++){</p><p>  if(number[1][i]==0

109、&&number[0][i]==q->num_ch ){</p><p>  number[1][i]=1;</p><p><b>  find=1;</b></p><p><b>  break;</b></p><p><b>  }</b><

110、;/p><p><b>  }</b></p><p>  if(find==0){</p><p>  printf("%d 不在給出的四個(gè)數(shù)字中!\n",q->num_ch );</p><p><b>  right=0;</b></p><p>

111、<b>  }</b></p><p><b>  }</b></p><p>  }//end for</p><p>  for (i=0;i<4;i++){</p><p>  if(number[1][i]==0){</p><p>  printf("

112、;%d沒有用上!\n",number[0][i]);</p><p><b>  right=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  return right;</p><p

113、><b>  }</b></p><p>  int chang(char *s,sqlist *l){//將用戶的輸入轉(zhuǎn)化為單鏈表</p><p><b>  int t=0;</b></p><p>  unsigned int i=0;</p><p>  int bl,ch;</

114、p><p>  int a1,a2,a;</p><p>  sqlist *p=l;</p><p>  for (;i<strlen(s);i++)</p><p><b>  {</b></p><p>  if(s[i]>47&&s[i]<58&&am

115、p;t==0){</p><p>  a1=(int)s[i]-48;</p><p><b>  t++;</b></p><p><b>  }</b></p><p>  else if(s[i]>47&&s[i]<58&&t==1){</p&

116、gt;<p>  a2=(int)s[i]-48;</p><p>  a=a1*10+a2;</p><p><b>  t++;</b></p><p><b>  }</b></p><p>  else if(s[i]<48&&s[i]>39&

117、;&s[i]!=44&&s[i]!=46){</p><p><b>  if(t==1){</b></p><p><b>  bl=0;</b></p><p>  insert_sq(&p,a1,bl);</p><p><b>  t=0;</

118、b></p><p><b>  }</b></p><p>  else if(t==2){</p><p><b>  bl=0;</b></p><p>  insert_sq(&p,a,bl);</p><p><b>  t=0;</b

119、></p><p><b>  }</b></p><p><b>  bl=1;</b></p><p>  ch=(int)s[i];</p><p>  insert_sq(&p,ch,bl);</p><p><b>  t=0;</b&

120、gt;</p><p><b>  }</b></p><p><b>  else {</b></p><p>  printf("%c不是有效的運(yùn)算符!\n",s[i]);</p><p><b>  }</b></p><p>

121、  } //end for</p><p>  i=strlen(s)-1;</p><p>  if(s[i]>47&&s[i]<58){</p><p>  if(s[i-1]>47&&s[i-1]<58){</p><p><b>  bl=0;</b>&

122、lt;/p><p>  insert_sq(&p,a,bl);</p><p><b>  }</b></p><p><b>  else {</b></p><p><b>  bl=0;</b></p><p>  insert_sq(&

123、;p,a1,bl);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  bl=1;</b></p><p><b>  a=35;</b></p><p>  insert_

124、sq(&p,a,bl);</p><p>  return (check(*l));</p><p><b>  }</b></p><p>  int Operate(int a,int theta, int b){//計(jì)算</p><p>  switch(theta) {</p><p&

125、gt;  case 43: return a+b;</p><p>  case 45: return a-b;</p><p>  case 42: return a*b;</p><p><b>  case 47:</b></p><p><b>  {</b></p><

126、p><b>  if(b==0){</b></p><p>  return -2000;</p><p><b>  }</b></p><p>  if (a%b==0){</p><p>  return a/b;</p><p><b>  }<

127、/b></p><p>  else {//printf("不能為小數(shù)\n");</p><p>  return -10000;</p><p><b>  }</b></p><p><b>  }</b></p><p>  default :

128、 return 0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  int ReturnOpOrd(char op,char* TestOp)// precede()函數(shù)調(diào)用求優(yōu)先級</p><p><b>  {</b>&

129、lt;/p><p><b>  int i;</b></p><p>  for(i=0; i< OPSETSIZE; i++)</p><p><b>  {</b></p><p>  if (op == TestOp[i]) return i;</p><p><

130、;b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  char precede(char Aop, char Bop)</p><p><b>  {</b></p>

131、;<p>  return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];</p><p><b>  }</b></p><p>  int initstack(sqstack *s)</p><p><b>  {</b></p>

132、<p>  (s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));</p><p>  if((s)->base==NULL) exit(-2);</p><p>  (s)->top=(s)->base;</p><p>  (s)->stacksize = STACK

133、_INIF_SIZE;</p><p>  return 1;</p><p><b>  }</b></p><p>  int gettop(sqstack *s){ //取得棧頂元素</p><p><b>  int e;</b></p><p>  if(s-&g

134、t;top==s->base){</p><p>  printf("???無法取得棧頂元素!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  e=*(s->top-1);</p>

135、;<p><b>  return e;</b></p><p><b>  }</b></p><p>  int push(sqstack *s,int e){ //壓棧</p><p>  if(s->top-s->base>=s->stacksize)</p>

136、<p><b>  {</b></p><p>  s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));</p><p>  if(!s->base) exit(-2);</p><p>  s->stacks

137、ize+= STACKINCREMENT;</p><p><b>  }</b></p><p>  *(s->top++)=e;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p> 

138、 int pop(sqstack *s,int *e){ //出棧</p><p>  if(s->top==s->base)</p><p><b>  {</b></p><p>  printf("???出棧錯(cuò)誤!\n");</p><p><b>  return 0;

139、</b></p><p><b>  }</b></p><p>  *e=*(--s->top);</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  int Evalu

140、ateExpression(char* MyExpression) { // 算法3.4----計(jì)算表達(dá)式的值</p><p>  // 算術(shù)表達(dá)式求值的算符優(yōu)先算法。</p><p>  // 設(shè)OPTR和&&OPND分別為運(yùn)算符棧和運(yùn)算數(shù)棧</p><p>  int result;</p><p>  sqstack

141、 OPTR; // 運(yùn)算符棧,字符元素</p><p>  sqstack OPND; // 運(yùn)算數(shù)棧,實(shí)數(shù)元素</p><p>  int c,bl,a,b,theta,top;</p><p>  sqlist *q,l;</p><p>  char *s=MyExpression;</p><p&g

142、t;  init_sq(&l);</p><p>  if(chang(s,&l)!=0){</p><p><b>  q=&l;</b></p><p>  initstack(&OPTR);</p><p>  push(&OPTR, 35);</p><

143、p>  initstack (&OPND);</p><p>  q=q->next;</p><p>  c=q->num_ch;</p><p>  bl=q->bol;</p><p>  while ((c!= 35 || gettop(&OPTR)!=35)){</p><

144、p>  if (bl!=1){</p><p>  push(&OPND, c);</p><p>  q=q->next;</p><p>  c=q->num_ch;</p><p>  bl=q->bol;</p><p>  } // 不是運(yùn)算符則進(jìn)棧</p>&l

145、t;p><b>  else{</b></p><p>  top=gettop(&OPTR);</p><p>  switch (precede((char)top, (char)c)){</p><p>  case '<': // 棧頂元素優(yōu)先權(quán)低</p><p>  push

146、(&OPTR, c);</p><p>  q=q->next;</p><p>  c=q->num_ch;</p><p>  bl=q->bol;</p><p><b>  break;</b></p><p>  case '=': // 脫

147、括號并接收下一字符</p><p>  pop(&OPTR, &c);</p><p>  q=q->next;</p><p>  c=q->num_ch;</p><p>  bl=q->bol;</p><p><b>  break;</b></p&

148、gt;<p>  case '>': // 退棧并將運(yùn)算結(jié)果入棧</p><p>  pop(&OPTR, &theta);</p><p>  pop(&OPND, &b);</p><p>  pop(&OPND, &a);</p><p>  pus

149、h(&OPND, Operate(a, theta, b));</p><p><b>  break;</b></p><p><b>  default :</b></p><p>  printf("沒有這個(gè)運(yùn)算符!\n");</p><p><b>  

150、return 0;</b></p><p>  } // switch</p><p><b>  }//else</b></p><p>  } // while</p><p>  result=gettop(&OPND);</p><p>  return result;

151、</p><p><b>  }</b></p><p><b>  else {</b></p><p>  printf("你的輸入有錯(cuò)誤!\n");</p><p><b>  return 0;</b></p><p><

溫馨提示

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

最新文檔

評論

0/150

提交評論