哈夫曼樹課程設計報告_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)據(jù)結構</b></p><p><b>  課程設計報告</b></p><p>  設計題目:哈夫曼樹應用</p><p>  專 業(yè) : 軟件工程 </p><p>  班 級 : 軟件

2、 </p><p>  學 生 : </p><p>  學 號 : </p><p>  指導教師 : </p><p>  起止時間 :2011-07-04—2011-07-08 <

3、/p><p>  2011 年 春季 學期</p><p><b>  目 錄</b></p><p>  一.具體任務…..2</p><p>  1功能……………………………………………………………………………...2</p><p>  2分步實施……………………………………………………

4、…………………...2.</p><p>  3要求……………………………………………………………………………...2</p><p><b>  二.哈夫曼編碼2</b></p><p><b>  1問題描述2</b></p><p><b>  2.基本要求3</b>

5、;</p><p><b>  3實現(xiàn)提示3</b></p><p><b>  三.設計流程圖4</b></p><p>  1建立哈夫曼樹…………………………………………………………………...4</p><p>  2編碼……………………………………………………………………………...5&

6、lt;/p><p>  3譯碼……………………………………………………………………………...6</p><p>  4主程序…………………………………………………………………………...7</p><p><b>  四.設計概要8</b></p><p>  1問題哈夫曼的定義.....................

7、.........................................................................8..</p><p>  2所實現(xiàn)的功能函數(shù)如下………………………………………………………..8</p><p>  3功能模塊………………………………………………………………………..8</p><p><b&g

8、t;  五.源程序9</b></p><p><b>  六.調試分析15</b></p><p>  七.心得與體會18</p><p><b>  八.參考文獻18</b></p><p><b>  一、任務</b></p><p&

9、gt;<b>  題目:哈夫曼樹應用</b></p><p><b>  1.功能: </b></p><p>  1.從終端讀入字符集大小n,以及n個字符和n個權值,建立哈夫曼樹并將它存于文件hfmTree中.將已在內存中的哈夫曼樹以直觀的方式(比如樹)顯示在終端上;</p><p>  2.利用已經(jīng)建好的哈夫曼樹(如不

10、在內存,則從文件htmTree中讀入),對文件ToBeTran中的正文進行</p><p>  編碼,然后將結果存入文件CodeFile中,并輸出結果,將文件CodeFile以緊湊格式先是在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件CodePrint中。</p><p>  3.利用已建好的哈夫曼樹將文件CodeFile中的代碼進行譯碼,結果存入文件TextFile中,并輸

11、出結果。</p><p><b>  2.分步實施:</b></p><p>  初步完成總體設計,搭好框架,確定人機對話的界面,確定函數(shù)個數(shù);</p><p>  完成最低要求:完成功能1;</p><p>  進一步要求:完成功能2和3。有興趣的同學可以自己擴充系統(tǒng)功能。</p><p>&l

12、t;b>  3.要求:</b></p><p>  1)界面友好,函數(shù)功能要劃分好</p><p>  2)總體設計應畫一流程圖</p><p>  3)程序要加必要的注釋</p><p><b>  要提供程序測試方案</b></p><p>  程序一定要經(jīng)得起測試,寧可功能

13、少一些,也要能運行起來,不能運行的程序是沒有價值的。</p><p><b>  二、哈夫曼編碼</b></p><p><b>  1. 問題描述</b></p><p>  利用赫夫曼編碼進行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。這要求在發(fā)送端通過一個編碼系統(tǒng)對待傳輸數(shù)據(jù)預先編碼,在接收端將傳來的

14、數(shù)據(jù)進行譯碼(復原)。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完整的編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站編寫一個赫夫曼碼的編/譯碼系統(tǒng)。</p><p><b>  基本要求</b></p><p>  一個完整的系統(tǒng)應具有以下功能:</p><p>  (1) I:初始化(Initialization)。從終端讀入字符集大小n,

15、以及n個字符和n個權值,建立赫夫曼樹,并將它存于文件hfmTree中。</p><p>  (2) E:編碼(Encoding)。利用已建好的赫夫曼樹(如不在內存,則從文件hfmTree中讀入),對文件ToBeTran中的正文進行編碼,然后將結果存入文件CodeFile中。</p><p>  (3) D:譯碼(Decoding)。利用已建好的赫夫曼樹將文件CodeFile中的代碼進行譯碼

16、,結果存入文件Textfile中。</p><p><b>  實現(xiàn)提示</b></p><p>  (1) 編碼結果以文本方式存儲在文件Codefile中。</p><p>  (2) 用戶界面可以設計為“菜單”方式:顯示上述功能符號,再加上“Q”,表示退出運行Quit。請用戶鍵入一個選擇功能符。此功能執(zhí)行完畢后再顯示此菜單,直至某次用戶選擇

17、了“Q”為止。</p><p>  (3) 在程序的一次執(zhí)行過程中,第一次執(zhí)行I, D或C命令之后,赫夫曼樹已經(jīng)在內存了,不必再讀入。每次執(zhí)行中不一定執(zhí)行I命令,因為文件hfmTree可能早已建好。</p><p><b>  三、設計流程圖</b></p><p><b>  建立哈夫曼樹:</b></p>

18、<p><b>  編碼:</b></p><p><b>  譯碼:</b></p><p><b>  主程序:</b></p><p><b>  四、概要設計</b></p><p>  1)問題哈夫曼的定義:</p>&

19、lt;p>  1.哈夫曼樹節(jié)點的數(shù)據(jù)類型定義為:</p><p>  typedef struct{ //赫夫曼樹的結構體</p><p><b>  char ch;</b></p><p>  int weight; //權值</p><p>  int paren

20、t,lchild,rchild;</p><p>  }htnode,*hfmtree;</p><p>  2)所實現(xiàn)的功能函數(shù)如下</p><p>  1、void hfmcoding(hfmtree &HT,hfmcode &HC,int n)初始化哈夫曼樹,處理InputHuffman(Huffman Hfm)函數(shù)得到的數(shù)據(jù),按照哈夫曼規(guī)則建

21、立2叉樹。此函數(shù)塊調用了Select()函數(shù)。</p><p>  2、void Select(hfmtree &HT,int a,int *p1,int *p2) //Select函數(shù),選出HT樹到a為止,權值最小且parent為0的2個節(jié)點</p><p>  3、 int main()</p><p>  主函數(shù): 利用已建好的哈夫曼

22、樹(如不在內存,則從文件hfmtree.txt中讀入)</p><p>  對文件中的正文進行編碼,然后將結果存入文件codefile.txt中。如果正文中沒有要編碼的字符,則鍵盤讀入并存儲到ToBeTran文件中。讀入ToBeTran中將要編碼的內容,將編碼好的哈夫曼編碼存儲到CodeFile中。</p><p>  4、Encoding </p><p>  編

23、碼功能:對輸入字符進行編碼</p><p>  5、Decoding</p><p>  譯碼功能: 利用已建好的哈夫曼樹將文件codefile.txt中的代碼進行譯碼,結果存入文件textfile.dat 中。</p><p>  Print() 打印功能函數(shù):輸出哈夫曼樹,字符,權值,以及它對應的編碼。</p><p>  6.主函數(shù)的簡

24、要說明,主函數(shù)主要設計的是一個分支語句,讓用戶挑選所實現(xiàn)的功能。</p><p>  使用鏈樹存儲,然后分別調用統(tǒng)計頻數(shù)函數(shù),排序函數(shù),建立哈夫曼函數(shù),編碼函數(shù),譯碼函數(shù)來實現(xiàn)功能。</p><p><b>  3)功能模塊:</b></p><p><b>  五、源程序</b></p><p>

25、  #include<iostream.h></p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #include<string.h></p><p>  #include<fstream.h><

26、/p><p>  typedef struct{ //哈夫曼樹的結構體</p><p><b>  char ch;</b></p><p>  int weight; //權值</p><p>  int parent,lchild,rchild;</p><p

27、>  }htnode,*hfmtree;</p><p>  typedef char **hfmcode;</p><p>  void Select(hfmtree &HT,int a,int *p1,int *p2) //Select函數(shù),選出HT樹到a為止,權值最小且parent為0的2個節(jié)點</p><p><b>  {</

28、b></p><p>  int i,j,x,y;</p><p>  for(j=1;j<=a;++j){</p><p>  if(HT[j].parent==0){</p><p><b>  x=j;</b></p><p><b>  break;</b>

29、;</p><p><b>  }</b></p><p><b>  }</b></p><p>  for(i=j+1;i<=a;++i){</p><p>  if(HT[i].weight<HT[x].weight&&HT[i].parent==0){</p

30、><p>  x=i; //選出最小的節(jié)點</p><p><b>  }</b></p><p><b>  }</b></p><p>  for(j=1;j<=a;++j){</p><p>  if(HT[j].parent==0

31、&&x!=j)</p><p><b>  {</b></p><p><b>  y=j;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><

32、b>  }</b></p><p>  for(i=j+1;i<=a;++i)</p><p><b>  {</b></p><p>  if(HT[i].weight<HT[y].weight&&HT[i].parent==0&&x!=i)</p><p>

33、;<b>  {</b></p><p>  y=i; //選出次小的節(jié)點</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(x>y){</b><

34、/p><p><b>  *p1=y;</b></p><p><b>  *p2=x;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b

35、></p><p><b>  *p1=x;</b></p><p><b>  *p2=y;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void hfmcod

36、ing(hfmtree &HT,hfmcode &HC,int n) //構建哈夫曼樹HT,并求出n個字符的哈夫曼編碼HC</p><p><b>  {</b></p><p>  int i,start,c,f,m,w;</p><p>  int p1,p2;</p><p>  char *cd,

37、z;</p><p><b>  if(n<=1){</b></p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  m=2*n-1;</b></p><p> 

38、 HT=(hfmtree)malloc((m+1)*sizeof(htnode));</p><p>  for(i=1;i<=n;++i) //初始化n個葉子結點</p><p><b>  {</b></p><p>  printf("請輸入第%d字符信息和權值:",i);</p>

39、;<p>  scanf("%c%d",&z,&w);</p><p>  while(getchar()!='\n')</p><p><b>  {</b></p><p><b>  continue;</b></p><p>

40、<b>  }</b></p><p>  HT[i].ch=z;</p><p>  HT[i].weight=w;</p><p>  HT[i].parent=0;</p><p>  HT[i].lchild=0;</p><p>  HT[i].rchild=0;</p>

41、<p><b>  }</b></p><p>  for(;i<=m;++i) //初始化其余的結點</p><p><b>  {</b></p><p>  HT[i].ch='0';</p><p>  HT[i].weight=0;</p

42、><p>  HT[i].parent=0;</p><p>  HT[i].lchild=0;</p><p>  HT[i].rchild=0;</p><p><b>  }</b></p><p>  for(i=n+1;i<=m;++i) //建立哈夫曼樹</p&g

43、t;<p><b>  {</b></p><p>  Select(HT,i-1,&p1,&p2);</p><p>  HT[p1].parent=i;HT[p2].parent=i;</p><p>  HT[i].lchild=p1;HT[i].rchild=p2;</p><p>

44、  HT[i].weight=HT[p1].weight+HT[p2].weight;</p><p><b>  }</b></p><p>  HC=(hfmcode)malloc((n+1)*sizeof(char *));</p><p>  cd=(char *)malloc(n*sizeof(char));</p>&

45、lt;p>  cd[n-1]='\0';</p><p>  for(i=1;i<=n;++i) //給n個字符編碼</p><p><b>  {</b></p><p>  start=n-1;</p><p>  for(c=i,f=HT[i].parent;f

46、!=0;c=f,f=HT[f].parent)</p><p><b>  {</b></p><p>  if(HT[f].lchild==c)</p><p><b>  {</b></p><p>  cd[--start]='0';</p><p>&

47、lt;b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cd[--start]='1';</p><p><b>  }</b></p><p>

48、;<b>  }</b></p><p>  HC[i]=(char*)malloc((n-start)*sizeof(char));</p><p>  strcpy(HC[i],&cd[start]);</p><p><b>  }</b></p><p><b>  fre

49、e(cd);</b></p><p><b>  }</b></p><p>  int main(){</p><p>  char code[100],h[100],hl[100];</p><p>  int n,i,j,k,l;</p><p>  ifstream input

50、_file; //文件輸入輸出流</p><p>  ofstream output_file;</p><p>  char choice,str[100];</p><p>  hfmtree HT;</p><p>  hfmcode HC;</p><p>  cout<<"\n&q

51、uot;;</p><p>  cout<<" "<<"軟件092班"<<" "<<"姓名:張耀飛"<<" "<<"學號:3090921040\n" ;</p><p&g

52、t;  while(choice!='Q'&&choice!='q') //當choice的值不為q且不為Q時循環(huán)</p><p><b>  {</b></p><p>  cout<<" "<<"*************

53、************哈夫曼編碼/譯碼器*************************\n";</p><p>  cout<<" "<<"I.Init"<<" "<<"E.Encoding"<<"

54、"<<"D.Decoding"<<" "<<"Q.Exit\n";</p><p>  cout<<"請輸入您要操作的步驟:";</p><p>  cin>>choice;</p><p>  if(c

55、hoice=='I'||choice=='i') //初始化赫夫曼樹</p><p><b>  {</b></p><p>  cout<<"請輸入字符個數(shù):";</p><p><b>  cin>>n;</b><

56、;/p><p>  hfmcoding(HT,HC,n);</p><p>  for(i=1;i<=n;++i)</p><p><b>  {</b></p><p>  cout<<HT[i].ch<<":"<<HC[i]<<endl;</

57、p><p><b>  }</b></p><p>  output_file.open("hfmTree.txt");</p><p>  if(!output_file){</p><p>  cout<<"can't open file!"<<en

58、dl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  for(i=1;i<=n;i++)</p><p><b>  {</b></p><p>  output_file<

59、;<"("<<HT[i].ch<<HC[i]<<")";</p><p><b>  }</b></p><p>  output_file.close();</p><p>  cout<<"哈夫曼樹已經(jīng)創(chuàng)建完畢,并且已經(jīng)放入hfmTree

60、.txt文件中!"<<endl;</p><p><b>  }</b></p><p>  else if(choice=='E'||choice=='e') //進行編碼,并將字符放入ToBeTran.txt,碼值放入CodeFile.txt中</p><p><

61、;b>  {</b></p><p>  printf("請輸入字符:");</p><p>  gets(str);</p><p>  output_file.open("ToBeTree.txt");</p><p>  if(!output_file)</p>&

62、lt;p><b>  {</b></p><p>  cout<<"can't open file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><

63、p>  output_file<<str<<endl;</p><p>  output_file.close();</p><p>  output_file.open("CodeFile.txt");</p><p>  if(!output_file){</p><p>  cout&l

64、t;<"can't open file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  for(i=0;i<strlen(str);i++){</p><p> 

65、 for(j=0;j<=n;++j)</p><p><b>  {</b></p><p>  if(HT[j].ch==str[i])</p><p><b>  {</b></p><p>  output_file<<HC[j];</p><p>&

66、lt;b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  output_file.close();</p><p> 

67、 cout<<"\n";</p><p>  cout<<"編碼完畢,并且已經(jīng)存入CodeFile.txt文件!\n";</p><p>  input_file.open("CodeFile.txt"); //從CodeFile.txt中讀入編碼,輸出在終端</p><

68、p>  if(!input_file)</p><p><b>  {</b></p><p>  cout<<"can't open file!"<<endl;</p><p><b>  return 1;</b></p><p><

69、;b>  }</b></p><p>  input_file>>code;</p><p>  cout<<"編碼碼值為:"<<code<<endl;</p><p>  input_file.close();</p><p><b>  }&l

70、t;/b></p><p>  else if(choice=='D'||choice=='d') //讀入CodeFile.txt中的編碼進行譯碼,將譯出來的字符放入Textfile.txt中</p><p><b>  {</b></p><p>  input_file.open("

71、CodeFile.txt");</p><p>  if(!input_file){</p><p>  cout<<"can't open file!"<<endl;</p><p><b>  return 1;</b></p><p><b>

72、  }</b></p><p>  input_file>>h;</p><p>  input_file.close();</p><p>  output_file.open("Textfile.txt");</p><p>  if(!output_file)</p><p

73、><b>  {</b></p><p>  cout<<"can't open file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>

74、;<b>  k=0;</b></p><p>  while(h[k]!='\0') //先用編碼中的前幾個和字符的編碼相比較,然后往后移</p><p><b>  {</b></p><p>  for(i=1;i<=n;i++){</p><p>&

75、lt;b>  l=k;</b></p><p>  for(j=0;j<strlen(HC[i]);j++,l++){</p><p>  hl[j]=h[l];</p><p><b>  }</b></p><p>  hl[j]='\0';</p><p&

76、gt;  if(strcmp(HC[i],hl)==0)</p><p><b>  {</b></p><p>  output_file<<HT[i].ch;</p><p>  k=k+strlen(HC[i]);</p><p><b>  break;</b></p>

77、;<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  output_file.close();</p><p>  input_file.open("Textfile.txt

78、");</p><p>  if(!input_file){</p><p>  cout<<"can't open file!"<<endl;</p><p><b>  return 1;</b></p><p><b>  }</b>

79、;</p><p>  input_file>>h; </p><p>  cout<<h<<endl;</p><p>  input_file.close();</p><p>  cout<<"譯碼結束,字符已經(jīng)存入Textfile.txt文件中!"<<en

80、dl;</p><p><b>  }</b></p><p>  else if(choice=='Q'||choice=='q') //退出程序</p><p><b>  { </b></p><p><b>  exit(0);

81、</b></p><p><b>  }</b></p><p>  else //如果選了選項之外的就讓用戶重新選擇</p><p><b>  {</b></p><p>  cout<<"您沒有輸入正確的步驟,請重新輸入!"

82、;<<endl;</p><p><b>  }</b></p><p>  cout<<endl;</p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>

83、;  }</b></p><p><b>  六、調試分析</b></p><p><b>  編碼</b></p><p><b>  譯碼</b></p><p><b>  退出</b></p><p><b

84、>  七、實驗心得與體會</b></p><p>  在我自己課程設計中,就在編寫好源代碼后的調試中出現(xiàn)了不少的錯誤,遇到了很多麻煩及困難,我的調試及其中的錯誤和我最終找出錯誤,修改為正確的能夠執(zhí)行的程序中,通過分析,我學到了:</p><p>  在定義頭文件時可多不可少,即我們可多寫些頭文件,肯定不會出錯,但是若沒有定義所引用的相關頭文件,必定調試不通過;</p

85、><p>  在執(zhí)行譯碼操作時,不知什么原因,總是不能把要編譯的二進制數(shù)與編譯成的字符用連接號連接起來,而是按順序直接放在一起,視覺效果不是很好。還有就是,很遺憾的是,我們的哈夫曼編碼/譯碼器沒有像老師要求的那樣完成編一個文件的功能,這是我們設計的失敗之處。</p><p>  通過本次數(shù)據(jù)結構的課程設計,我學習了很多在上課沒懂的知識,并對求哈夫曼樹及哈夫曼編碼/譯碼的算法有了更加深刻的了解,

86、更鞏固了課堂中學習有關于哈夫曼編碼的知識,真正學會一種算法了。當求解一個算法時,不是拿到問題就不加思索地做,而是首先要先對它有個大概的了解,接著再詳細地分析每一步怎么做,無論自己以前是否有處理過相似的問題,只要按照以上的步驟,必定會順利地做出來。</p><p>  這次課程設計,我在編輯中犯了不應有的錯誤,設計統(tǒng)計字符和合并時忘記應該怎樣保存數(shù)據(jù),對文件的操作也很生疏。在不斷分析后明確并改正了錯誤和疏漏,我的程

87、序有了更高的質量。</p><p><b>  八.參考文獻:</b></p><p>  [1 ]  譚浩強. C 程序設計(第二版) [M] . 北京:清華大學出版社,1999. 161 - 163.</p><p>  [2 ]  譚浩強,張基溫,唐永炎. C 語言程序設計教程(第二版) [M] . 北京:高等教育出版社,1998. 11

88、3 - 115.</p><p>  [3 ]  嚴蔚敏,吳偉民. 數(shù)據(jù)結構(C 語言版) [M] . 北京:清華大學出版社,2002. 55 - 58.</p><p>  [4]  李士峰,張謝華,孫清滇. ActiveX文檔技術在《VB 程序設計》網(wǎng)絡課件制作中的應用 [5 ]  王 穎,王正洲. 漢諾塔問題迭代算法實現(xiàn)和分析[J ] . 合肥聯(lián)合大學學報,1999 , </p

溫馨提示

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

評論

0/150

提交評論