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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  數(shù)據(jù)結構與算法課程設計</p><p><b>  說 明 書</b></p><p>  2013 年12月 20 日</p><p><b>  1、 需求分析</b></p><p>  任意給定一個M進制的數(shù)x ,請實現(xiàn)如下要求</p><p>

2、  1) 求出此數(shù)x的10進制值(用MD表示)</p><p>  2) 實現(xiàn)對x向任意的一個非M進制的數(shù)的轉換。</p><p>  3) 用兩種方法實現(xiàn)上述要求(用棧解決和用數(shù)組解決)。</p><p><b>  2、概要設計</b></p><p><b>  流程圖<

3、;/b></p><p><b>  數(shù)組的流程圖:</b></p><p><b>  算法思想</b></p><p> ?。?、用數(shù)組實現(xiàn)該問題:</p><p>  DtoM()函數(shù)和MtoD()函數(shù)是實現(xiàn)該問題的主要函數(shù)?!toM()函數(shù)是實現(xiàn)十進制轉換為其它進制的函數(shù),它是將輸入的

4、十進制數(shù)x取首先對需要轉換的進制M取余,然后再對其取整,接著通過遞歸調用DtoM()函數(shù)依次將得到的整數(shù)部分依次先取余后取整,并將所得的余數(shù)依次存入一個數(shù)組中,然后逆向取出數(shù)組中的元素,即得到轉換后的結果。而MtoD()函數(shù)則是實現(xiàn)其他進制M轉換為十進制,并將其轉換為非M進制的數(shù)。M進制轉十進制則是從該M進制數(shù)的最后一位開始算,依次列為第0、1、2…n位并分別乘以M的0、1、2…n次方,將得到的次方相加便得到對應的十進制數(shù),再調用Dto

5、M()函數(shù)將其轉換為非M進制的數(shù)。</p><p> ?。?、用棧實現(xiàn)該問題:</p><p>  同樣是利用DtoM()和MtoD()兩個函數(shù)實現(xiàn)。兩個函數(shù)的思想同利用數(shù)組實現(xiàn)時相同。只是棧具有后進先出的性質,故其用Pop()取數(shù)較數(shù)組的逆向取數(shù)方便些。</p><p><b>  模塊劃分</b></p><p>  

6、1、用數(shù)組實現(xiàn)該問題:</p><p>  ⑴ i,j,y,n,s,m,r,reminder,x是定義的全局變量,初始值都為0;</p><p> ?、啤toM(int g,int h)是實現(xiàn)十進制數(shù)轉換為M進制數(shù)的函數(shù);</p><p>  ⑶ MtoD()是實現(xiàn)M(僅指二進制數(shù)和八進制數(shù))進制數(shù)轉換為十進制數(shù)的函數(shù),并在其中調用D2M(int g,int h)

7、實現(xiàn)向非M進制數(shù)的轉換;</p><p> ?、取toD(int f)是實現(xiàn)十六進制數(shù)轉換為十進制數(shù)的函數(shù),并在其中調用D2M(int g,int h)實現(xiàn)向非十六進制數(shù)的轉換;</p><p> ?、伞oid main()是主函數(shù),功能是給出測試的數(shù)據(jù),并在特定條件下調用D2M()函數(shù)和M2D()函數(shù)。</p><p>  2、用棧實現(xiàn)該問題:</p&g

8、t;<p> ?、拧qStack定義棧,說明base為棧底指針,top為棧頂指針,stacksize為棧容量;</p><p> ?、啤nt InitStack(SqStack &S)到int DestroyStack(SqStack &S)六大模塊分別表示構造一個空棧、用e表示棧元素、插入元素、刪除元素、判斷棧是否為空以及摧毀棧;</p><p> ?、?/p>

9、 SqStack S是指定義棧S;</p><p> ?、取toM(int a,int b)的功能是將十進制數(shù)轉換成M進制的函數(shù);</p><p>  ⑸ MtoD()的功能是M進制轉換為十進制的函數(shù);</p><p> ?、省oid main()是主函數(shù)。其功能是輸入需要測試的數(shù)據(jù)以及需要轉換的進制,并在特定情形下調用DtoM()函數(shù)和MtoD()函數(shù),而且實

10、現(xiàn)M進制數(shù)向任意非M進制數(shù)的轉換。</p><p><b>  3、詳細設計</b></p><p>  源程序有兩個,shuzu.cpp是用數(shù)組實現(xiàn)該問題的程序,而stack.cpp是用棧實現(xiàn)該問題的程序:</p><p> ?。畚募huzu.cpp]</p><p>  #include<stdio.h>

11、;</p><p>  #include<math.h></p><p>  #include<malloc.h></p><p>  #include<stdlib.h></p><p>  #define N 1000</p><p>  // 以下為DtoM(int g,int

12、 h)是實現(xiàn)十進制數(shù)轉換為M進制數(shù)的函數(shù),</p><p>  DtoM(int g,int h)</p><p><b>  {</b></p><p><b>  int c[N];</b></p><p>  int i=0;int j;</p><p>  int r

13、eminder;</p><p>  reminder=g%h;</p><p><b>  g=g/h;</b></p><p>  if(reminder>9)</p><p><b>  {</b></p><p>  c[i]=reminder+55;</

14、p><p><b>  i++;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  c[i]=reminder;</p>

15、<p><b>  i++;</b></p><p><b>  }</b></p><p><b>  if(g>0)</b></p><p>  DtoM(g,h);</p><p>  for(j=i-1;j>=0;j--)</p>

16、<p>  if(c[j]>=65)</p><p>  printf("%c",c[j]);</p><p><b>  else</b></p><p>  printf("%d",c[j]);</p><p><b>  }</b>&l

17、t;/p><p>  //以下MtoD()是實現(xiàn)M(僅指二進制數(shù)和八進制數(shù))進制數(shù)轉換為十進制數(shù)的函數(shù),并在其中調用D2M(int g,int h)實現(xiàn)向非M進制數(shù)的轉換</p><p>  MtoD(int e) //二進制和八進制數(shù)轉換為十進制數(shù),并這轉換為其他進制數(shù)</p><p><b>  {</b></p>&

18、lt;p>  int n,i,y=0,j,s;</p><p><b>  int a[N];</b></p><p>  printf("請輸入%d進制位數(shù):",e);</p><p>  scanf("%d",&n);</p><p><b>  j=0

19、;</b></p><p>  printf("請輸入%d進制的每位并使每位用空格隔開:",e);</p><p>  for(i=n-1;i>=0;i--)</p><p>  scanf("%d",&a[i]);</p><p>  for(i=0;i<n;i++)&

20、lt;/p><p><b>  {</b></p><p>  y+=(int)pow(e,j)*a[i]; //強制類型轉換,以免造成數(shù)據(jù)丟失</p><p><b>  j++;</b></p><p><b>  }</b></p><p>  

21、printf("所得的10進制的結果:%d ",y);</p><p>  printf("\n需要轉換的進制M:");</p><p>  scanf("%d",&s);</p><p>  printf("請輸出轉換成%d進制的結果:",s);</p><

22、p>  DtoM(y,s);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  //以下為HtoD(int f)是實現(xiàn)十六進制數(shù)轉換為十進制數(shù)的函數(shù),并在其中調用D2M(int g,int h)實現(xiàn)向非十六進制數(shù)的轉換</p><p

23、>  HtoD(int f) //十六進制數(shù)轉換為十進制數(shù),并轉換為其他進制數(shù)</p><p><b>  {</b></p><p>  int n,j=0,y=0,i,s;</p><p><b>  int b[N];</b></p><p>  printf(&quo

24、t;請輸入%d進制位數(shù):",f);</p><p>  scanf("%d",&n);</p><p>  printf("請輸入%d進制的每位并使每位用空格隔開:",f);</p><p>  for(i=0;i<n;i++)</p><p>  scanf("%x&

25、quot;,&b[i]);</p><p>  for(i=n-1;i>=0;i--)</p><p><b>  {</b></p><p>  y+=(int)pow(f,j)*b[i]; //強制類型轉換,以免造成數(shù)據(jù)丟失</p><p><b>  j++;</b>

26、</p><p><b>  }</b></p><p>  printf("請輸出所得的10進制的結果: ");</p><p>  printf("%d",y);</p><p>  printf("\n需要轉換的進制M:");</p><

27、;p>  scanf("%d",&s);</p><p>  printf("請輸出轉換成%d進制的結果:",s);</p><p>  DtoM(y,s);</p><p><b>  return 0;</b></p><p><b>  }</b

28、></p><p>  // void main()是主函數(shù),功能是給出測試的數(shù)據(jù),并在特定條件下調用DtoM()函數(shù)和MtoD()函數(shù)</p><p>  void main()</p><p><b>  {</b></p><p>  int m,r,x,t;</p><p><

29、b>  for(;;) </b></p><p><b>  { </b></p><p>  printf("\n\t\t* * * * * * ^-^ welcome !!! ^-^ * * * * * * \n"); </p><p>  printf("\t\t

30、 數(shù)制轉換系統(tǒng) \n"); </p><p>  printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"); </p><p>  printf("\t\t

31、 \n"); </p><p>  printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"); </p><p>  printf("\t\t* 1. 進入數(shù)制轉換系統(tǒng) *\n"); </p><

32、p>  printf("\t\t* 2. 退出該系統(tǒng) *\n"); </p><p>  printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"); </p><p>  printf("\t\t

33、 請選擇(1-2):"); </p><p>  loop:scanf("%d",&t); </p><p>  switch(t) </p><p>  { case 1:printf("請給定一個需轉換的進制M(2 or 8 or 10 or 16):");</p>

34、<p>  scanf("%d",&m);</p><p>  if(m==2||m==8) //二進制和八進制轉換成十進制</p><p><b>  MtoD(m);</b></p><p>  else if(m==16) //十六進制轉換成十進制</p>

35、<p><b>  HtoD(m);</b></p><p>  else if(m==10) //十進制轉換成其它進制</p><p><b>  {</b></p><p>  printf("請輸入一個%d進制數(shù):",m);</p><p>  s

36、canf("%d",&x);</p><p>  printf("請輸入需要轉換成的進制M(2 or 8 or 16):");</p><p>  scanf("%d",&r);</p><p>  printf("請輸出轉換成%d進制的結果:",r);</p>

37、;<p>  DtoM(x,r);</p><p>  printf("\n");</p><p><b>  } break;</b></p><p>  case 2: exit(0); </p><p>  default:{ printf("輸入有誤,請重新選擇

38、:"); </p><p>  goto loop;} </p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b

39、></p><p> ?。畚募tack.cpp]</p><p>  #include<stdio.h></p><p>  #include<malloc.h></p><p>  #include<stdlib.h></p><p>  #include<math.

40、h></p><p>  #define STACK_INIT_SIZE 100 //存儲空間初始分配量</p><p>  #define STACKINCREMENT 10 //存儲空間分配增量</p><p>  int e,m,x,s,t; //x為要轉換的十進制數(shù),e 為臨時用的的int型變量</p><p&

41、gt;  int r,y,i,n;</p><p>  typedef struct{ </p><p>  int *base; //棧底</p><p>  int *top; //棧頂</p><p>  int stacksize; //棧容量</p><p>&l

42、t;b>  }SqStack;</b></p><p>  // SqStack定義棧,說明base為棧底指針,top為棧頂指針,stacksize為棧容量</p><p>  /*一下為int InitStack(SqStack &S)到int DestroyStack(SqStack &S)六大模塊分別表示構造一個空棧、用e表示棧元素、插入元素、刪除元

43、素、判斷棧是否為空以及摧毀棧;*/</p><p>  int InitStack(SqStack &S){ //構造一個空棧</p><p>  S.base=(int *)malloc(STACK_INIT_SIZE *sizeof(int));</p><p>  if(!S.base) exit(0); //存儲空間失敗</p&g

44、t;<p>  S.top=S.base;</p><p>  S.stacksize=STACK_INIT_SIZE;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int GetTop(SqStack S, in

45、t &e){ </p><p>  //若棧不為空,則用e返回S的棧頂元素,并返回0,否則返回1</p><p>  if(S.top==S.base) return 1;</p><p>  e=*(S.top-1);</p><p><b>  return 0;</b></p><p

46、><b>  }</b></p><p>  int Push(SqStack &S , int e){ //插入元素e為新的棧頂元素</p><p>  if(S.top-S.base>=S.stacksize){ //棧滿,追加存儲空間</p><p>  S.base=(int *)realloc(S.

47、base,</p><p>  (S.stacksize+STACKINCREMENT)*sizeof(int));</p><p>  if(!S.base) return 1 ; //存儲分配失敗</p><p>  S.top=S.base+S.stacksize;</p><p>  S.stacksize+=STACKINCR

48、EMENT;</p><p><b>  }</b></p><p>  *S.top++=e;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  int Pop(SqStack &

49、;S, int &e){ </p><p>  //若棧不空,則刪除S的棧頂元素,用e返回其值,并返回0,否則返回1</p><p>  if(S.top==S.base) return 1;</p><p>  e=*--S.top;</p><p><b>  return 0;</b></p&g

50、t;<p><b>  }</b></p><p>  int StackEmpty(SqStack S){ //若??眨瑒t返回1,否則返回0</p><p>  if(S.top==S.base)</p><p><b>  return 1;</b></p><p>  ret

51、urn 0 ;</p><p><b>  }</b></p><p>  int DestroyStack(SqStack &S){ //銷毀棧S,棧S不再存在</p><p>  free(S.base);</p><p>  S.top=NULL; //防止程序后面不小心使用了它

52、</p><p>  S.base=S.top;</p><p>  return 0 ;</p><p><b>  }</b></p><p>  //以下 SqStack S是指定義棧S</p><p>  SqStack S; //定義棧S</p>&

53、lt;p>  // 下面的D2M(int a,int b)的功能是將十進制數(shù)轉換成M進制的函數(shù)</p><p>  DtoM(int a,int b) //十進制轉換成其他進制的函數(shù)DtoM()</p><p><b>  {</b></p><p><b>  while(a)</b><

54、/p><p><b>  {</b></p><p><b>  r=a%b;</b></p><p><b>  if(r>9)</b></p><p><b>  r=r+55;</b></p><p>  Push(S,r)

55、; //壓入棧</p><p>  a/=b; //轉換成M進制</p><p><b>  }</b></p><p>  printf("該數(shù)轉換成%d進制的結果:",b);</p><p>  while(!StackEmpty(S))</p>&l

56、t;p><b>  {</b></p><p>  Pop(S,e); //彈出棧</p><p><b>  if(e>=65)</b></p><p>  printf("%c",e);</p><p><b>  else</b>

57、;</p><p>  printf("%d",e);</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  // 下面是MtoD(

58、),它的功能是M進制轉換為十進制的函數(shù)</p><p>  MtoD() //其他進制轉換為十進制的函數(shù)MtoD()</p><p><b>  {</b></p><p>  char c[1000];</p><p>  printf("請輸入需要轉換的數(shù)的位數(shù):")

59、;</p><p>  scanf("%d",&n);</p><p>  printf("請輸入需要轉換的數(shù)的每位并用空格隔開:");</p><p>  for(i=0;i<n;i++)</p><p><b>  {</b></p><p&g

60、t;  scanf("%x",&c[i]);</p><p>  Push(S,c[i]);</p><p><b>  }</b></p><p><b>  i=0;</b></p><p>  while(!StackEmpty(S))</p><

61、;p><b>  {</b></p><p><b>  Pop(S,e);</b></p><p>  y+=(int)pow(m,i)*e;</p><p><b>  i++;</b></p><p><b>  }</b></p>

62、<p>  printf("轉換成10進制的結果是:");</p><p>  printf("%d",y);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  //void ma

63、in()是主函數(shù)。其功能是輸入需要測試的數(shù)據(jù)以及需要轉換的進制,并在特定情形下調用DtoM()函數(shù)和MtoD()函數(shù),而且實現(xiàn)M進制數(shù)向任意非M進制數(shù)的轉換</p><p>  void main()</p><p><b>  {</b></p><p><b>  int t;</b></p><p

64、><b>  for(;;) </b></p><p><b>  { </b></p><p>  printf("\t\t* * * * * * ^-^ welcome !!! ^-^ * * * * * * \n"); </p><p>  printf("\t\t

65、 數(shù)制轉換系統(tǒng) \n"); </p><p>  printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"); </p><p>  printf("\t\t

66、 \n"); </p><p>  printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"); </p><p>  printf("\t\t* 1. 進入數(shù)制轉換系統(tǒng) *\n"); </p>

67、<p>  printf("\t\t* 2. 退出該系統(tǒng) *\n"); </p><p>  printf("\t\t* * * * * * * * * * * * * * * * * * * * * * *\n"); </p><p>  printf("\

68、t\t 請選擇(1-2):"); </p><p>  loop:scanf("%d",&t); </p><p>  switch(t) </p><p>  { case 1:InitStack(S); //構造一個空棧</p><p>  printf("

69、;請輸入需要轉換的進制M(2or8or10or16):");</p><p>  scanf("%d",&m);</p><p>  if(m==10) //十進制轉換成其他進制</p><p><b>  {</b></p><p>  pr

70、intf("請給定一個需要轉換的10進制數(shù):");</p><p>  scanf("%d",&x);</p><p>  printf("請輸入需要轉換成的進制數(shù):");</p><p>  scanf("%d",&t);</p><p>  D

71、toM(x,t);</p><p><b>  }</b></p><p>  if(m==2||m==8||m==16) //其他進制轉換成十進制,且其他任意進制的相互轉換</p><p><b>  {</b></p><p><b>  MtoD();&l

72、t;/b></p><p>  printf("\n給定要轉換成的進制M:");</p><p>  scanf("%d",&s);</p><p>  DtoM(y,s);</p><p><b>  }</b></p><p>  prin

73、tf("\n");</p><p>  DestroyStack(S); //銷毀棧S,棧S不再存在</p><p><b>  break;</b></p><p>  case 2: exit(0); </p><p>  default:{ printf("輸入有誤,請重

74、新選擇:"); </p><p>  goto loop;} </p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }<

75、;/b></p><p><b>  4、調試分析</b></p><p><b>  數(shù)組調試結果如圖:</b></p><p><b>  棧調試結果:</b></p><p><b>  5、心得總結</b></p><p&

溫馨提示

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

評論

0/150

提交評論