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

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  計(jì)算機(jī)科學(xué)與信息工程學(xué)院</p><p><b>  數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)</b></p><p>  設(shè)計(jì)題目:簡(jiǎn)單計(jì)算器</p><p>  2010 年 12 月 25 日</p><p><b>  簡(jiǎn)單計(jì)算器</b></p><p><b&g

2、t;  一 基本功能描述</b></p><p>  簡(jiǎn)單的計(jì)算器的功能是對(duì)基本的加、減、乘、除、四則運(yùn)算,可對(duì)輸入的操作數(shù),包括整數(shù),小數(shù)等進(jìn)行運(yùn)算。</p><p><b>  二 設(shè)計(jì)思路</b></p><p>  本程序主要是采用棧的理論知識(shí),主要用到兩個(gè)結(jié)構(gòu)體棧,一個(gè)用來(lái)轉(zhuǎn)化表達(dá)式,一個(gè)用來(lái)計(jì)算表達(dá)式。區(qū)別就在于一個(gè)存儲(chǔ)

3、字符,一個(gè)存儲(chǔ)浮點(diǎn)。首先,用一個(gè)字符數(shù)組來(lái)存儲(chǔ)用戶(hù)輸入的中綴表達(dá)式。然后用棧來(lái)把這個(gè)表達(dá)式轉(zhuǎn)化為后綴表達(dá)式,轉(zhuǎn)化時(shí)要進(jìn)行符號(hào)優(yōu)先級(jí)比較,這里將‘*’‘/’的優(yōu)先級(jí)定為2,‘+’‘-’定為1,括號(hào)和‘=’定為0。具體思想如下:例如用戶(hù)輸入了1+2*3=,將其存放入一個(gè)字符數(shù)組中。先在棧的底部存放一個(gè)‘=’號(hào)符,用作符號(hào)優(yōu)先級(jí)比較。首先將1存放到另外一個(gè)字符數(shù)組s1中,再將‘+’號(hào)入棧。入棧的同時(shí)與底部的‘=’比較優(yōu)先級(jí),‘+’的優(yōu)先級(jí)高于

4、‘=’,所以不出棧,之后將2存放入s2中,然后再將‘*’入棧,入棧的同時(shí)與‘+’比較符號(hào)優(yōu)先級(jí),‘*’比‘+’高,所以不出棧。再將3存入s2中。之后將棧中不是‘=’的運(yùn)算符都彈出棧,并依次存入s2中。所以s2中的表達(dá)式為123*+。之后進(jìn)行計(jì)算,計(jì)算時(shí)用到浮點(diǎn)棧。首先將s2中的字符依次入棧,遇到運(yùn)算符時(shí)進(jìn)行計(jì)算。所以將123入棧后,再將‘*’入棧的同時(shí),將前面兩個(gè)數(shù)字進(jìn)行運(yùn)算,算出結(jié)果為6并存入棧中,之后再將‘+’入棧,再與1進(jìn)行運(yùn)算,

5、結(jié)果即為7</p><p><b>  三 概要設(shè)計(jì)</b></p><p><b>  1,子函數(shù)功能</b></p><p>  struct Stack{……}</p><p>  用來(lái)轉(zhuǎn)化表達(dá)式的機(jī)構(gòu)體棧。</p><p>  Struct FStack{……}<

6、;/p><p>  用來(lái)計(jì)算表達(dá)式的結(jié)構(gòu)體棧</p><p>  void InitStack(Stack &s)</p><p><b>  初始化結(jié)構(gòu)體棧</b></p><p>  void InitFStack(FStack &s)</p><p><b>  初始化

7、結(jié)構(gòu)體棧</b></p><p>  char GetTop(Stack s)</p><p><b>  獲取棧頂數(shù)據(jù)</b></p><p>  void IncrementStackSize(Stack &s)</p><p>  為棧擴(kuò)充ncrementsize個(gè)存儲(chǔ)空間</p>

8、<p>  void IncrementFStackSize(FStack &s)</p><p>  為棧擴(kuò)充ncrementsize個(gè)存儲(chǔ)空間</p><p>  void Push(Stack &s,char e)</p><p><b>  第一個(gè)棧入棧操作</b></p><p> 

9、 void PushF(FStack &s,float e)</p><p><b>  第二個(gè)棧入棧操作</b></p><p>  bool Empty(Stack s)</p><p>  判斷第一個(gè)棧是否為空。</p><p>  bool EmptyF(FStack s)</p><

10、p><b>  判斷第二個(gè)棧是否空</b></p><p>  char Pop(Stack &s)</p><p><b>  表達(dá)式出棧</b></p><p>  float PopF(FStack &s)</p><p><b>  計(jì)算的數(shù)據(jù)出棧</b

11、></p><p>  int Precede(char op)</p><p><b>  確定優(yōu)先級(jí)的函數(shù)</b></p><p>  void Change(char *s1,char *s2)</p><p>  改變兩個(gè)字符串的儲(chǔ)存位置</p><p>  float Compu

12、te(char *s2)</p><p><b>  實(shí)現(xiàn)數(shù)據(jù)的運(yùn)算</b></p><p><b>  2 函數(shù)的調(diào)用</b></p><p>  3 測(cè)試數(shù)據(jù)及測(cè)試結(jié)果</p><p>  (1)測(cè)試 1+2+3=6</p><p>  (2) 測(cè)試2*4=8</p

13、><p>  (3)測(cè)試 3/2=1.5</p><p>  (4)測(cè)試(1+2)*3=9</p><p><b>  四 程序代碼</b></p><p>  #include <iostream.h></p><p>  #include <fstream.h></p

14、><p>  #include <string.h></p><p>  #include <ctype.h></p><p>  #include <stdlib.h></p><p>  #include <strstrea.h></p><p>  struct Sta

15、ck{ //轉(zhuǎn)換表達(dá)式</p><p>  char *elem;</p><p><b>  int top;</b></p><p>  int stacksize;</p><p>  int incrementsize;</p><p><b>  };&

16、lt;/b></p><p>  struct FStack{ //計(jì)算</p><p>  float *elem;</p><p><b>  int top;</b></p><p>  int stacksize;</p><p>  int incrementsi

17、ze;</p><p><b>  };</b></p><p>  void InitStack(Stack &s)</p><p><b>  {</b></p><p>  s.elem=new char[100];</p><p><b>  s.t

18、op=-1;</b></p><p>  s.stacksize=100;</p><p>  s.incrementsize=10;</p><p><b>  }</b></p><p>  void InitFStack(FStack &s)</p><p><b&

19、gt;  {</b></p><p>  s.elem=new float[100];</p><p><b>  s.top=-1;</b></p><p>  s.stacksize=100;</p><p>  s.incrementsize=10;</p><p><b&

20、gt;  }</b></p><p>  char GetTop(Stack s)</p><p><b>  {</b></p><p>  return s.elem[s.top];</p><p><b>  }</b></p><p>  void Inc

21、rementStackSize(Stack &s)</p><p><b>  {</b></p><p>  char *a=new char[s.stacksize+s.incrementsize];</p><p>  for(int i=0;i<=s.top;i++)</p><p>  a[i]=

22、s.elem[i];</p><p>  delete []s.elem;</p><p><b>  s.elem=a;</b></p><p>  s.stacksize+=s.incrementsize;</p><p><b>  }</b></p><p>  vo

23、id IncrementFStackSize(FStack &s)</p><p><b>  {</b></p><p>  float *a=new float[s.stacksize+s.incrementsize];</p><p>  for(int i=0;i<=s.top;i++)</p><p&

24、gt;  a[i]=s.elem[i];</p><p>  delete []s.elem;</p><p><b>  s.elem=a;</b></p><p>  s.stacksize+=s.incrementsize;</p><p><b>  }</b></p><

25、;p>  void Push(Stack &s,char e)</p><p><b>  {</b></p><p>  if(s.top==(s.stacksize-1))</p><p>  IncrementStackSize(s);</p><p><b>  s.top++;<

26、/b></p><p>  s.elem[s.top]=e;</p><p><b>  }</b></p><p>  void PushF(FStack &s,float e)</p><p><b>  {</b></p><p>  if(s.top=

27、=(s.stacksize-1))</p><p>  IncrementFStackSize(s);</p><p><b>  s.top++;</b></p><p>  s.elem[s.top]=e;</p><p><b>  }</b></p><p>  bo

28、ol Empty(Stack s)</p><p><b>  {</b></p><p>  return s.top==-1;</p><p><b>  }</b></p><p>  bool EmptyF(FStack s)</p><p><b>  {

29、</b></p><p>  return s.top==-1;</p><p><b>  }</b></p><p>  char Pop(Stack &s) //表達(dá)式出棧</p><p><b>  {</b></p><p>  

30、return s.elem[s.top--];</p><p><b>  }</b></p><p>  float PopF(FStack &s) //計(jì)算的數(shù)據(jù)出棧</p><p><b>  {</b></p><p>  return s.elem[s.top--];<

31、;/p><p><b>  }</b></p><p>  int Precede(char op) //確定優(yōu)先級(jí)的函數(shù)</p><p><b>  {</b></p><p>  switch (op)</p><p><b>  {</b>&l

32、t;/p><p><b>  case '+':</b></p><p><b>  case '-':</b></p><p>  return 1; //定義加減運(yùn)算的優(yōu)先級(jí)為1</p><p><b>  case '*':&

33、lt;/b></p><p><b>  case '/':</b></p><p>  return 2; //定義乘除運(yùn)算的優(yōu)先級(jí)為2</p><p><b>  case '(':</b></p><p><b>  case 

34、9;[':</b></p><p><b>  case '{':</b></p><p><b>  case '=':</b></p><p><b>  default:</b></p><p>  return 0;

35、 //定義在棧中的左括號(hào)和棧底字符的優(yōu)先級(jí)為0</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Change(char *s1,char *s2)</p><p><b>  {</b></p>

36、;<p>  Stack R; //定義用于暫存運(yùn)算符的棧</p><p>  InitStack(R);</p><p>  Push(R,'='); //給棧底放入‘='字符,它具有最低優(yōu)先級(jí)0</p><p><b>  int i,j;</b></p><

37、p>  i = 0; //用于指示掃描s1串中字符的位置,初值為0</p><p>  j = 0; //用于指示s2串中待存字符的位置,初值為0</p><p>  char ch = s1[i];</p><p>  while (ch != '=')</p><p><b>

38、  {</b></p><p>  if (ch == ' ')</p><p><b>  {</b></p><p>  ch = s1[++i]; //對(duì)于空格字符不做任何處理</p><p><b>  }</b></p><p>

39、  //-------------------------------------------------------------</p><p>  else if (ch == '(')</p><p>  { //對(duì)于左括號(hào),直接進(jìn)棧</p><p>  Push(R,ch);<

40、;/p><p>  ch = s1[++i];</p><p><b>  }</b></p><p>  else if (ch == ')')</p><p>  { //對(duì)于右括號(hào),使括號(hào)內(nèi)的仍停留在棧中的運(yùn)算符依次出棧并寫(xiě)入到s2中&

41、lt;/p><p>  while (GetTop(R) != '(')</p><p><b>  {</b></p><p>  s2[j++] = Pop(R);</p><p><b>  }</b></p><p>  Pop(R);

42、 //刪除棧頂?shù)淖罄ㄌ?hào)</p><p>  ch = s1[++i];</p><p><b>  }</b></p><p>  //-------------------------------------------------</p><p>  else if (ch == '

43、[')</p><p>  { //對(duì)于左括號(hào),直接進(jìn)棧</p><p>  Push(R,ch);</p><p>  ch = s1[++i];</p><p><b>  }</b></p><p>  else if

44、 (ch == ']')</p><p>  { //對(duì)于右括號(hào),使括號(hào)內(nèi)的仍停留在棧中的運(yùn)算符依次</p><p>  //出棧并寫(xiě)入到s2中</p><p>  while (GetTop(R) != '[')</p><p><b&g

45、t;  {</b></p><p>  s2[j++] = Pop(R);</p><p><b>  }</b></p><p>  Pop(R); //刪除棧頂?shù)淖罄ㄌ?hào)</p><p>  ch = s1[++i];</p><p>&

46、lt;b>  }</b></p><p>  //---------------------------------------------</p><p>  else if (ch == '{')</p><p>  { //對(duì)于左括號(hào),直接進(jìn)棧</p>

47、<p>  Push(R,ch);</p><p>  ch = s1[++i];</p><p><b>  }</b></p><p>  else if (ch == '}')</p><p>  { //對(duì)于右括號(hào),使括號(hào)

48、內(nèi)的仍停留在棧中的運(yùn)算符依次</p><p>  //出棧并寫(xiě)入到s2中</p><p>  while (GetTop(R) != '{')</p><p><b>  {</b></p><p>  s2[j++] = Pop(R);</p><p><b>  }&

49、lt;/b></p><p>  Pop(R); //刪除棧頂?shù)淖罄ㄌ?hào)</p><p>  ch = s1[++i];</p><p><b>  }</b></p><p>  //---------------------------------------------

50、------</p><p>  else if (ch == '+' || ch == '-' || ch == '*' || ch == '/')</p><p>  { //對(duì)于四則運(yùn)算符,使暫存在棧中的不低于c

51、h優(yōu)先級(jí)</p><p>  //的運(yùn)算符依次出棧并寫(xiě)入到s2中</p><p>  char w = GetTop(R);</p><p>  while (Precede(w) > Precede(ch))</p><p>  { //

52、優(yōu)先級(jí)()函數(shù)返回運(yùn)算符形參的優(yōu)先級(jí)</p><p>  s2[j++] = w;</p><p><b>  Pop(R);</b></p><p>  w = GetTop(R);</p><p><b>  }</b></p><p>  Push(R,ch);<

53、/p><p>  ch = s1[++i];</p><p><b>  }</b></p><p><b>  else</b></p><p>  { //此處為數(shù)字或小數(shù)點(diǎn)字符的處理</p&g

54、t;<p>  while (isdigit(ch) || ch == '.')</p><p><b>  {</b></p><p>  s2[j++] = ch;</p><p>  ch = s1[++i];</p><p><b>  }</b></p&

55、gt;<p>  s2[j++] = ' '; //被轉(zhuǎn)換后的每個(gè)數(shù)值后放一個(gè)空格</p><p><b>  }</b></p><p><b>  }</b></p><p>  //----------------------

56、-----------------------------------</p><p>  ch = Pop(R);</p><p>  while (ch != '=')</p><p><b>  {</b></p><p>  s2[j++] = ch;</p><p>  

57、ch = Pop(R);</p><p><b>  }</b></p><p>  s2[j++] = '='; //加入字符串結(jié)束符</p><p>  s2[j++] = '\0';</p><p><

58、;b>  }</b></p><p>  float Compute(char *s2)</p><p><b>  {</b></p><p>  FStack S; //用S棧存儲(chǔ)操作數(shù)和中間計(jì)算結(jié)果</p><p> 

59、 InitFStack(S);</p><p>  istrstream ins(s2); //把s2定義為輸入字符串流對(duì)象ins</p><p>  char ch; //用于輸入字符</p><p>  float x;

60、 //用于輸入浮點(diǎn)數(shù)</p><p><b>  ins>>ch;</b></p><p>  while (ch != '=')</p><p><b>  {</b></p><p>  switch

61、 (ch)</p><p><b>  {</b></p><p><b>  case '+':</b></p><p>  x = PopF(S) + PopF(S);</p><p><b>  break;</b></p><p>

62、;<b>  case '-':</b></p><p>  x = PopF(S);</p><p>  x = PopF(S) - x;</p><p><b>  break;</b></p><p><b>  case '*':</b>

63、</p><p>  x = PopF(S) * PopF(S);</p><p><b>  break;</b></p><p><b>  case '/':</b></p><p>  x = PopF(S);</p><p>  x = PopF(S

64、) / x;</p><p><b>  break;</b></p><p><b>  default:</b></p><p>  ins.putback(ch);</p><p><b>  ins>>x;</b></p><p>&

65、lt;b>  }</b></p><p>  PushF(S,x);</p><p><b>  ins>>ch;</b></p><p><b>  }</b></p><p>  if (!EmptyF(S))</p><p><b&g

66、t;  {</b></p><p>  x = PopF(S);</p><p>  if (EmptyF(S)) //如果棧中只有一個(gè)值那一定是結(jié)果</p><p><b>  {</b></p><p><b>  return x;</b>&l

67、t;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void main()//主程序</p><p><b>  {</b></p>

68、<p><b>  FStack s;</b></p><p>  char a[10];</p><p>  float b,c;</p><p>  char str1[50],str2[50]; //暫時(shí)存儲(chǔ)表達(dá)式</p><p>  char j='y';</p>&l

69、t;p>  cout<<" ***************************歡迎使用本計(jì)算器***************************"<<endl<<endl;</p><p><b>  haha:</b></p><p>  while(j=='Y'||j==

70、'y')</p><p><b>  {</b></p><p>  int i=0,m=0,n=0,k=0,l=0,q=0,p=0;</p><p>  cout<<" 請(qǐng)輸入一個(gè)以'='字符結(jié)束的中綴算術(shù)表達(dá)式:"<<endl&l

71、t;<endl;</p><p>  cin.getline(str1,sizeof(str1));</p><p>  while(str1[i]!='\0')</p><p><b>  i++;</b></p><p>  if(str1[i-1]!='=')</p>

72、;<p><b>  {</b></p><p>  cout<<"表達(dá)式錯(cuò)誤..請(qǐng)重新輸入.."<<endl<<endl;</p><p>  goto haha;</p><p><b>  }</b></p><p>&l

73、t;b>  i=0;</b></p><p>  while(str1[i]!='\0')</p><p><b>  {</b></p><p>  if(str1[i]=='0'&&str1[i-1]=='/')</p><p><

74、;b>  {</b></p><p>  cout<<"表達(dá)式錯(cuò)誤..請(qǐng)重新輸入.."<<endl<<endl;</p><p>  goto haha;</p><p><b>  }</b></p><p><b>  i++;&l

75、t;/b></p><p><b>  }</b></p><p><b>  i=0;</b></p><p>  while(str1[i]!='\0')</p><p><b>  {</b></p><p>  if(str

76、1[i]=='(')</p><p><b>  m++;</b></p><p>  if(str1[i]==')')</p><p><b>  n++;</b></p><p>  if(str1[i]=='[')</p><

77、p><b>  k++;</b></p><p>  if(str1[i]==']')</p><p><b>  l++;</b></p><p>  if(str1[i]=='{')</p><p><b>  q++;</b><

78、/p><p>  if(str1[i]=='}')</p><p><b>  p++;</b></p><p><b>  i++;</b></p><p><b>  }</b></p><p>  if(m!=n || k!=l ||

79、q!=p)</p><p><b>  {</b></p><p>  cout<<"表達(dá)式錯(cuò)誤..請(qǐng)重新輸入.."<<endl<<endl;</p><p>  goto haha;</p><p><b>  }</b></p>

80、;<p>  Change(str1,str2); //處理結(jié)果</p><p>  cout<<"\n求值結(jié)果為: "<<str1<<Compute(str2)<<endl;</p><p>  cout<<"是否繼續(xù) :(Y/N)"<<endl;</p

81、><p><b>  cin>>j;</b></p><p>  cin.getline(str1,2);</p><p><b>  }</b></p><p>  cout<<endl<<" *********************

82、感謝使用本計(jì)算器*********************"<<endl;</p><p><b>  }</b></p><p><b>  五 課程設(shè)計(jì)總結(jié)</b></p><p><b>  1 收獲</b></p><p>  通過(guò)這次課程設(shè)計(jì),更

83、進(jìn)一步了解了棧的原理和應(yīng)用,同時(shí)也鍛煉了數(shù)據(jù)結(jié)構(gòu)在實(shí)際中的熟練運(yùn)用。</p><p><b>  2 心得體會(huì)</b></p><p>  在這次數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)中遇到了很多實(shí)際性的問(wèn)題,在實(shí)際設(shè)計(jì)中才發(fā)現(xiàn),書(shū)本上理論性的東西與在實(shí)際運(yùn)用中的還是有一定的出入的,所以有些問(wèn)題要不斷地更正以前的錯(cuò)誤思維。通過(guò)這次設(shè)計(jì),我懂得了學(xué)習(xí)的重要性,了解到理論知識(shí)與實(shí)踐相結(jié)合的重要意義

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論