欢迎来到天天文库
浏览记录
ID:13182953
大小:852.50 KB
页数:65页
时间:2018-07-21
《基于哈夫曼编码的数据压缩解压程序论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、合肥学院计算机科学与技术系课程设计报告2010~2011学年第二学期课程C++课程设计课程设计名称基于哈夫曼编码的数据压缩/解压程序学生姓名龚天棚学号1012091010专业班级网络工程(1)班指导教师项响琴、徐静2011年6月65目录一、需求分析-3-1.1课程设计目的-3-1.2课程设计名称及内容-4-1.3任务和要求-4-二、算法设计-5-2.1设计思想:-5-2.2算法思想:-5-2.3主要模块说明-6-2.4部分重要函数的实现:-6-三、用户手册-7-四、测试结果-9-4.1压缩过程:-9-4.2解压过程-10-4.3显示文本
2、内容-10-4.4显示帮助界面:-11-五、总结-11-六、参考资料-12-七、附录-13-7.1源代码-13-657.2运行结果-14-一、需求分析1.1课程设计目的将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。通过课程设计,学生在下述各方面的能力应该得到锻炼:(1)进一步巩固、加深学生所学专业课程《C++程序设计语言》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。(2)全面考核学生所掌握的基本理论知识及
3、其实际业务能力,从而达到提高学生素质的最终目的。(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。(5)掌握结构化程序设计方法,熟悉面向对象程序设计方法。(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。(7)进一步掌握在集成环境下如何调试程序和修改程序。1.2课程设计名称及内容课程设计名称:基于哈夫曼编码的数据压缩/解压程序设计内容:将任意一个指定的文本文件中的字符进行哈夫曼编码,生
4、成一个编码文件(压缩文件);反过来,可将一个压缩文件解码还原为一个文本文件。1.3任务和要求1)可设计一个菜单:Q----QuitL----ListTextDocumentD----DecodingC----Coding2)选择C时:输入一个待压缩的文本文件名称(可带路径)。如:D:lulu.txt统计文本文件中各字符的个数作为权值,生成哈夫曼树;将文本文件利用哈夫曼树进行编码,生成压缩文件。压缩文件名称=文本文件名.COD如:D:lulu.COD压缩文件内容=哈夫曼树的核心内容+编码序列3)选择D时:输入一个待解压的压缩文件名
5、称(可带路径65)如:D:lulu.COD从文件中读出哈夫曼树,并利用哈夫曼树将编码序列解码;生成(还原)文本文件。文件文件名称=压缩文件名+"_new.txt"如:D:lulu_new.txt4)选择L时:输入一个待压缩的文本文件名称(可带路径)。如:D:lulu_new.txt显示出该文本文件的内容5)功能扩展(自己定制):编码使用二进制位,利用位运算进行真正的数据压缩。可对任何文件进行压缩。显示出各种重要信息,如压缩率,各字符的哈夫曼编码表。二、算法设计2.1设计思想:建立哈夫曼树根据哈夫曼树解码对二进制文件进行解码统
6、计字符,得出统计出字符的权值n根据哈夫曼树编码对编码进行压缩生成哈夫曼树生成对应文件生成二进制文件652.2算法思想:2.2.1输入要压缩的文件首先运行的时候,用户主界面上有菜单提示该如何使用软件,根据菜单提示选择所要执行的项,依次进行,因为各个环节之间有先后顺序。第一步为输入压缩软件的名称,由键盘输入文件路径和文件名称,读入字符数组中,打开该文件,按照提示进行压缩。若打不开,则继续输入。2.2.2读文件并计算字符频率文件将信息存放在字符数组中;计算每个字符出现的次数,申请一个结构体数组空间,用读取的字符减去字符结束符作为下标记录字符的
7、频率。2.2.3根据字符的频率,利用Huffman编码思想创建Huffman树将所记录的字符的频率作为权值来创建Huffman树,依次选择权值最小的两个字符作为左右孩子,其和作为父结点的权值,依次进行下去,直到所有的字符结点都成为叶子结点。2.2.4由创建的Huffman树来决定字符对应的编码,进行文件的压缩根据创建的Huffman树来确定个字符的01编码,左孩子为0,右孩子为1。读取文件,依次将每个字符用他们的编码表示,即完成一次编码。2.2.5解码压缩即根据Huffman树进行译码读取编码文件,依据创建的Huffman树,定义一个指
8、针指向根结点。从根结点开始,每读一个字符,指针变化一次(当读取的字符是‘1’时,指针指向当前所指结点的右孩子,当读取的字符是‘0’时,指针指向当前所指结点的左孩子),直至该指针所指结点为叶子结点时结束(即当
此文档下载收益归作者所有