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

下載本文檔

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

文檔簡介

1、<p><b>  目 錄</b></p><p><b>  一.概述2</b></p><p>  二.總體方案設(shè)計3</p><p><b>  三.詳細設(shè)計4</b></p><p>  四.程序的調(diào)試與運行結(jié)果說明5</p><

2、p>  五.課程設(shè)計總結(jié)6</p><p><b>  參考文獻7</b></p><p>  附錄..................................................................................................................................

3、...............8</p><p><b>  一 概述</b></p><p>  一、課程設(shè)計的目的與要求</p><p>  本課程設(shè)計是為了配合《數(shù)據(jù)結(jié)構(gòu)》課程的開設(shè),通過設(shè)計一個完整的程序,使學(xué)生掌握數(shù)據(jù)結(jié)構(gòu)的應(yīng)用,算法的編寫,類C語言的算法轉(zhuǎn)換成C程序并用Turbo C2.0或Visual C++6.0上機調(diào)試的基本方

4、法。要求如下: 1.要充分認識課程設(shè)計對自己的重要性,認真做好課程設(shè)計前的各項準備工作。 2.既要虛心接受老師的指導(dǎo),又要充分發(fā)揮主觀能動性.結(jié)合課題,獨立思考,努力鉆研,勤于實踐,勇于創(chuàng)新。 3.獨立按時完成規(guī)定的工作任務(wù),不得弄虛作假,不準抄襲他人內(nèi)容,否則成績以不及格計。 4.課程設(shè)計期間,無故缺席按曠課處理;缺席時間達四分之一以上者,其成績按不及格處理。 5.在設(shè)計過程中,要嚴格要求自己,樹立嚴肅,

5、嚴密,嚴謹?shù)目茖W(xué)態(tài)度,必須按時,按質(zhì),按量完成課程設(shè)計。 6.小組成員之間,分工明確,但要保持聯(lián)系暢通,密切合作,培養(yǎng)良好的互相幫助和團隊協(xié)作精神。</p><p><b>  二、需求分析</b></p><p>  本課程設(shè)計的課題為表達式求值,要求:</p><p>  1.用戶將表達式原樣輸入(在表達式結(jié)尾加上#),能得出結(jié)果(為

6、減小難度,運算結(jié)果的10進制形式的值,不超過longdouble的存儲范圍);</p><p>  2.輸入的數(shù)可以為小數(shù)(為減小難度,小數(shù)的整數(shù)與小數(shù)部分均不超過10位),負數(shù)(如果負數(shù)前有運算符,則應(yīng)將負數(shù)括起來),以及2進制,8進制,10進制,16進制的數(shù)(為減小難度,數(shù)出的結(jié)果都以10進制形式表示);</p><p>  3.運算符號包括()、+、—、*、/;括號可以多重;<

7、/p><p><b>  二 總體方案設(shè)計</b></p><p>  1.使用雙鏈表的數(shù)據(jù)結(jié)構(gòu)表示數(shù)據(jù)的存儲,將用戶輸入的表達式以字符形式存入雙鏈表中。</p><p>  2.對以負數(shù)開頭、以括號開頭、左括號后緊跟負數(shù)的特殊情況作處理。</p><p>  3.將數(shù)與運算符分開;</p><p>

8、  4.依次找到表達式最內(nèi)層括號,次內(nèi)層括號..................每次找到括號內(nèi)的表達式,便將其進行只有 加減乘除運算的計算。</p><p><b>  結(jié)構(gòu)體類型:</b></p><p>  //用來存儲字符的結(jié)點類型</p><p>  typedef struct CharNode</p><p>

9、;<b>  {</b></p><p><b>  char c;</b></p><p>  struct CharNode *next;</p><p>  }CharNode;</p><p>  //用來存儲數(shù)的結(jié)點類型</p><p>  typedef stru

10、ct IntNode</p><p><b>  {</b></p><p>  long double i;</p><p>  struct IntNode *next;</p><p><b>  }IntNode;</b></p><p>  //用來存儲數(shù)的結(jié)點類型

11、</p><p>  typedef struct Node</p><p><b>  {</b></p><p>  long double n;</p><p>  struct Node_ys_char *next;</p><p><b>  }Node;</b>

12、;</p><p>  //用來存儲運算符的結(jié)點類型</p><p>  typedef struct Node_ys_char</p><p><b>  {</b></p><p><b>  char c;</b></p><p>  struct Node_ys_ch

13、ar *next_c;</p><p>  struct Node *next;</p><p>  }Node_ys_char;</p><p><b>  三 詳細設(shè)計</b></p><p>  我任務(wù)是整個程序的算法設(shè)計,以及部分子函數(shù)的編寫,經(jīng)過其他組員編寫的子函數(shù)的處理,將表達式變?yōu)橐粋€普通的表達式,其中數(shù)與

14、運算符已經(jīng)分開,將這個表達式的頭指針傳遞到我所編寫函數(shù)中,運算思想為:找到最內(nèi)層的一對括號,計算括號間的表達式的值,得到值之后,用這個值替換掉原始位置上的一對括號,以及其中的表達式。例如(((6.5-2*2.25)*2-6)/2+1.5)+3#,第一次替換后為((2*2-6)/2+1.5)+3#,第二次替換后為(-2/2+1.5)+3#,第三次替換后為0.5+3#,當沒有括號時調(diào)用四則運算函數(shù)直接計算。</p><p

15、>  如果一開始輸入的表達式中沒有括號,則直接調(diào)用四則運算函數(shù)進行計算。整個程序的算法思想見流程圖。</p><p><b>  函數(shù)的功能如下:</b></p><p>  主要部分的詳細流程圖)</p><p>  四 程序的調(diào)試與運行結(jié)果說明</p><p>  在編寫只有加減乘除的表達式求值的表達式求值時,

16、原始思想是用兩個指針分別指向相鄰的兩個運算符,若后者大,則進行后面運算符的運算,然后指針繼續(xù)后移,當再次遇到的兩個運算符,前者與后者相等,則進行前面運算符的運算;此算法思想錯誤,導(dǎo)致計算6+2*3+1#結(jié)果正確,而當計算6-2*3+1#時,卻得出-1的錯誤結(jié)果,正確結(jié)果為+1;這是因為先計算2*3得到6;表達式變?yōu)?-6+1#;接著進行6+1的運算,得到7;當前計算循序錯誤,導(dǎo)致結(jié)果錯誤。后來將程序改為先進行優(yōu)先級高的運算符的運算,當優(yōu)

17、先級相等時,不計算。指針后移,當遇到表達式結(jié)束標志時,便將指針移到表達式的頭位置,此時,判斷是否進行運算的條件發(fā)生變化,當前后運算符的優(yōu)先級相等時,進行前面運算符的運算;使得第一次將乘除運算符運算完,第二進行只有加減運算符的運算</p><p><b>  五 課程設(shè)計總結(jié)</b></p><p>  進過調(diào)試程序能得出大多數(shù)表達式的正確結(jié)果,雖然經(jīng)過了一些特殊情況表

18、達式的輸入,得出了正確結(jié)果,但不排除還有某些漏洞使得一些特殊情況的表達式不能得出正確結(jié)果,還有待進一步的測試。</p><p>  特點:本程序能進行小數(shù)、以及2進制、8進制、16進制的運算。</p><p>  不足:結(jié)果都以10進制形式表示,用戶不能改變;結(jié)果的10進制形式不能超出longdouble型數(shù)據(jù)能存儲的數(shù)的范圍;</p><p>  進一步的設(shè)想:將

19、數(shù)分段存儲,內(nèi)存動態(tài)分配,使其能進行天文數(shù)字運算;錄入其他的運算符例如指數(shù)運算,開方運算,取余運算,解一元一次方程,解二元一次方程組。</p><p><b>  附錄:</b></p><p><b>  源代碼:</b></p><p>  //用來存儲字符的結(jié)點類型</p><p>  typ

20、edef struct CharNode</p><p><b>  {</b></p><p><b>  char c;</b></p><p>  struct CharNode *next;</p><p>  }CharNode;</p><p>  //用來存儲數(shù)

21、的結(jié)點類型</p><p>  typedef struct IntNode</p><p><b>  {</b></p><p>  long double i;</p><p>  struct IntNode *next;</p><p><b>  }IntNode;</

22、b></p><p>  //用來存儲數(shù)的結(jié)點類型</p><p>  typedef struct Node</p><p><b>  {</b></p><p>  long double n;</p><p>  struct Node_ys_char *next;</p&

23、gt;<p><b>  }Node;</b></p><p>  //用來存儲運算符的結(jié)點類型</p><p>  typedef struct Node_ys_char</p><p><b>  {</b></p><p><b>  char c;</b>

24、</p><p>  struct Node_ys_char *next_c;</p><p>  struct Node *next;</p><p>  }Node_ys_char;</p><p>  char Precede(char x,char y)//運算符優(yōu)先級判斷</p><p><b> 

25、 {</b></p><p><b>  int i,j;</b></p><p>  int from[5][5]</p><p><b>  ={</b></p><p>  {0,0,-1,-1,0},</p><p>  {0,0,-1,-1,0},<

26、;/p><p>  {1,1,0,0,1},</p><p>  {1,1,0,0,1},</p><p>  {0,0,-1,-1,0}</p><p>  };//定義一個二維數(shù)組存放算術(shù)符號的優(yōu)先級</p><p><b>  switch(x)</b></p><p>

27、<b>  {</b></p><p>  case '+':i=0;break;</p><p>  case '-':i=1;break;</p><p>  case '*':i=2;break;</p><p>  case '/':i=3;brea

28、k;</p><p>  case '#':i=4;break;</p><p><b>  }</b></p><p><b>  switch(y)</b></p><p><b>  {</b></p><p>  case 

29、9;+':j=0;break;</p><p>  case '-':j=1;break;</p><p>  case '*':j=2;break;</p><p>  case '/':j=3;break;</p><p>  case '#':j=4;break;&

30、lt;/p><p><b>  }</b></p><p>  if(from[i][j]==1)//說明運算符i的優(yōu)先級比j的優(yōu)先級高</p><p>  return '>';</p><p>  if(from[i][j]==-1)</p><p>  return 

31、9;<';</p><p><b>  else</b></p><p>  return '=';</p><p><b>  }</b></p><p>  //輸入表達式,并對特殊情況做處理</p><p>  CharNode *Crea

32、tRegister()</p><p><b>  {</b></p><p>  CharNode *top,*p,*q,*e;</p><p>  top=(CharNode *)malloc(sizeof(CharNode));</p><p><b>  p=q=top;</b></p

33、><p>  scanf("%c",&p->c);</p><p>  scanf("%c",&p->c);</p><p>  if(q->c=='-')</p><p><b>  {</b></p><p>

34、;  p=(CharNode *)malloc(sizeof(CharNode));</p><p><b>  p->c='0';</b></p><p>  p->next=q;</p><p><b>  top=p;</b></p><p><b>  

35、p=q;</b></p><p><b>  }</b></p><p>  if(q->c=='(')</p><p><b>  {</b></p><p>  e=(CharNode *)malloc(sizeof(CharNode));</p>

36、<p><b>  e->c='0';</b></p><p>  p=(CharNode *)malloc(sizeof(CharNode));</p><p><b>  p->c='+';</b></p><p>  e->next=p;</p>

37、;<p>  p->next=q;</p><p><b>  p=q;</b></p><p><b>  top=e;</b></p><p><b>  }</b></p><p>  while(p->c!='#')</p

38、><p><b>  {</b></p><p>  q=(CharNode *)malloc(sizeof(CharNode));</p><p>  scanf("%c",&q->c);</p><p>  if((p->c=='(')&&(q-&g

39、t;c=='-'))</p><p><b>  {</b></p><p>  e=(CharNode *)malloc(sizeof(CharNode));</p><p><b>  e->c='0';</b></p><p>  e->next=q

40、;</p><p>  p->next=e;</p><p><b>  p=q;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></

41、p><p>  p->next=q;</p><p><b>  p=q;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  p->c='+';</

42、b></p><p>  p->next=(CharNode *)malloc(sizeof(CharNode));</p><p>  p->next->c='0';</p><p>  p=p->next;</p><p>  p->next=(CharNode *)malloc(siz

43、eof(CharNode));</p><p>  p->next->c='#';</p><p>  return top;</p><p><b>  }</b></p><p>  //將數(shù)與運算符分開,并將其他進制轉(zhuǎn)化為10進制</p><p>  Node *

44、StackChange(CharNode *top,int m)</p><p><b>  {</b></p><p>  CharNode *p,*q;</p><p>  long double x=0,y=0;</p><p>  char a[10],b[10];</p><p>  i

45、nt n=0,i=0,JiWei,max,min=47,mark_1=0,mark_2=0,h,k=0;</p><p>  Node *node,*head;</p><p>  Node_ys_char *node_char;</p><p><b>  switch(m)</b></p><p><b>

46、  {</b></p><p><b>  case 2:</b></p><p><b>  JiWei=2;</b></p><p><b>  max=50;</b></p><p><b>  break;</b></p>

47、<p><b>  case 8:</b></p><p><b>  JiWei=8;</b></p><p><b>  max=56;</b></p><p><b>  break;</b></p><p><b>  cas

48、e 10:</b></p><p><b>  JiWei=10;</b></p><p><b>  max=97;</b></p><p><b>  break;</b></p><p><b>  case 16:</b></p&

49、gt;<p><b>  JiWei=16;</b></p><p><b>  max=103;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  p=q

50、=top;</b></p><p>  while(p->c !='#')</p><p><b>  {</b></p><p>  while((q->c>min)&&(q->c<max)||(q->c==46))</p><p><

51、;b>  {</b></p><p>  if(q->c==46)</p><p><b>  {</b></p><p><b>  mark_1=1;</b></p><p>  q=q->next;</p><p><b>  }

52、</b></p><p>  if(mark_1==0)</p><p><b>  {</b></p><p>  a[n]=q->c;</p><p>  q=q->next;</p><p><b>  n++;</b></p>&

53、lt;p><b>  }</b></p><p>  if(mark_1==1)</p><p><b>  {</b></p><p>  b[i]=q->c;</p><p>  q=q->next;</p><p><b>  i++;<

54、;/b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for(h=n-1;h>=0;h--)</p><p><b>  {</b></p><p>  x=(a[n-h-1]-48)*

55、pow(JiWei,h)+x;//</p><p><b>  }</b></p><p>  for(h=0;h<i;h++)</p><p><b>  {</b></p><p>  y=y+(b[h]-48)*pow(JiWei,(-(h+1)));//</p><

56、p><b>  }</b></p><p>  node=(Node *)malloc(sizeof(Node));//</p><p>  node->n=x+y;</p><p><b>  mark_1=0;</b></p><p><b>  n=0;</b>

57、;</p><p><b>  i=0;</b></p><p>  if(mark_2==1)</p><p>  node_char->next=node;</p><p>  node_char=(Node_ys_char *)malloc(sizeof(Node_ys_char));</p>

58、<p>  node_char->c=q->c;</p><p>  node->next=node_char;</p><p>  node_char->next_c=NULL;</p><p>  node_char->next=NULL;</p><p>  if(q->c=='#&

59、#39;)</p><p><b>  {</b></p><p>  node->next=(Node_ys_char *)malloc(sizeof(Node_ys_char));</p><p>  node->next->c='#';</p><p>  return head;

60、</p><p><b>  }</b></p><p>  q=q->next;</p><p>  if(q->c<=min)</p><p>  while(q->c<=min)</p><p><b>  {</b></p>

61、<p>  node_char->next_c=(Node_ys_char*)malloc(sizeof(Node_ys_char));</p><p>  node_char->next_c->c=q->c;</p><p>  q=q->next ;</p><p>  //node->next=node_char

62、;</p><p>  node_char=node_char->next_c;</p><p>  node_char->next_c=NULL;</p><p>  node_char->next=NULL;</p><p><b>  }</b></p><p><b

63、>  else</b></p><p><b>  {</b></p><p>  node->next=node_char;</p><p>  node_char->next_c=NULL;</p><p>  node_char->next=NULL;</p>&l

64、t;p><b>  }</b></p><p><b>  p=q;</b></p><p><b>  n=0;</b></p><p><b>  x=0;</b></p><p><b>  y=0;</b></p&

65、gt;<p>  if(mark_2==0)</p><p><b>  {</b></p><p>  head=node;</p><p><b>  mark_2=1;</b></p><p><b>  }</b></p><p>

66、<b>  }</b></p><p>  return head;</p><p><b>  }</b></p><p>  //作只有加減乘除運算的表達式求值</p><p>  Node *Compute(Node *p)</p><p><b>  {&l

67、t;/b></p><p>  int mark=0;</p><p>  Node *m,*n;</p><p>  char max_char,min_char;</p><p><b>  m=n=p;</b></p><p>  while(p->next->c!=

68、9;#')</p><p><b>  {</b></p><p>  max_char=n->next->c;</p><p>  n=n->next->next;</p><p>  min_char=n->next->c;</p><p>  if

69、((Precede(max_char,min_char)=='<'||Precede(max_char,min_char)=='=')&&mark!=1)</p><p><b>  {</b></p><p><b>  m=n;</b></p><p><b&

70、gt;  }</b></p><p>  if(Precede(max_char,min_char)=='>'||mark==1)</p><p><b>  {</b></p><p>  switch(m->next->c)</p><p><b>  {<

71、;/b></p><p>  case '+':m->n =m->n + n->n ;break;</p><p>  case '-':m->n =m->n - n->n ;break;</p><p>  case '*':m->n =m->n * n->

72、n ;break;</p><p>  case '/':m->n =m->n / n->n ;break;</p><p><b>  }</b></p><p>  m->next=n->next;</p><p><b>  n=m;</b><

73、;/p><p><b>  }</b></p><p>  if(m->next->c=='#')</p><p><b>  {</b></p><p><b>  m=n=p;</b></p><p><b>  m

74、ark=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return m;</b></p><p><b>  }</b></p><p>  /

75、/求用戶輸入表達式的值</p><p>  Node *GetOutcome(Node *head)</p><p><b>  {</b></p><p>  Node *p,*q,*R;</p><p>  Node_ys_char *m,*n,*t,*k;</p><p>  n=(Node

76、_ys_char *)malloc(sizeof(Node_ys_char));</p><p><b>  n->c='(';</b></p><p><b>  p=q=head;</b></p><p>  while((n->c!=')')&&(q->

77、;next->c!='#'))</p><p><b>  {</b></p><p>  if(q->next->c=='(')</p><p><b>  {</b></p><p>  m=q->next;</p><

78、p><b>  k=m;</b></p><p><b>  }</b></p><p>  else if(q->next->next_c==NULL)</p><p>  q=q->next->next;</p><p><b>  else</b

79、></p><p><b>  {</b></p><p>  m=q->next->next_c;</p><p>  k=q->next;//t=q->next;</p><p>  if(m->c=='(')</p><p><b&

80、gt;  {</b></p><p><b>  t=k;</b></p><p><b>  k=m;</b></p><p><b>  }</b></p><p>  while(m->next_c!=NULL)</p><p>

81、<b>  {</b></p><p>  m=m->next_c;</p><p>  if(m->c=='(')</p><p><b>  {</b></p><p><b>  t=k;</b></p><p><

82、;b>  k=m;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  q=m->next ;</p><p><b>  }</b></p><p>  if(q->

83、next->c==')')</p><p><b>  {</b></p><p>  n=q->next;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(n->

84、;c==')')</p><p><b>  {</b></p><p>  p=k->next;</p><p>  q->next->c='#';</p><p>  R=Compute(p);</p><p>  t->next =R;

85、</p><p>  t->next_c=NULL;</p><p>  R->next=n->next_c;</p><p>  GetOutcome(head);</p><p><b>  }</b></p><p><b>  else</b><

86、;/p><p><b>  {</b></p><p>  R=Compute(head);</p><p><b>  return R;</b></p><p><b>  }</b></p><p><b>  }</b><

87、/p><p><b>  main()</b></p><p><b>  {</b></p><p>  int m;//進制</p><p><b>  char a;</b></p><p>  CharNode *top_1;</p>

88、<p>  Node *top_2,*R;</p><p>  printf("\n\n");</p><p>  printf("███████████████████████████████████████\n");</p><p>  printf("██

89、 ██\n");</p><p>  printf("██ 表達式求值系統(tǒng) ██\n");</p><p>  printf("██

90、 ██\n");</p><p>  printf("███████████████████████████████████████\n");</p><p>  printf("本程序可分別進行2進制,8進制,10進制,16進制的加

91、減乘除運算:\n");</p><p><b>  loop:</b></p><p>  printf("...............請輸入進制..............\n");</p><p>  printf("你選的進制為:");</p><p>  sca

92、nf("%d",&m);</p><p>  printf("請輸入表達式,表達式請以#結(jié)尾:\n");</p><p>  top_1=CreatRegister();//錄入表達式,并對特殊情況作處理,將頭指針帶回;</p><p>  top_2=StackChange(top_1,m);//進制轉(zhuǎn)換,將數(shù)與運算

93、符分開,將頭指針帶回;</p><p>  R=GetOutcome(top_2);得出結(jié)果</p><p>  printf("運算結(jié)果的十進制形式為:\n");</p><p>  printf("%lf",R->n);</p><p>  printf("\n繼續(xù)進行運算請輸入y否

94、則退出:\n");</p><p>  scanf("%c",&a);</p><p>  scanf("%c",&a);</p><p>  if(a=='y'||a=='Y')</p><p>  goto loop; </p>

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論