哈夫曼编码译码器系统_第1页
哈夫曼编码译码器系统_第2页
哈夫曼编码译码器系统_第3页
哈夫曼编码译码器系统_第4页
哈夫曼编码译码器系统_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一、系统开发的背景 (1)二、系统分析与设计 (1)三、系统的设计与实现 (2)(一) 设计初始化( Initialization ) (2)(二) 设计编码( Encoding )(3)(三) 设计译码( Decoding)(3)(四) 设计印代码文件( Print )(4)(五) 设计印哈夫曼树( TreePrinting )(4)四、系统测试 (5)(一) 测试 main 函数 (5)(二) 测试编码(Encoding) 及译码(Decoding) 函数(5)(三) 测试印代码文件( Print)函数(6)(四) 测试相关的根目录 (6)五、总结 (6)六、附件(代码、部分图表) (

2、7)哈夫曼编 / 译码器系统一、系统开发的背景 为了提高信道利用率,缩短信息传输时间,降低传输成本,且在信息发送端 通过一个编码系统对待传数据预先编码,在信息接收端将传来的数据进行译码 (复原),因此设计哈夫曼编码 / 译码器系统。二、系统分析与设计(一)系统功能要求:【任务要求】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 中。T:印哈夫曼树(Tree Printing )。将已在内存中的哈夫曼树以直观的方式(树 或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。【测试数据】利用教科书中的数据调试程序。用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现

4、以下报文的编 码和译码:“ THIS PROGRAM IS MY FAVORITE字符ABCDEFGHIJKLM频度1866413223210321154757153220字符NOPQRSTUVWXYZ频度5763151485180238181161(二)系统模块结构设计通过对系统功能的分析,哈夫曼编码/译码器系统功能如图1所示图1哈夫曼编码/译码器系统功能图通过上图的功能分析,把整个系统划分为5个模块:1、 初始化(Initialization),该模块主要实现:初始化要编辑的语句,然 后语句里面有个调用输入编码的语句len=I nputCode();2、 编码(En codi ng),该模

5、块主要实现:void En cod in g();3、译码(In codi ng),该模块主要实现:void Decod in g();4、印代码文件(Print ),该模块主要实现:由函数 void Code_printing()5 、印哈夫曼树( TreePrinting ),该模块主要实现: coprint(p,HT);三、系统的设计与实现),该模块主要实现(一) 初始化( Initialization void Initialization() int a,k,flag,len;a=0; len=InputCode(); for(i=0;ik)if(stri=strk)a+; flag

6、=0;k+;if(flag=0)break;if(flag)for(j=i+1;jlen;j+)if(stri=strj)+coui-a.count;n=len-a;for(i=0;in;i+)printf(%d%d ,i,coui.data); printf(%d%dn,i,coui.count);for(i=0;i=n;i+)*(z+i)=coui.data;*(w+i)=coui.count;(二) 编码( Encoding ),该模块主要实现void Encoding()char *tran;i=99;tran=(char*)malloc(100*sizeof(char);while(

7、i=99)if(fgets(tran,100,tobetran)=NULL)printf( 不能打开文件 n);break;for(i=0;*(tran+i)!=0;i+)for(j=0;jn)!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=(

8、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=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); doif(fget

9、s(work5,51,txtfile)=NULL)printf( 不能读取文件 n); break;fputs(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 函数欢迎使用哈夫舅编码译

10、码系统*-Mr:躱曹6编 码t.襯哈夫鷗X:MXMKitlCJtXlCMimfKXWiHKXiHiiHEMrXXitXKKltMitlHKXWiXlCXiHWiHW(二)测试编码(Encoding )及译码(Decoding)函数欢迎使用哈夫曼编码译码系统”编 码 1、谨码 *J印哈夫曼材矢逋岀 *iOWKlWitMWK耳 K貧斗 KltlMi KNN iMK. MMtmtKHit KIWitHWitK Kit再t青先初始化哈夫曼槌表输入r金面对目录下文件t obetran.txt中的字符进行编码 编码工作莞成编码写入目录下的codefile -txt中!11!貝HHXlME 耳Wtif 梵幕

11、穂豪持耳味料從其齋 WlfMilliiWMiitMEitjiHOtJtaOtlfrifXMiKKM幘先初始化哈夫曼槌表输入rdE面对根目录下文件mile.txt中的字符讲行译码 译題成内容与入根目 录下的文件七MF i 论t中(二)测试印代码文件(Print )函数(四)相关的根目录CodaFrinl -记事車文件 编辑血 格式(0)查看(V)帮助CH)ITHIS PROGRAME IS MY FAV0RATECvieFrin 记事事文件U測員搭式仞査看的幸助00|10001110010011010010111010001011111100000111100110101010011010010

12、110011111010001001100111Q1100001110001101五、总结系统完成的功能:本程序完成的功能是可以在信息发送端通过一个编码系统 对待传数据预先编码,在信息接收端将传来的数据进行译码(复原) 。系统的不足:本次课程设计,我认为还有很多不足,比如说不能把一个随机 输入的字符串中不同字符作为叶子结点元素,把其在该字符串中出现的次数作为权值构造一个赫夫曼树,并得到各个叶子结点的赫夫曼编码和整个输入的字符串 的赫夫曼编码,还有不能够顺利按题目要求写出相应的文件,将编码存储在tex文件中。我的收获是:通过本次实验,提高了自已调试程序的能力,充分体会到了在程序执行时的提示性输出

13、的重要性,编写程序的时候,应先写出算法,再写程序,一段一段调试;此外,学编程一定要亲自动手,实践是检验真理正确性的唯一标准,不能眼高手低,还要学会归纳,发现编程的捷径,想着用更高效的方法去完 成一个个任务。六、附件(代码、部分图表)#include#include #include #include const int UINT_MAX=1000; char str50;typedef structint weight,K;int parent,lchild,rchild; HTNode,* HuffmanTree; typedef char *HuffmanCode; HuffmanTree

14、 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.weights2)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

15、;HuffmanTree p;char *cd;if(n=1)return;m=2*n-1;HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); for(p=HT+1,i=1;iweight=*w; p-parent=0; p-lchild=0; p-rchild=0; for(;iparent=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=HTs1.weight+HTs2.weight;

16、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;else cd-start=1;HCi=(char*)malloc(n-start)*sizeof(char); free(cd);strcpy(HCi,&cdstart);int InputCode()FILE *tobetran;i

17、f(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 Initialization() int a,k,flag,len;a=0; len=InputCode(); for(i=0;ik) if(stri=strk)a+;flag=0;k+;if(flag=0) break;if(fla

18、g)for(j=i+1;jlen;j+)if(stri=strj)+coui-a.count;n=len-a;for(i=0;in;i+)printf(%d%d ,i,coui.data); printf(%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);printf( 下面将哈夫曼编码写入文件 nnn);FILE *htmTree;char r= ,0;if(

19、htmTree=fopen(htmTree.txt,w)=NULL)printf(can not open filen);return;fputs(z,htmTree);for(i=0;in+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 Encoding()printf( 下面对目录下文件 tobetran.t

20、xt 中的字符进行编码 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*)malloc(100*sizeof(char);while(i=99) if(fgets(tran,100,tobetran)=NULL)printf( 不能打开文件 n);break; for(i=0;*(tran+i)!

21、=0;i+)for(j=0;jn) printf( 字符错误,无法编码 !n); break;printf( 编码工作完成 nn 编码写入目录下的 codefile.txt 中 nn); 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

22、.txt,r)=NULL)printf( 不能打开文件 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=2*

23、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 中编码字符 n); FILE * CodePrin,* codefile;if(CodePri

24、n=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); do if(fgets(work3,51,codefile)=NULL) printf( 不能读取文件 n);break;fputs(work3,CodePrin); puts(work3);while(strlen(work3)=50); free(work3

25、);printf( 打印工作结束 nn);fclose(CodePrin); fclose(codefile);void Code_printing1()printf( 下面打印根目录下文件 txtfile.txt 中译码字符 n); FILE * CodePrin1,* txtfile; 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( 不能读取文件 n);break;fputs(work5,CodePrin1);puts(work5); while(strlen(work5)=50); free(work5); printf( 打印工作结束 ); fclose(CodePrin1); fclose(txtfile);void coprint(Huff

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论