哈夫曼編碼譯碼器系統_第1頁
哈夫曼編碼譯碼器系統_第2頁
哈夫曼編碼譯碼器系統_第3頁
哈夫曼編碼譯碼器系統_第4頁
哈夫曼編碼譯碼器系統_第5頁
免費預覽已結束,剩余12頁可下載查看

下載本文檔

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

文檔簡介

1、.(1) .(1) .(2) (2) .(3) .(3) (4) (4) .(5) .(5) (5) .(6) .(6) .(6) .(7)目錄一、系統開發的背景 二、系統分析與設計 三、系統的設計與實現 (一)設計初始化( Initialization ) (二)設計編碼( Encoding )(三)設計譯碼( Decoding)(四)設計印代碼文件( Print )(五)設計印哈夫曼樹( TreePrinting )四、系統測試 (一)測試 main 函數 (二)測試編碼(Encoding)及譯碼(Decoding)函數(三)測試印代碼文件( Print )函數 (四)測試相關的根目錄 五

2、、總結 六、附件(代碼、部分圖表) 哈夫曼編 / 譯碼器系統、系統開發的背景為了提高信道利用率,縮短信息傳輸時間,降低傳輸成本,且在信息發送端通過一個編碼系統對待傳數據預先編碼,在信息接收端將傳來的數據進行譯碼復原),因此設計哈夫曼編碼 / 譯碼器系統。二、系統分析與設計一)系統功能要求:任務要求】I :初始化(Initialization)。從終端讀入字符集大小n,以及n個字符和n個 權值,建立哈夫曼樹,并將它存于文件 hfmTree 中。E:編碼(Encoding )。利用以建好的哈夫曼樹(如不在內存,則從文件hfmTree中讀入),對文件 To Be Tran 中的正文進行編碼,然后將結

3、果存入文件 CodeFile中。D:譯碼(Decoding)。利用已建好的哈夫曼樹將文件 CodeFile中的代碼進行譯碼,結果存入文件 Text File 中。P:印代碼文件(Print )。將文件Code File以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件 Code Prin 中。TreeT:印哈夫曼樹(Tree Printing )。將已在內存中的哈夫曼樹以直觀的方式(樹 或凹入表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件Print 中。測試數據】 利用教科書中的數據調試程序。用下表給出的字符集和頻度的實際統計數據建立哈夫曼樹,并實現以下報文的

4、編 碼和譯碼:“ THIS P ROGRAM IS MY FAVORITE”。字符ABCDEFGHIJKLM頻度1866413223210321154757153220字符NOPQRSTUVWXYZ頻度5763151485180238181161(二)系統模塊結構設計通過對系統功能的分析,哈夫曼編碼/譯碼器系統功能如圖1所示。圖1哈夫曼編碼/譯碼器系統功能圖通過上圖的功能分析,把整個系統劃分為 5個模塊:1、初始化(Initialization),該模塊主要實現:初始化要編輯的語句,然后語句里面有個調用輸入編碼的語句len=I np utCode();2、編碼(Encoding),該模塊主要實

5、現:void Encoding();3、譯碼(In codi ng),該模塊主要實現:void Decod in g();4、印代碼文件(Print ),該模塊主要實現:由函數 void Code_printing()5 、印哈夫曼樹( TreePrinting ),該模塊主要實現: coprint(p,HT);、系統的設計與實現和函數 void Code_printing1()實現。一) 初始化( Initialization),該模塊主要實現void Initialization() int a,k,flag,len;a=0;len=InputCode();for(i=0;i<len

6、;i+)k=0;flag=1;coui-a.data=stri;coui-a.count=1;while(i>k)if(stri=strk)a+; flag=0;k+;if(flag=0)break;if(flag)for(j=i+1;j<len;j+)if(stri=strj)+coui-a.count;n=len-a;for(i=0;i<n;i+)printf("%d%d ",i,coui.data);printf("%d%dn",i,coui.count);for(i=0;i<=n;i+)*(z+i)=coui.data;*

7、(w+i)=coui.count;二) 編碼( Encoding ),該模塊主要實現void Encoding()char *tran;i=99;tran=(char*)malloc(100*sizeof(char); while(i=99)if(fgets(tran,100,tobetran)=NULL)printf(" 不能打開文件 n"); break;for(i=0;*(tran+i)!='0'i+)for(j=0;j<=n;j+)if(*(z+j-1)=*(tran+i)fputs(HCj,codefile);if(j>n)字符錯誤,無

8、法編碼 !n");printf("break;譯碼( Decoding ),該模塊主要實現void Decoding() char *work,*work2,i2;int i4=0,i,i3;unsigned long length=10000; work=(char*)malloc(length*sizeof(char); fgets(work,length,codef);work2=(char*)malloc(length*sizeof(char); i3=2*n-1;for(i=0;*(work+i-1)!='0'i+)i2=*(work+i);if(

9、HTi3.lchild=0) *(work2+i4)=*(z+i3-1); i4+; i3=2*n-1;i-;else if(i2='0') i3=HTi3.lchild;else if(i2='1') i3=HTi3.rchild;四)印代碼文件( Print ),該模塊主要實現void Code_printing1() char *work5;work5=(char*)malloc(51*sizeof(char);do不能讀取文件 n"); if(fgets(work5,51,txtfile)=NULL) printf(" break;f

10、puts(work5,CodePrin1);puts(work5);while(strlen(work5)=50);free(work5);五)印哈夫曼樹( TreePrinting ),該模塊主要實現void Tree_printing(HuffmanTree HT,int w) HuffmanTree p; p=HT+w;printf(" 下面打印哈夫曼樹 n"); coprint(p,HT);printf(" 打印工作結束 n");四、系統測試一) 測試 main 函數(二)測試編碼(Encoding )及譯碼(Decoding)函數歡迎使用哈夫曼

11、編碼譯碼系統ip初印:香哈夫曼§ S1化碼初印"編 碼 d、誦碼 * -印哈夫4狼岀 *請先初始化哈夫i鈾裘亠輸入,i'd下面對根目錄下文件codefile .中的字符進彳亍譯瑪譯碼完成內容寫.扎根g錄下的文件匕t F i g -1M中(二)測試印代碼文件(Print )函數(四)相關的根目錄文件陰騙輯(E)搭式®査看3幫助00THIS PROGRAJZ IE M¥ FAVORATE知F”賽gc至氏in至音糜肋如100011 LOCI 001L01001 ouioQooO'i OLiiiiioooooiiLiooiioioLoaooiio

12、iooioiLOOLiiiioLooaio:jiiooiiio:ic(iciDiiioooiioi五、總結系統完成的功能:本程序完成的功能是可以在信息發送端通過一個編碼系統對待傳數據預先編碼,在信息接收端將傳來的數據進行譯碼(復原)。系統的不足:本次課程設計,我認為還有很多不足,比如說不能把一個隨機輸入的字符串中不同字符作為葉子結點元素, 把其在該字符串中出現的次數作為 權值構造一個赫夫曼樹,并得到各個葉子結點的赫夫曼編碼和整個輸入的字符串的赫夫曼編碼,還有不能夠順利按題目要求寫出相應的文件,將編碼存儲在tex文件中。我的收獲是:通過本次實驗,提高了自已調試程序的能力,充分體會到了在 程序執行

13、時的提示性輸出的重要性,編寫程序的時候,應先寫出算法,再寫程序,一段一段調試;此外,學編程一定要親自動手,實踐是檢驗真理正確性的唯一標 準,不能眼高手低,還要學會歸納,發現編程的捷徑,想著用更高效的方法去完 成一個個任務。六、附件(代碼、部分圖表)#include<stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> const int UINT_MAX=1000; char str50;typedef structint weight,K;int parent,

14、lchild,rchild; HTNode,* HuffmanTree; typedef char *HuffmanCode; HuffmanTree HT; HuffmanCode HC; int w50,i,j,n; char z50; int flag=0;int numb=0;struct cou char data; int count;cou50;int min(HuffmanTree t,int i) int j,flag;int k=UINT_MAX; for(j=1;j<=i;j+)if(tj.weight<k&&tj.parent=0) k=tj

15、.weight,flag=j;tflag.parent=1;return flag;void select(HuffmanTree t,int i,int &s1,int &s2) int j; s1=min(t,i);s2=min(t,i);if(s1>s2)j=s1; s1=s2;s2=j;void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) int m,i,s1,s2,start;int c,f;HuffmanTree p; char *cd; if(n<=1) ret

16、urn; m=2*n-1;HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); for(p=HT+1,i=1;i<=n;+i,+p,+w)p->weight=*w; p->parent=0; p->lchild=0; p->rchild=0; for(;i<=m;+i,+p) p->parent=0; for(i=n+1;i<=m;+i) select(HT,i-1,s1,s2);HTs1.parent=HTs2.parent=i;HTi.lchild=s1;HTi.rchild=s2;HTi.weight=HT

17、s1.weight+HTs2.weight;HC=(HuffmanCode)malloc(n+1)*sizeof(char*); cd=(char*)malloc(n*sizeof(char);cdn-1='0'for(i=1;i<=n;i+)start=n-1;for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent)if(HTf.lchild=c)cd-start='0'elsecd-start='1'HCi=(char*)malloc(n-start)*sizeof(char); strcpy(HCi,&a

18、mp;cdstart); free(cd);int InputCode()FILE *tobetran;if(tobetran=fopen("tobetran.txt","w")=NULL) printf(" 不能打開文件 n"); return 0;printf(" 請輸入你想要編碼的字符 n"); gets(str);fputs(str,tobetran); printf(" 獲取報文成功 n"); fclose(tobetran); return strlen(str);void Init

19、ialization() int a,k,flag,len;a=0; len=InputCode(); for(i=0;i<len;i+) k=0;flag=1;coui-a.data=stri; coui-a.count=1;while(i>k) if(stri=strk)a+; flag=0;k+;if(flag=0) break; if(flag)for(j=i+1;j<len;j+)if(stri=strj)+coui-a.count;n=len-a;for(i=0;i<n;i+)printf("%d%d ",i,coui.data); pr

20、intf("%d%dn",i,coui.count);for(i=0;i<=n;i+)*(z+i)=coui.data;*(w+i)=coui.count;HuffmanCoding(HT,HC,w,n); printf(" 字符對應的編碼為 :n");for(i=1;i<=n;i+)puts(HCi);nn");printf(" 下面將哈夫曼編碼寫入文件 nFILE *htmTree;char r=' ','0'if(htmTree=fopen("htmTree.txt"

21、;,"w")=NULL)printf("can not open filen"); return;fputs(z,htmTree);for(i=0;i<n+1;i+)fprintf(htmTree,"%6d",*(w+i);fputs(r,htmTree);for(i=1;i<=n;i+)fputs(HCi,htmTree);fputs(r,htmTree);fclose(htmTree);printf(" 已將字符與對應編碼寫入根目錄下文件 htmTree.txt 中 nn");void Encodi

22、ng()printf(" 下面對目錄下文件 tobetran.txt 中的字符進行編碼 n"); FILE *tobetran,*codefile;if(tobetran=fopen("tobetran.txt","rb")=NULL)printf(" 不能打開文件 n");if(codefile=fopen("codefile.txt","wb")=NULL)printf(" 不能打開文件 n");char *tran;i=99;tran=(char*)

23、malloc(100*sizeof(char); while(i=99)if(fgets(tran,100,tobetran)=NULL)printf(" 不能打開文件 n");break;for(i=0;*(tran+i)!='0'i+)for(j=0;j<=n;j+)if(*(z+j-1)=*(tran+i)fputs(HCj,codefile);if(j>n)printf(" 字符錯誤,無法編碼 !n"); break;nn 編碼寫入目錄下的 codefile.txt 中 nn");printf("

24、編碼工作完成 fclose(tobetran); fclose(codefile); free(tran);void Decoding()printf(" 下面對根目錄下文件 codefile.txt 中的字符進行譯碼 n"); FILE *codef,*txtfile;if(txtfile=fopen("txtfile.txt","w")=NULL)printf(" 不能打開文件 n");if (codef=fopen("codefile.txt","r")=NULL)pr

25、intf(" 不能打開文件 n");char *work,*work2,i2;int i4=0,i,i3;unsigned long length=10000; work=(char*)malloc(length*sizeof(char);fgets(work,length,codef); work2=(char*)malloc(length*sizeof(char); i3=2*n-1;for(i=0;*(work+i-1)!='0'i+)i2=*(work+i);if(HTi3.lchild=0)*(work2+i4)=*(z+i3-1);i4+;i3=

26、2*n-1;i-;else if(i2='0') i3=HTi3.lchild;else if(i2='1') i3=HTi3.rchild;*(work2+i4)='0'fputs(work2,txtfile);printf(" 譯碼完成 n 內容寫入根目錄下的文件 txtfile.txt 中 nn"); free(work);free(work2);fclose(txtfile);fclose(codef);void Code_printing()printf(" 下面打印根目錄下文件 CodePrin.txt

27、中編碼字符 n"); FILE * CodePrin,* codefile;if(CodePrin=fopen("CodePrin.txt","w")=NULL) printf(" 不能打開文件 n");return;if(codefile=fopen("codefile.txt","r")=NULL)printf(" 不能打開文件 n");return;char *work3;work3=(char*)malloc(51*sizeof(char); doif(fg

28、ets(work3,51,codefile)=NULL)printf(" 不能讀取文件 n");break;fputs(work3,CodePrin);puts(work3);while(strlen(work3)=50);free(work3);printf(" 打印工作結束 nn"); fclose(CodePrin); fclose(codefile);void Code_printing1()printf(" 下面打印根目錄下文件 txtfile.txt 中譯碼字符 n"); FILE * CodePrin1,* txtfil

29、e;if(CodePrin1=fopen("CodePrin1.txt","w")=NULL)printf(" 不能打開文件 n");return;if(txtfile=fopen("txtfile.txt","r")=NULL)printf(" 不能打開文件 n");return; char *work5;work5=(char*)malloc(51*sizeof(char); doif(fgets(work5,51,txtfile)=NULL)printf("

30、不能讀取文件 n");break;fputs(work5,CodePrin1);puts(work5); while(strlen(work5)=50); free(work5); printf(" 打印工作結束 "); fclose(CodePrin1); fclose(txtfile);void coprint(HuffmanTree start,HuffmanTree HT)if(start!=HT)FILE * TreePrint;創建文件失敗 n");if(TreePrint=fopen("TreePrint.txt","a"

溫馨提示

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

評論

0/150

提交評論