哈夫曼编码译码器实验报告

上传人:n**** 文档编号:37128803 上传时间:2018-04-07 格式:DOC 页数:21 大小:257.50KB
返回 下载 相关 举报
哈夫曼编码译码器实验报告_第1页
第1页 / 共21页
哈夫曼编码译码器实验报告_第2页
第2页 / 共21页
哈夫曼编码译码器实验报告_第3页
第3页 / 共21页
哈夫曼编码译码器实验报告_第4页
第4页 / 共21页
哈夫曼编码译码器实验报告_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《哈夫曼编码译码器实验报告》由会员分享,可在线阅读,更多相关《哈夫曼编码译码器实验报告(21页珍藏版)》请在金锄头文库上搜索。

1、实验报告实验报告哈夫曼编码及译码哈夫曼编码及译码 班级:软件工程一班学号:2220141524姓名:孙正涛1 问题描述1.设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。(1) 将权值数据存放在数据文件(文件名为 data.txt,位于当前目录中);(2) 分别采用动态和静态存储结构; 初始化:键盘输入字符集大小 n、n 个字符和 n 个权值,建立哈夫曼树;(3) 编码:利用建好的哈夫曼树生成哈夫曼编码;输出编码;设计要求:(1) 符合课题要求,实现相应功能;(2) 要求界面友好美观,操作方便易行;(3) 注意程序的实用性、安全性。2 需求分析编写此软件是为

2、了实现一个利用哈夫曼算法的编码和译码系统。比如,再利用电报进行通讯时,需要将文字转换成由二进制的字符组成的字符串。比如需传送的电文为“A B A C C D A”假设将 A,B,C,D 分别编码为00、01、10、11.则上述电文遍为 00010010101100,总长度为 14 位。但是在传送过程中,总希望长度能够尽可能的短,于是我们想采用长度不等的编码。但是这种编码必须遵循:任何一个字符的编码都不是另一个字符编码的前缀。- 1 - 对此软件的要求:能够正确的使得对于输入的字符进行编码以及译码,并且是的在译码过程中不会出错,同时能够将编码以及译码的结果正确的存入文件当中。3 概要设计总体框图

3、以及功能描述4 详细设计数据类型的定义(1)哈夫曼树节点类型struct hufmtreenode /哈弗曼树结点数据类型char data;float weight; /结点权值int parent,lchild,rchild; /父结点,左、右孩子结点;(2)哈夫曼树类型struct hufmtree /哈弗曼树数据类型hufmtreenode *node; /结点数组(根据 n 的值动态分配)int n; /叶子结点数;(3)哈夫曼编码数据类型- 2 - struct Codetype /哈弗曼编码数据类型char *bits; /编码流数组,int start;/编码实际在编码流数组里

4、的开始位置5 测试分析 (1)打开源文件统计各字符及权值信息并存入 data.txt 文件中(2)将统计出的权值信息进行哈夫曼编码- 3 - (3)将编码内容存入 CodeFile.txt 文件中(4)将 CodeFile.txt 文件中的内容译码(5)成功译码把原字符信息存入 DeCodeFile.txt 文件中(6)输入各字符及其权值(7)将各字符的权值信息进行哈夫曼编码- 4 - (7)根据编码再进行译码工作6 课程设计总结课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今

5、计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。回顾起此次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,这毕竟独立做的,难免会遇到过各种各样的问题,同时在设计的过程中发

6、现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体通过这次课程设计之后,一定把以前所学过的知识重新温故。这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在谢老师的辛勤指导下,终于游逆而解。同时,在李玉蓉老师的软件工程导- 5 - 论课上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!附录(源程序清单)#include #include #include #define MAXVAL 10000.0struct hufmtreenode/哈弗曼树结点数据类型char data;double weig

7、ht;/结点权值int parent,lchild,rchild;/父结点,左、右孩子结点;struct hufmtree/哈弗曼树数据类型hufmtreenode *node;/结点数组(根据 n 的值动态分配)int n;/叶子结点数;struct Codetype/哈弗曼编码数据类型char *bits;/编码流数组,n 为为哈夫曼树中叶子结点的数目,编码的长度不可能超过 nint start;/编码实际在编码流数组里的开始位置;void SortHufmtree(hufmtree *tree)/将哈夫曼树 n 个叶子结点由大到小排序int i,j,k;hufmtreenode temp

8、;if (tree=NULL)return;for (i=0;in;i+)- 6 - k=i;for(j=i+1;jn;j+)if (tree-nodej.weighttree-nodek.weight)k=j;if (k!=i)temp=tree-nodei;tree-nodei=tree-nodek;tree-nodek=temp;Codetype* HuffmanCode(hufmtree *tree)/哈弗曼编码的生成int i,j,p,k;Codetype *code;if (tree=NULL)return NULL;code=(Codetype*)malloc(tree-n*si

9、zeof(Codetype);for (i=0;in;i+)printf(“%c “,tree-nodei.data);/打印字符信息codei.bits=(char*)malloc(tree-n*sizeof(char);codei.start=tree-n-1;j=i;p=tree-nodei.parent;while(p!=-1)if (tree-nodep.lchild=j)codei.bitscodei.start=0;- 7 - elsecodei.bitscodei.start=1;codei.start-;j=p;p=tree-nodep.parent;for (k=codei

10、.start+1;kn;k+)/打印字符编码printf(“%c“,codei.bitsk);printf(“n“);return code;hufmtree* BuildHuffmanTree(hufmtree *tree)/构建叶子结点已初始化的哈夫曼树/tree 中所有叶子结点已初始化int i,j,p1,p2,m;float small1,small2;m=2*(tree-n)-1;for (i=tree-n;inodei.parent=-1;tree-nodei.lchild=-1;tree-nodei.rchild=-1;tree-nodei.weight=0.0;for (i=t

11、ree-n;inodej.parent=-1 p1=j;for (j=0;jnodej.parent=-1 p2=j;tree-nodep1.parent=tree-nodep2.parent=i;tree-nodei.weight=tree-nodep1.weight+tree-nodep2.weight;tree-nodei.lchild=p1;tree-nodei.rchild=p2;return tree;hufmtree* CreateHuffmanTreeFromSourceFile()/通过解析源文件建立哈夫曼树FILE *textfile,*datafile;char ch,s

12、ourcefilename100;- 9 - int i,j=0,n=0;float count128; /用于统计字符在源文件中出现的次数,27 表示 26 个英文字母和 1 个空格字符hufmtree *tree;/打开一个源文件printf(“n 请输入源文件所在路径:n“);scanf(“%s“,sourcefilename);if (textfile=fopen(sourcefilename,“r“)=NULL)printf(“n 找不到文件%sn“,sourcefilename);return NULL;for(i=0;inode=(hufmtreenode*)malloc(2*n

13、-1)*sizeof(hufmtreenode);tree-n=n;printf(“n 源文件的字符集及其权值信息如下:n“);for(i=0;inodej.data=char(i);tree-nodej.weight=counti;tree-nodej.parent=-1;tree-nodej.lchild=-1;tree-nodej.rchild=-1;j+;SortHufmtree(tree);BuildHuffmanTree(tree);fclose(textfile);fclose(datafile);printf(“n 哈夫曼树建立完毕,已将权值信息保存至 data.txtn“);

14、return tree;- 11 - hufmtree* CreateHuffmanTreeByInput()/通过用户输入建立哈夫曼树int n;hufmtree *tree;int i,m;FILE *datafile;tree=(hufmtree*)malloc(sizeof(hufmtree);datafile=fopen(“f:data.txt“,“w“);/由用户输入字符与权值信息并将其写入 data.txt,同时进行哈夫曼树初始化printf(“请输入字符数:“);scanf(“%d“,if (nnode=(hufmtreenode*)malloc(2*n-1)*sizeof(hufmtreenode);tree-n=n;m=2*n-1;for (i=0;inodei.parent=-1;tree-no

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 电子/通信 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号