2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩25頁(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>  《數(shù)據(jù)結(jié)構(gòu)》</b></p><p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  設(shè)計(jì)題目 哈 夫 曼 (Huffman) 編/譯 碼 器 </p><p>  學(xué)院名稱 信 息 工 程 學(xué) 院 </p>&

2、lt;p>  專 業(yè) 班 級(jí) </p><p>  姓 名 </p><p>  學(xué) 號(hào) ______</p><p

3、>  題目:哈夫曼(Huffman)編/譯碼器</p><p><b>  一、問(wèn)題描述</b></p><p>  利用哈夫曼編碼進(jìn)行通信可以大大提高信道利用率,縮短信息傳輸時(shí)間,降低傳輸成本。但是,這要求在發(fā)送端通過(guò)一個(gè)編碼系統(tǒng)對(duì)待傳數(shù)據(jù)預(yù)先編碼,在接收端將傳來(lái)的數(shù)據(jù)進(jìn)行譯碼(復(fù)原)。對(duì)于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個(gè)完整的編/譯碼系統(tǒng)

4、。試為這樣的信息收發(fā)站寫一個(gè)哈夫曼碼的編/譯碼系統(tǒng)。</p><p><b>  二、設(shè)計(jì)目標(biāo)</b></p><p>  幫助學(xué)生熟練掌握樹的應(yīng)用和基本操作,重點(diǎn)掌握二叉樹的存儲(chǔ),這里以哈夫曼樹為設(shè)計(jì)目標(biāo)進(jìn)一步提高學(xué)生的設(shè)計(jì)能力及對(duì)樹的理解。</p><p><b>  三、任務(wù)要求</b></p><

5、;p>  一個(gè)完整的系統(tǒng)應(yīng)具有以下功能:</p><p>  1) I:初始化(Initialization)。從終端讀入字符集大小n,以及n個(gè)字符和n個(gè)權(quán)值,建立哈夫曼樹,并將它存于文件hfmTree中。</p><p>  2) E:編碼(Encoding)。利用以建好的哈夫曼樹(如不在內(nèi)存,則從文件hfmTree中讀入),對(duì)文件ToBeTran中的正文進(jìn)行編碼,然后將結(jié)果存入文

6、件CodeFile中。 </p><p>  3) D:譯碼(Decoding)。利用已建好的哈夫曼樹將文件CodeFile中的代碼進(jìn)行譯碼,結(jié)果存入文件TextFile中。 </p><p>  4) P:印代碼文件(Print)。將文件CodeFile以緊湊格式顯示在終端上,每行50個(gè)代碼。同時(shí)將此字符形式的編碼文件寫入文件CodePrin中。 </p><p>

7、;  5) T:印哈夫曼樹(Tree Printing)。將已在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時(shí)將此字符形式的哈夫曼樹寫入文件TreePrint中。</p><p><b>  四、需求分析</b></p><p>  利用哈夫曼樹(Huffman)編/譯碼</p><p> ?。ㄒ唬⒊跏蓟蚵鼧?lt;/p

8、><p> ?。ǘ?、建立哈夫曼樹</p><p>  (三)、對(duì)哈夫曼樹進(jìn)行編碼</p><p> ?。ㄋ模⑤敵鰧?duì)應(yīng)字符的編碼</p><p><b> ?。ㄎ澹?、譯碼過(guò)程</b></p><p><b>  五、概要設(shè)計(jì)</b></p><p>  

9、哈夫曼樹的存儲(chǔ)結(jié)構(gòu)描述</p><p>  typedef struct</p><p><b>  {</b></p><p>  unsigned int weight;</p><p>  unsigned int parent, lchild, rchild;</p><p>  }HTN

10、ode, *HuffmanTree; </p><p><b>  哈弗曼樹的算法</b></p><p>  void CreateHT(HTNode ht[],int n) //調(diào)用輸入的數(shù)組ht[],和節(jié)點(diǎn)數(shù)n</p><p><b>  {</b></p><p&g

11、t;  int i,k,lnode,rnode;</p><p>  int min1,min2;</p><p>  for (i=0;i<2*n-1;i++) </p><p>  ht[i].parent=ht[i].lchild=ht[i].rchild=-1; //所有結(jié)點(diǎn)的相關(guān)域置初值-1</p><p>

12、  for (i=n;i<2*n-1;i++) //構(gòu)造哈夫曼樹</p><p><b>  {</b></p><p>  min1=min2=32767; //int的范圍是-32768—32767</p><p>  lnode=rnode=-1;

13、 //lnode和rnode記錄最小權(quán)值的兩個(gè)結(jié)點(diǎn)位置</p><p>  for (k=0;k<=i-1;k++)</p><p><b>  {</b></p><p>  if (ht[k].parent==-1) //只在尚未構(gòu)造二叉樹的結(jié)點(diǎn)中查找</p><p>

14、<b>  {</b></p><p>  if (ht[k].weight<min1) //若權(quán)值小于最小的左節(jié)點(diǎn)的權(quán)值</p><p><b>  {</b></p><p>  min2=min1;rnode=lnode;</p><p>  min1=ht[k].w

15、eight;lnode=k;</p><p><b>  }</b></p><p>  else if (ht[k].weight<min2)</p><p><b>  {</b></p><p>  min2=ht[k].weight;rnode=k;</p><p&

16、gt;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  ht[lnode].parent=i;ht[rnode].parent=i; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)是i</p><p&

17、gt;  ht[i].weight=ht[lnode].weight+ht[rnode].weight; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)權(quán)值為兩個(gè)最小節(jié)點(diǎn)權(quán)值之和</p><p>  ht[i].lchild=lnode;ht[i].rchild=rnode; //父節(jié)點(diǎn)的左節(jié)點(diǎn)和右節(jié)點(diǎn)</p><p><b>  }</b>&l

18、t;/p><p><b>  }</b></p><p><b>  哈弗曼編碼</b></p><p>  void CreateHCode(HTNode ht[],HCode hcd[],int n)</p><p><b>  {</b></p><p&g

19、t;  int i,f,c;</p><p><b>  HCode hc;</b></p><p>  for (i=0;i<n;i++) //根據(jù)哈夫曼樹求哈夫曼編碼</p><p><b>  {</b></p><p>  hc.s

20、tart=n;c=i;</p><p>  f=ht[i].parent;</p><p>  while (f!=-1) //循序直到樹根結(jié)點(diǎn)結(jié)束循環(huán)</p><p><b>  {</b></p><p>  if (ht[f].lchild==c)

21、 //處理左孩子結(jié)點(diǎn)</p><p>  hc.cd[hc.start--]='0';</p><p>  else //處理右孩子結(jié)點(diǎn)</p><p>  hc.cd[hc.start--]='1';</p>&l

22、t;p>  c=f;f=ht[f].parent;</p><p><b>  }</b></p><p>  hc.start++; //start指向哈夫曼編碼hc.cd[]中最開始字符</p><p>  hcd[i]=hc;</p><p><

23、;b>  }</b></p><p><b>  }</b></p><p>  void DispHCode(HTNode ht[],HCode hcd[],int n) //輸出哈夫曼編碼的列表</p><p><b>  {</b></p><p><b>

24、  int i,k;</b></p><p>  printf(" 輸出哈夫曼編碼:\n"); </p><p>  for (i=0;i<n;i++) //輸出data中的所有數(shù)據(jù),即A-Z</p><p><b>  {</b></p&

25、gt;<p>  printf(" %c:\t",ht[i].data); </p><p>  for (k=hcd[i].start;k<=n;k++) //輸出所有data中數(shù)據(jù)的編碼</p><p><b>  {</b></p>

26、<p>  printf("%c",hcd[i].cd[k]); </p><p><b>  }</b></p><p>  printf("\n");</p><p><b>  }</b></p><p>

27、;<b>  }</b></p><p>  void editHCode(HTNode ht[],HCode hcd[],int n) //編碼函數(shù)</p><p><b>  {</b></p><p>  char string[MAXSIZE]; </p&g

28、t;<p>  int i,j,k;</p><p>  scanf("%s",string); //把要進(jìn)行編碼的字符串存入string數(shù)組中</p><p>  printf("\n輸出編碼結(jié)果:\n");</p><p>  for (i=0;string[i]!

29、='#';i++) //#為終止標(biāo)志</p><p><b>  {</b></p><p>  for (j=0;j<n;j++)</p><p><b>  {</b></p><p>  if(string[i]==ht[j].data)

30、 //循環(huán)查找與輸入字符相同的編號(hào),相同的就輸出這個(gè)字符的編碼</p><p><b>  {</b></p><p>  for (k=hcd[j].start;k<=n;k++)</p><p><b>  {</b></p><p>  printf("%

31、c",hcd[j].cd[k]);</p><p><b>  }</b></p><p>  break; //輸出完成后跳出當(dāng)前for循環(huán)</p><p><b>  }</b></p><p><b>  }</b>&l

32、t;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  哈弗曼譯碼</b></p><p>  void deHCode(HTNode ht[],HCode hcd[],int n) //譯碼函數(shù)</p>

33、<p><b>  {</b></p><p>  char code[MAXSIZE];</p><p>  int i,j,l,k,m,x;</p><p>  scanf("%s",code); //把要進(jìn)行譯碼的字符串存入code數(shù)組中</p>

34、<p>  while(code[0]!='#')</p><p>  for (i=0;i<n;i++)</p><p><b>  {</b></p><p>  m=0; //m為想同編碼個(gè)數(shù)的計(jì)數(shù)器</p><p>  

35、for (k=hcd[i].start,j=0;k<=n;k++,j++) //j為記錄所存儲(chǔ)這個(gè)字符的編碼個(gè)數(shù)</p><p><b>  {</b></p><p>  if(code[j]==hcd[i].cd[k]) //當(dāng)有相同編碼時(shí)m值加1</p><p><b>  m++;</

36、b></p><p><b>  }</b></p><p>  if(m==j) //當(dāng)輸入的字符串與所存儲(chǔ)的編碼字符串個(gè)數(shù)相等時(shí)則輸出這個(gè)的data數(shù)據(jù)</p><p><b>  {</b></p><p>  printf(&

37、quot;%c",ht[i].data);</p><p>  for(x=0;code[x-1]!='#';x++) //把已經(jīng)使用過(guò)的code數(shù)組里的字符串刪除</p><p><b>  {</b></p><p>  code[x]=code[x+j];</p><p&g

38、t;<b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  主函數(shù)</b></p><p> 

39、 void main()</p><p><b>  {</b></p><p>  int n=26,i;</p><p>  char orz,back,flag=1;</p><p>  char str[]={'A','B','C','D','

40、;E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W&#

41、39;,'X','Y','Z'}; //初始化</p><p>  int fnum[]={186,64,13,22,32,103,21,15,47,57,1,2,32,20,57,63,15,1,48,51,80,23,8,18,1,16}; //初始化</p><p>  HTNode ht[M];

42、 //建立結(jié)構(gòu)體</p><p>  HCode hcd[N]; //建立結(jié)構(gòu)體</p><p>  for (i=0;i<n;i++) //把初始化的數(shù)據(jù)存入ht結(jié)構(gòu)體中</p><p><b>  {</b></p><p>  ht[i].data=str[

43、i];</p><p>  ht[i].weight=fnum[i];</p><p><b>  }</b></p><p>  while (flag) //菜單函數(shù),當(dāng)flag為0時(shí)跳出循環(huán)</p><p><b>  顯示部分源程序:</b></p>

44、;<p><b>  {</b></p><p>  printf("\n");</p><p>  printf(" ********************************");</p><p>  printf("\n ** 1-------

45、--------顯示編碼 **");</p><p>  printf("\n ** 2---------------進(jìn)行編碼 **");</p><p>  printf("\n ** 3---------------進(jìn)行譯碼 **");</p><p>  printf("\

46、n ** 4---------------退出 **\n");</p><p>  printf(" * **********************************");</p><p>  printf("\n");</p><p>  printf("

47、 請(qǐng)輸入選擇的編號(hào):");</p><p>  scanf("%c",&orz);</p><p>  switch(orz)</p><p><b>  {</b></p><p><b>  case 'a':</b></p>

48、;<p><b>  case 'A':</b></p><p>  system("cls"); //清屏函數(shù)</p><p>  CreateHT(ht,n);</p><p>  CreateHCode(ht,hcd,n);</p>

49、;<p>  DispHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  system("cls");</p><p><b>  br

50、eak;</b></p><p><b>  case 'b':</b></p><p><b>  case 'B':</b></p><p>  system("cls");</p><p>  printf("請(qǐng)輸入要進(jìn)

51、行編碼的字符串(以#結(jié)束):\n");</p><p>  editHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  system("cls");&

52、lt;/p><p><b>  break;</b></p><p><b>  case 'c':</b></p><p><b>  case 'C':</b></p><p>  system("cls");</p&g

53、t;<p>  DispHCode(ht,hcd,n);</p><p>  printf("請(qǐng)輸入編碼(以#結(jié)束):\n");</p><p>  deHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返回...");</p><p><b> 

54、 getch();</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>  case 'd':</b></p><p><b>  case 'D'

55、;:</b></p><p><b>  flag=0;</b></p><p><b>  break;</b></p><p><b>  default:</b></p><p>  system("cls");</p>&l

56、t;p><b>  }}}</b></p><p><b>  六、詳細(xì)設(shè)計(jì)</b></p><p>  由上表畫出哈夫曼樹:</p><p>  由哈夫曼樹得出各字符的編碼:</p><p><b>  關(guān)系調(diào)用:</b></p><p><

57、;b>  該程序的流程圖:</b></p><p><b>  七、測(cè)試分析</b></p><p><b>  白盒:</b></p><p><b>  查看代碼完整性</b></p><p>  白盒測(cè)試也稱結(jié)構(gòu)測(cè)試或邏輯驅(qū)動(dòng)測(cè)試,它是按照程序內(nèi)部的結(jié)構(gòu)

58、測(cè)試程序,通過(guò)測(cè)試來(lái)檢測(cè)產(chǎn)品內(nèi)部動(dòng)作是否按照設(shè)計(jì)規(guī)格說(shuō)明書的規(guī)定正常進(jìn)行,檢驗(yàn)程序中的每條通路是否都能按預(yù)定要求正確工作。 這一方法是把測(cè)試對(duì)象看作一個(gè)打開的盒子,測(cè)試人員依據(jù)程序內(nèi)部邏輯結(jié)構(gòu)相關(guān)信息,設(shè)計(jì)或選擇測(cè)試用例,對(duì)程序所有邏輯路徑進(jìn)行測(cè)試,通過(guò)在不同點(diǎn)檢查程序的狀態(tài),確定實(shí)際的狀態(tài)是否與預(yù)期的狀態(tài)一致。</p><p><b>  黑盒:</b></p><p&

59、gt;  測(cè)試是否可以正確的創(chuàng)建,刪除,插入,打印,查找等操作</p><p>  黑盒測(cè)試也稱功能測(cè)試,它是通過(guò)測(cè)試來(lái)檢測(cè)每個(gè)功能是否都能正常使用。在測(cè)試中,把程序看作一個(gè)不能打開的黑盒子,在完全不考慮程序內(nèi)部結(jié)構(gòu)和內(nèi)部特性的情況下,在程序接口進(jìn)行測(cè)試,它只檢查程序功能是否按照需求規(guī)格說(shuō)明書的規(guī)定正常使用,程序是否能適當(dāng)?shù)亟邮蛰斎霐?shù)據(jù)而產(chǎn)生正確的輸出信息。黑盒測(cè)試著眼于程序外部結(jié)構(gòu),不考慮內(nèi)部邏輯結(jié)構(gòu),主要針對(duì)

60、軟件界面和軟件功能進(jìn)行測(cè)試。</p><p><b>  八、使用說(shuō)明</b></p><p>  1) 輸入n個(gè)字符的權(quán)值</p><p>  2) 輸入對(duì)應(yīng)的字符</p><p>  3) 得出各字符的編碼</p><p><b>  九、測(cè)試數(shù)據(jù)</b></p&g

61、t;<p>  用下表給出的字符集和頻度的實(shí)際統(tǒng)計(jì)數(shù)據(jù)建立哈夫曼樹,并實(shí)現(xiàn)以下報(bào)文的編碼和譯碼:“THIS PROGRAM IS MY FAVORITE”。</p><p>  字符 空格 A B C D E F G H I J K L M </p><p>  頻度 186 64 13 22 32 103 21 15 47 57 1 5 32 20  </p>

62、<p>  字符 N O P Q R S T U V W X Y Z  </p><p>  頻度 57 63 15 1 48 51 80 23 8 18 1 16 1</p><p>  注:學(xué)生在測(cè)試數(shù)據(jù)時(shí),需要寫出測(cè)試用例和截圖</p><p><b>  十、該程序的源代碼</b></p><p> 

63、 #include <stdio.h></p><p>  #include <stdlib.h> //要用system函數(shù)要調(diào)用的頭文件</p><p>  #include<conio.h> //用getch()要調(diào)用的頭文件</p><p>  #include <string.

64、h></p><p>  #define N 50 //義用N表示50葉節(jié)點(diǎn)數(shù)</p><p>  #define M 2*N-1 //用M表示節(jié)點(diǎn)總數(shù) 當(dāng)葉節(jié)點(diǎn)數(shù)位n時(shí)總節(jié)點(diǎn)數(shù)為2n-1</p><p>  #define MAXSIZE 100</p><p>  type

65、def struct</p><p><b>  {</b></p><p>  char data; //結(jié)點(diǎn)值</p><p>  int weight; //權(quán)值</p><p>  int parent; //雙親結(jié)

66、點(diǎn)</p><p>  int lchild; //左孩子結(jié)點(diǎn)</p><p>  int rchild; //右孩子結(jié)點(diǎn)</p><p>  }HTNode; </p><p>  typedef struct</p><

67、;p><b>  {</b></p><p>  char cd[N]; //存放哈夫曼碼</p><p>  int start; //從start開始讀cd中的哈夫曼碼</p><p><b>  }HCode;</b></p>&l

68、t;p>  void CreateHT(HTNode ht[],int n) //調(diào)用輸入的數(shù)組ht[],和節(jié)點(diǎn)數(shù)n</p><p><b>  {</b></p><p>  int i,k,lnode,rnode;</p><p>  int min1,min2;</p><p>

69、  for (i=0;i<2*n-1;i++) </p><p>  ht[i].parent=ht[i].lchild=ht[i].rchild=-1; //所有結(jié)點(diǎn)的相關(guān)域置初值-1</p><p>  for (i=n;i<2*n-1;i++) //構(gòu)造哈夫曼樹</p><p><b>

70、;  {</b></p><p>  min1=min2=32767; //int的范圍是-32768—32767</p><p>  lnode=rnode=-1; //lnode和rnode記錄最小權(quán)值的兩個(gè)結(jié)點(diǎn)位置</p><p>  for (k=0;k<=i-1;k++)&l

71、t;/p><p><b>  {</b></p><p>  if (ht[k].parent==-1) //只在尚未構(gòu)造二叉樹的結(jié)點(diǎn)中查找</p><p><b>  {</b></p><p>  if (ht[k].weight<min1) /

72、/若權(quán)值小于最小的左節(jié)點(diǎn)的權(quán)值</p><p><b>  {</b></p><p>  min2=min1;rnode=lnode;</p><p>  min1=ht[k].weight;lnode=k;</p><p><b>  }</b></p><p>  el

73、se if (ht[k].weight<min2)</p><p><b>  {</b></p><p>  min2=ht[k].weight;rnode=k;</p><p><b>  }</b></p><p><b>  }</b></p>&l

74、t;p><b>  }</b></p><p>  ht[lnode].parent=i;ht[rnode].parent=i; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)是i</p><p>  ht[i].weight=ht[lnode].weight+ht[rnode].weight; //兩個(gè)最小節(jié)點(diǎn)的父節(jié)點(diǎn)權(quán)值為兩個(gè)最小節(jié)點(diǎn)權(quán)值

75、之和</p><p>  ht[i].lchild=lnode;ht[i].rchild=rnode; //父節(jié)點(diǎn)的左節(jié)點(diǎn)和右節(jié)點(diǎn)</p><p><b>  }</b></p><p><b>  }</b></p><p>  void CreateHCode(H

76、TNode ht[],HCode hcd[],int n)</p><p><b>  {</b></p><p>  int i,f,c;</p><p><b>  HCode hc;</b></p><p>  for (i=0;i<n;i++)

77、 //根據(jù)哈夫曼樹求哈夫曼編碼</p><p><b>  {</b></p><p>  hc.start=n;c=i;</p><p>  f=ht[i].parent;</p><p>  while (f!=-1) //循序直到樹根結(jié)點(diǎn)結(jié)束循環(huán)

78、</p><p><b>  {</b></p><p>  if (ht[f].lchild==c) //處理左孩子結(jié)點(diǎn)</p><p>  hc.cd[hc.start--]='0';</p><p>  else

79、 //處理右孩子結(jié)點(diǎn)</p><p>  hc.cd[hc.start--]='1';</p><p>  c=f;f=ht[f].parent;</p><p><b>  }</b></p><p>  hc.start++;

80、 //start指向哈夫曼編碼hc.cd[]中最開始字符</p><p>  hcd[i]=hc;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void DispHCode(HTNode ht[],HCode hcd[],int n

81、) //輸出哈夫曼編碼的列表</p><p><b>  {</b></p><p><b>  int i,k;</b></p><p>  printf(" 輸出哈夫曼編碼:\n"); </p><p>  for (i=0;i<n;i++)

82、 //輸出data中的所有數(shù)據(jù),即A-Z</p><p><b>  {</b></p><p>  printf(" %c:\t",ht[i].data); </p><p>  for (k=hcd[i].start;k<=n;k++)

83、 //輸出所有data中數(shù)據(jù)的編碼</p><p><b>  {</b></p><p>  printf("%c",hcd[i].cd[k]); </p><p><b>  }</b></p><p&

84、gt;  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  void editHCode(HTNode ht[],HCode hcd[],int n) //編碼函數(shù)</p><p><b&g

85、t;  {</b></p><p>  char string[MAXSIZE]; </p><p>  int i,j,k;</p><p>  scanf("%s",string); //把要進(jìn)行編碼的字符串存入string數(shù)組中</p

86、><p>  printf("\n輸出編碼結(jié)果:\n");</p><p>  for (i=0;string[i]!='#';i++) //#為終止標(biāo)志</p><p><b>  {</b></p><p>  for (j=0;j<n;j++)

87、</p><p><b>  {</b></p><p>  if(string[i]==ht[j].data) //循環(huán)查找與輸入字符相同的編號(hào),相同的就輸出這個(gè)字符的編碼</p><p><b>  {</b></p><p>  for (k=hcd[j].start;k

88、<=n;k++)</p><p><b>  {</b></p><p>  printf("%c",hcd[j].cd[k]);</p><p><b>  }</b></p><p>  break; //輸出完成后跳出當(dāng)前fo

89、r循環(huán)</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void deHCode(HTNode ht

90、[],HCode hcd[],int n) //譯碼函數(shù)</p><p><b>  {</b></p><p>  char code[MAXSIZE];</p><p>  int i,j,l,k,m,x;</p><p>  scanf("%s",code);

91、 //把要進(jìn)行譯碼的字符串存入code數(shù)組中</p><p>  while(code[0]!='#')</p><p>  for (i=0;i<n;i++)</p><p><b>  {</b></p><p>  m=0;

92、 //m為想同編碼個(gè)數(shù)的計(jì)數(shù)器</p><p>  for (k=hcd[i].start,j=0;k<=n;k++,j++) //j為記錄所存儲(chǔ)這個(gè)字符的編碼個(gè)數(shù)</p><p><b>  {</b></p><p>  if(code[j]==hcd[i].cd[k]) //當(dāng)有相同編碼時(shí)m

93、值加1</p><p><b>  m++;</b></p><p><b>  }</b></p><p>  if(m==j) //當(dāng)輸入的字符串與所存儲(chǔ)的編碼字符串個(gè)數(shù)相等時(shí)則輸出這個(gè)的data數(shù)據(jù)</p><p><b>

94、  {</b></p><p>  printf("%c",ht[i].data);</p><p>  for(x=0;code[x-1]!='#';x++) //把已經(jīng)使用過(guò)的code數(shù)組里的字符串刪除</p><p><b>  {</b></p><

95、p>  code[x]=code[x+j];</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  

96、void main()</p><p><b>  {</b></p><p>  int n=26,i;</p><p>  char orz,back,flag=1;</p><p>  char str[]={'A','B','C','D','

97、E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W

98、9;,'X','Y','Z'}; //初始化</p><p>  int fnum[]={186,64,13,22,32,103,21,15,47,57,1,2,32,20,57,63,15,1,48,51,80,23,8,18,1,16}; //初始化</p><p>  HTNode ht[M];

99、 //建立結(jié)構(gòu)體</p><p>  HCode hcd[N]; //建立結(jié)構(gòu)體</p><p>  for (i=0;i<n;i++) //把初始化的數(shù)據(jù)存入ht結(jié)構(gòu)體中</p><p><b>  {</b></p><p>  ht[i].data=str[i

100、];</p><p>  ht[i].weight=fnum[i];</p><p><b>  }</b></p><p>  while (flag) //菜單函數(shù),當(dāng)flag為0時(shí)跳出循環(huán)</p><p><b>  {</b></p><p

101、>  printf("\n");</p><p>  printf(" **************************************");</p><p>  printf("\n ** A---------------顯示編碼 **");</p><p>  

102、printf("\n ** B---------------進(jìn)行編碼 **");</p><p>  printf("\n ** C---------------進(jìn)行譯碼 **");</p><p>  printf("\n ** D---------------退出 **\n");&l

103、t;/p><p>  printf(" ****************************************");</p><p>  printf("\n");</p><p>  printf(" 請(qǐng)輸入選擇的編號(hào):");</p><p>  

104、scanf("%c",&orz);</p><p>  switch(orz)</p><p><b>  {</b></p><p><b>  case 'a':</b></p><p><b>  case 'A':<

105、/b></p><p>  system("cls"); //清屏函數(shù)</p><p>  CreateHT(ht,n);</p><p>  CreateHCode(ht,hcd,n);</p><p>  DispHCode(ht,hcd,n);</p>

106、<p>  printf("\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  system("cls");</p><p><b>  break;</b></p><p><b>

107、  case 'b':</b></p><p><b>  case 'B':</b></p><p>  system("cls");</p><p>  printf("請(qǐng)輸入要進(jìn)行編碼的字符串(以#結(jié)束):\n");</p><p>

108、;  editHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  system("cls");</p><p><b>  break;</b&

109、gt;</p><p><b>  case 'c':</b></p><p><b>  case 'C':</b></p><p>  system("cls");</p><p>  DispHCode(ht,hcd,n);</p>

110、;<p>  printf("請(qǐng)輸入編碼(以#結(jié)束):\n");</p><p>  deHCode(ht,hcd,n);</p><p>  printf("\n按任意鍵返回...");</p><p><b>  getch();</b></p><p>  sy

111、stem("cls");</p><p><b>  break;</b></p><p><b>  case 'd':</b></p><p><b>  case 'D':</b></p><p><b>  

112、flag=0;</b></p><p><b>  break;</b></p><p><b>  default:</b></p><p>  system("cls");</p><p><b>  }</b></p><

113、;p><b>  }</b></p><p><b>  }</b></p><p><b> ?。?lt;/b></p><p><b>  該程序的截圖:</b></p><p><b>  初始化界面截圖如下</b></p

114、><p>  選A時(shí)的顯示結(jié)果截圖如下</p><p>  選擇B時(shí)的顯示結(jié)果截圖如下</p><p>  選C時(shí)的顯示結(jié)果截圖如下</p><p>  十一、使用說(shuō)明(給出軟件如何使用,使用時(shí)的注意事項(xiàng))</p><p>  VC++6.0編程環(huán)境使用</p><p>  1、 VC++

115、6.0程序啟動(dòng) </p><p>  2、新建工程Project</p><p>  3、 設(shè)定工程Project名稱、保存位置 </p><p>  4、 設(shè)定工程Project的類型 </p><p>  5、 工程Project的描述信息生成</p><p&

116、gt;  6、 空工程Project建立完畢</p><p>  7) 向工程Project中添加(新建)源代碼文件的類型、名稱、保存位置 </p><p>  8、設(shè)定源代碼文件的類型、名稱</p><p>  9、 源代碼文件被添加到工程中 </p><p>  10、在源代碼文件中添加程

117、序代碼</p><p>  11、程序代碼編譯完成后編譯、鏈接過(guò)程</p><p><b>  注意事項(xiàng): </b></p><p> ?。?) 一個(gè)工程project中可以有多個(gè)源文件(.cpp)、多個(gè)頭文件(.h);</p><p>  但這些源代碼文件中只能出現(xiàn)一個(gè)main函數(shù),作為整個(gè)程序運(yùn)&

118、lt;/p><p><b>  行的入口; </b></p><p> ?。?)必須關(guān)閉前一次程序運(yùn)行結(jié)果窗口,才能進(jìn)行下一次程序運(yùn)行; </p><p> ?。?)書寫標(biāo)識(shí)符時(shí),忽略了大小寫字母的區(qū)別。 </p><p> ?。? )  忘記加分號(hào) </p>

119、<p><b> ?。?) 多加分號(hào)</b></p><p><b>  十二、課程設(shè)計(jì)總結(jié)</b></p><p>  本次課程設(shè)計(jì)的題目是:哈夫曼(Huffman)編/譯碼器。通過(guò)這次課程設(shè)計(jì),我了解到自己在編寫程序方面還有很多不足,在實(shí)踐過(guò)程中老師給了我很大的幫助。在這次課程設(shè)計(jì)中,雖然不會(huì)成功的編寫一個(gè)完整的程序,但是在看程序的

溫馨提示

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