程序设计报告(哈夫曼压缩).docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
软件工程学院 《程序设计实践(下)》设计报告 (哈夫曼压缩) 姓名 求春磊 学号专业班级 软件3班 提交日期 12.30 成绩 指导教师 问题解析(对问题的分析、解题思路与解题方法) 经整理后原问题可以分解为: 文件读入、统计字符频率、构造哈夫曼树 由哈夫曼树得出每个字符的编码 图形化输出哈夫曼树、哈夫曼编码 压缩、解压和比较 本人负责压缩、解压和比较部分。 解题思路: 压缩只需要将原文件内容中的每一个字符转换为相对应的编码即可,压缩也只需要将编码转换为原来的字符内容即可。比较这一步也很简单,一个是对原文件与压缩后文件的大小比较并得出压缩率;另一个是将原文与经过压缩解压后的文件内容进行比较,检查压缩与解压的正确性。当然,比较这一步可以很好的验证我之前的压缩与解压步骤的正确性。 解题方法: 以上是从刚开始就明确的解决思路,不过后来在实现的时候遇到一点小问题——没学过二进制的存储,因此也就没法直接将字符转换为二进制内容转换文件。同样的也不能将压缩后的文件进行解压,当然...这只是个小问题。在比较这方面,遇到的问题是:文件的读取与写入。表示不擅长,百度了好久,又调试了很久才找到一个可靠的函数。囧。 关于二进制的问题,其实也很容易解决,只要联想到char型的字符是一个字节,而且更关键的是它完全符合ascii码。于是利用char轻松完成压缩步骤。解压与压缩大同小异,不过是在读取的时候进行一下控制就可以马上搞定的。至此,第一个问题基本上可以解决了。 至于第二个问题,文件的读写。不知是技术性问题还是之前找的函数真的行不通,找了好久,排除了很多函数。最后选定使用fgetc()函数。对于这个函数...虽然不太明白为什么它可以一直读下去而不是每次都从头开始读写。不过目前能用就行。 任务分工及进度计划 小组成员:王倩,求春磊,章力挺,张琪 分工: 王倩:文件的读写操作 求春磊:文件的压缩、解压和比较 章力挺:构造哈弗曼树,获取哈弗曼编码 张祺:图形、界面的美化及其余三人的编码联接 进度计划: 由王倩、章力挺和张琪先完成各自的部分,然后我根据所构造的哈夫曼树和哈夫曼编码进行文件的压缩、解压和比较。最后,再由张祺将我的部分插入写好的主题文件中。任务完成。 数据结构选择、算法设计(伪代码,算法思想) 结构: 哈夫曼树。 算法设计: 之前其他组员已经完成了哈夫曼树的构建和哈弗曼编码的获取,我只要进行字符与编码的转化就行了。 其中,已完成的哈夫曼树结构采用的是数组模拟的形式,但与树结构大同小异,在向负责构造的组员了解原理后便进行压缩过程。 void yasuo( ){ c = fgetc( fq );//这里就是百度到的那个让我觉得神奇的函数 while( c != EOF ){ for( i=0 ; hafucode[c][i] ; i++ ){//读取哈夫曼编码 flag++;//标记已有长度 x = x*2 + hafucode[c][i] - 0; if( flag == 7 )//当长度满足一个ascii长度时进行写入 { fprintf( fq2, %c, x); flag = 0; x = 0;//初始化操作 } }c = fgetc( fq ); } if( flag != 7 ){ x = x 7-flag; fprintf( fq2, %c, x); }//当最后一个编码不能满足一个ascii长度的时候采用填充的方式 }//压缩文件的函数yasuo( ); void jieya( ) { c = fgetc( fq );//文件读取 flag = Max;//初始化,将flag初始化为哈夫曼树的头结点所在位置 while( c != EOF ) { for( i = 6; i =0 ; i-- ) {//压缩是设置为按七位ascii码压缩,所以解压是也是对应七位解压 d = ( c i ) % 2; //判断左孩子还是右孩子 if( d == 0 )//左孩子 flag = node[flag].left_child; Else//右孩子 fl

文档评论(0)

lyxbb + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档