ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:544.60KB ,
资源ID:3371103      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3371103.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(哈夫曼编码译码课程设计报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

哈夫曼编码译码课程设计报告.docx

1、哈夫曼编码译码课程设计报告 数据结构 课程设计赫夫曼编码/译码器设计指导教师:李文书、周维达 班级:10电信实验班学号:Q10600132姓名:王彬彬一、实验目的1、提高分析问题、解决问题的能力,进一步巩固数据结构各种原理与方法。2、熟悉掌握一门计算机语言,可以进行数据算法设计。二、实验原理 哈夫曼编译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码 。 在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该

2、节点对应字符的编码,称之为哈夫曼编码。 最简单的二进制编码方式是等长编码。若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。哈夫曼树课用于构造使电文的编码总长最短的编码方案。主要流程图如下:3、实验步骤1:写好流程图,设计实验方案。2:初始化,从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件HuofumanTree中。3:编码。利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。4:译码。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存

3、入文件Textfile中。5:印代码文件(Print).将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint中。6:印哈夫曼树(Treeprinting).将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。具体函数如下: 1:Initialization() 初始化 2:Encoding() 编码 3:Decoding() 译码 4:Print_file() 打印代码文件 5:search(k,j,p) 搜索二叉树 6:Print_tree() 打印二叉树 7:men

4、u() 主菜单 9:main() 主函数4、实验结果与分析(1)大致个人测试案例:主界面:初始化:Huofuman.txt初始化存入文件结果如下:编码结果如下:codefile.txt编码存入文件如下:译码结果如下:textfile.txt译码存入文件如下:打印结果如下:打印树结果如下:treeprint.txt存入文件结果如下:(2)本例测试案例_1 已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计哈夫曼编码。解: 假设八种字符为ABCDEFGH,将各个概率乘以100可得权值为5 29 7 8 14

5、23 3 11启动程序,测试得:初始化:编码:译码打印结束:(3)本例测试案例_2用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FAVORITE”。字符ABCDEFGHIJKLM频度1886413223210321154757153220字符NOPQRSTUVWXYZ频度5763151485180238181161解: 先假设空格为#,所以输入字符时,将空格变为#。输入如下:先将从空格到Z输入权值然后对字符进行编码:空格到Z译码然后输入字符串并编码:保存到Codefile.txt中然后将开始译码并结束将译码结果保存到T

6、extfile.txt中5、实验总结 从这个课程设计中,我发现了很多问题,包括文件存储,字符串输入等等,最主要的是经历了一次找BUG的过程,当把自己写的代码里的错误一个一个找出来时,是非常非常兴奋的。还是希望能有多这个经历。不喜欢copy,如果copy了,就缺少了一次挑战自己的经历。六、主要代码/ Huffman_2.cpp : Defines the entry point for the console application./#include stdafx.h#include #include #include #include #define maxsize 1000#define

7、len 20#define rowsize 20/-初始化-/struct int parent; int lchild,rchild; int weight;HFM_treemaxsize;struct int weight; char hfstr;HFM_nummaxsize;struct int start; int bitlen;HFM_hf;struct int start; char hfch; int bitlen; int length;HFM_codemaxsize;int leaves;void Initialization() int i,j; FILE* HFM_f;

8、HFM_f = fopen(HuofumanTree.txt,w); if(HFM_f = NULL) printf(create file error!n); printf( 请输入字符集大小: ); scanf(%d,&leaves); fprintf(HFM_f,-输入的值-n); fprintf(HFM_f, 字符大小%4dn,leaves); fprintf(HFM_f, 字符 权值n); for(i=0;ileaves;i+) printf( 请输入第%d个字符和其权值:,i+1); scanf( %c ,&HFM_numi.hfstr); scanf(%d,&HFM_numi.w

9、eight); fprintf(HFM_f,%4c,HFM_numi.hfstr); fprintf(HFM_f,%4dn,HFM_numi.weight); /存储字符和权值 /-建立哈夫曼树-/ for(i=0;imaxsize;i+) /哈夫曼树初始化 HFM_treei.parent = -1; HFM_treei.lchild = -1; HFM_treei.rchild = -1; HFM_treei.weight = 0; for(i=0;ileaves;i+) HFM_treei.weight = HFM_numi.weight; for(i=0;ileaves-1;i+) i

10、nt m1,m2; int m1_pos,m2_pos; m1=m2=65536; m1_pos=m2_pos=0; for(j=0;jleaves+i;j+) if(HFM_treej.weightm1&HFM_treej.parent = -1) m2 = m1; m1 = HFM_treej.weight; m2_pos = m1_pos; m1_pos = j; else if(HFM_treej.weightm2&HFM_treej.parent = -1) m2 = HFM_treej.weight; m2_pos = j; HFM_treeleaves+i.parent = -1

11、; HFM_treeleaves+i.lchild = m1_pos; HFM_treeleaves+i.rchild = m2_pos; HFM_treem1_pos.parent = leaves+i; HFM_treem2_pos.parent = leaves+i; HFM_treeleaves+i.weight = m2+m1; /-输出哈夫曼树-/ printf( -哈夫曼编码-n); printf( parent lchild rchild weightn); fprintf(HFM_f,-哈夫曼编码-n); fprintf(HFM_f, parent lchild rchild

12、 weightn); for(i=0;ileaves*2-1;i+) printf( %8d%8d%8d%8dn,HFM_treei.parent,HFM_treei.lchild,HFM_treei.rchild,HFM_treei.weight); fprintf(HFM_f,%8d%8d%8d%8dn,HFM_treei.parent,HFM_treei.lchild,HFM_treei.rchild,HFM_treei.weight); printf(n); fclose(HFM_f);/-编码-/void Encoding() int i,j,p,c,k; FILE* HFM_f =

13、 fopen(CodeFile.txt,w); if(HFM_f = NULL) printf(open file error!n); for(i=0;ileaves;i+) c = i; p = HFM_treei.parent; HFM_hf.start = len-1; while(p!=-1) if(HFM_treep.lchild = c) HFM_hf.bitHFM_hf.start = 0; else HFM_hf.bitHFM_hf.start = 1; -HFM_hf.start; c = p; p = HFM_treec.parent; for(j=HFM_hf.start

14、+1,k=0;jlen;j+,k+) HFM_codei.bitk = HFM_hf.bitj; HFM_codei.length = len-HFM_hf.start-1; HFM_codei.start = HFM_hf.start+1; for(i=0;ileaves;i+) HFM_codei.hfch = HFM_numi.hfstr; printf( character:%c start:%d length:%d Code:,HFM_codei.hfch,HFM_codei.start,HFM_codei.length); for(j=0;jHFM_codei.length;j+)

15、 printf(%d,HFM_codei.bitj); fprintf(HFM_f,%d,HFM_codei.bitj); printf(n); printf(n); fclose(HFM_f);/-译码-/void Decoding() char amaxsize; char HFM_dcmaxsize; int i,j,k,p; FILE* HFM_f = fopen(Textfile.txt,w); FILE* hf = fopen(CodeFile.txt,r); if(HFM_f=NULL) printf(open file error!n); fscanf(hf,%s,a); j=

16、0;p=0; for(i=0;ileaves;i+) k = 2*leaves-2; while(HFM_treek.lchild!=-1 & HFM_treek.rchild!=-1) if(aj=0) k = HFM_treek.lchild; if(aj=1) k = HFM_treek.rchild; j+; HFM_dcp = HFM_codek.hfch; p+; printf( ); for(i=0;ip;i+) if(HFM_dci = #) HFM_dci = ; printf(%c,HFM_dci); fprintf(HFM_f,%c,HFM_dci); printf(n)

17、; fclose(HFM_f); fclose(hf);/-打印代码文件-/void Print_file() FILE* hf = fopen(CodeFile.txt,r); FILE* hc = fopen(CodePrint.txt,w); char strmaxsize; int s,i; fscanf(hf,%s,str); s = strlen(str); printf( ); for(i=0;is;i+) printf(%c,stri); fprintf(hc,%c,stri); if(i+1)%50=0) printf(n); fprintf(hc,n); fclose(hf

18、); fclose(hc); printf(n);/-打印哈夫曼树-/int fprowsizerowsize;int f=5;void search(int k,int j,int p) int c; int d; int b; if(HFM_treek.lchild!=-1) c=HFM_treek.lchild; d=j+1; b=p-2; if(fpdb) b=b+1; fpdb=HFM_treec.weight; search(c,d,b); if(HFM_treek.rchild!=-1) c=HFM_treek.rchild; d=j+1; b=p+2; if(fpdb) b=b

19、-1; fpdb=HFM_treec.weight; search(c,d,b); void Print_tree() int i,j,k,s,p,c; FILE* HFM_f; HFM_f = fopen(TreePrint.txt,w); if(HFM_f = NULL) printf(file open error!n); memset(fp,0,sizeof(fp); fp010 = HFM_treeleaves*2-2.weight; search(leaves*2-2,0,10); p =(int)log(leaves*2-1)/log(2)+1; for(i=0;ip+2;i+)

20、 for(j=0;jrowsize;j+) if(fpij=0) printf( ); fprintf(HFM_f, ); else printf(%3d,fpij); fprintf(HFM_f,%3d,fpij); printf(nn); fprintf(HFM_f,nn); fclose(HFM_f);/-输入字符串-/void inputcode() printf(please input your character stringn); char hfman_strmaxsize; int i,j,k,s; FILE* fp = fopen(CodeFile.txt,w); if(f

21、p = NULL) printf(open file error!n); getchar(); gets(hfman_str); k=strlen(hfman_str); for(i=0;ik;i+) if(hfman_stri = ) for(j=0;jHFM_code0.length;j+) printf(%d,HFM_code0.bitj); fprintf(fp,%d,HFM_code0.bitj); else s=hfman_stri-A+1; for(j=0;jHFM_codes.length;j+) printf(%d,HFM_codes.bitj); fprintf(fp,%d

22、,HFM_codes.bitj); printf(n); fclose(fp);/-将字符译码-/void reoutstr() Decoding();/-主界面-/void menu() printf(*班级:10电信实验班 学号:Q10600132 姓名:王彬彬*nn); printf( *哈夫曼编码和译码*nn); printf( *n); printf( *1:初始化- I*n); printf( *2:编码- E*n); printf( *3:译码- D*n); printf( *4:打印代码文件- P*n); printf( *5:打印哈夫曼树- T*n); printf( *6:

23、输入字符串并编码- C*n); printf( *8:输入译码- Y*n); printf( *nn);/-主函数-/int main() char choice; menu(); while(choice!=Q) printf( please input your choice here: ); scanf( %c,&choice); switch(choice) case I: case i: Initialization(); /初始化 break; case E: case e: Encoding(); /编码 break; case C: case c: inputcode(); /

24、输入字符串 break; case Y: case y: reoutstr(); break; case D: case d: Decoding(); /译码 break; case P: case p: Print_file(); /打印代码文件 break; case T: case t: Print_tree(); /打印哈夫曼树 break; case Q: case q: printf(n *); printf(n * 程序终止! *);/停止 printf(n *nn); break; default: printf(input errorn); system(pause); return 0;成绩评定表平时成绩答辩成绩最终成绩

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1