1、4.3.2 张颖设计实现 174.3.3 刘琪设计实现 204.3.4 张晓雨设计实现 225 测试与调试 255.1 个人测试(按组员分工) 255.1.1 王健测试 255.1.2 张颖测试 265.1.3 刘琪测试 275.1.4 张晓雨测试 315.2 组装与系统测试 325.3 系统运行 326 课题总结 336.1 课题评价 336.2 团队协作 336.3 下一步工作 336.4 个人设计小结(按组员分工) 336.4.1 王健设计小结 336.4.2 张颖设计小结 346.4.3 刘琪设计小结 346.4.4 张晓雨设计小结 347 附录A 课题任务分工 35A-1 课题程序设
2、计分工 35A-2 课题报告分工 36 附录B 课题设计文档(光盘) 37B-1源程序代码(*.H,*.CPP) 37B-2工程与可执行文件) 37 附录C 用户操作手册(可选) 37C.1 运行环境说明 37C.2 操作说明 371 课题概述1.1课题任务 采用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。利用哈夫曼编码对文本或图像进行数据压缩,设计数据压缩软件。【设计要求】(1)采用静态链表的二叉树等数据结构。(5)其它完善性功能。1.2课题原理 1.2.1哈夫曼树:哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶子结点的权值乘上其到根结点
3、的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为 ,n个权值构成一颗有n个叶结点的二叉树,相应的叶结点的路径长度为。可证明哈夫曼树的WPL是最小的。 1.2.2压缩软件:压缩软件是利用算法将文件有损或无损地处理,以达到保留最多文件信息,而令文件体积变小的应用软件。压缩软件一般同时具有解压缩的功能。压缩软件的的基本原理是查找文件内的重复字节,并建立一个相同字节的词典文件,并用一个代码表示,比如在文件里有几处有一个相同的词中华人民共和国用一个代码表示并写入文件,这样就可以达到缩小文件的目的。常见的压缩软件有WinRAR ,好压(Haozip),WinZip
4、,7-Zip,WinMount,Peazip等等。 1.2.3哈夫曼压缩:哈夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。哈夫曼压缩属于可变代码长度算法一族。意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。1.3相关知识 1.3.1二进制文件的创建、读取、写入操作 1.3.2数学统计 1.3.3哈夫曼树算法 1.3.4获取哈夫曼编码 1.3.5压缩文件相关信息 1.3.6 C/C+语言的熟悉掌握,一定程度上掌握MFC 2 需求分析2.1课题调研 随着计算机技术的发展,人们对文件
5、信息的需求量逐渐增大,不光对文件个数的使用量增加,单个文件的内存也增大到几个G,这种现象的产生,将导致计算机上内存的消耗过大,以及计算机对文件的操作变得十分困难。2.2用户需求分析 经过调研,目前用户比较倾向的压缩工具的特点有:使用方便、用户友好,在压缩率以及压缩速度方面表现出色。 在这个背景下,我们小组决定运用哈夫曼算法,设计一款符合大众要求的小压缩工具。3 方案设计3.1总体功能设计3.2数据结构设计/压缩函数使用数据结构typedef struct HTNode unsigned char b; /*the charactor*/ long parent,lchild,rchild; /
6、*make a tree*/ char bits256; /*the haffuman code*/ long count; /*the frequency*/HTNode,*HuffmanTree; /动态分配数组存储哈夫曼树t/解压函数使用数据结构struct head long parent, lch, rch;header512, tmp;3.3函数原型设计void Select(HuffmanTree HT,int x,int &s1,int &s2); /HT数组1x中选出能够建树结点中权值最小两个void Compress(char *filename,char *outputf
7、ile); /压缩函数void DeCompress(char *filename, char *outputfile); /解压函数3.4主算法设计压缩算法实现解压算法实现3.5用户界面设计3.5.1主界面 3.5.2菜单界面3.5.3压缩界面3.5.4解压界面3.5.5查找文件和寻找压缩路径界面4 方案实现4.1开发环境与工具 硬件:个人PC 软件:VS2013 开发环境:C+4.2程序设计关键技术 二进制文件的读取、写入; 哈夫曼算法; MFC实现图形界面。4.3个人设计实现(按组员分工)4.3.1王健设计实现4.3.1.1实现部分压缩void Compress(char *filena
8、me,char *outputfile)/*前面省略其他人的部分*/fseek(ifp,0,SEEK_SET); fwrite(&flength,sizeof(long),1,ofp); /压缩文件前四个字节用于/存放原文件字节数 / fwrite(const void* buffer, size_t size, size_t count, FILE* stream); /* fwrite这个函数以二进制形式对文件进行操作,不局限于文本文件 (1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;(2)size:要写入内容的单字节数; (3)count:要进行写入size字节的
9、数据项的个数; (4)stream:目标文件指针; (5)返回实际写入的数据项个数count。 */ fseek(ofp,8,SEEK_SET); /ofp从第九个字节处开始写入压缩编码 buf0=0; f=0; pt1=8; /用于记录写入压缩文件的字节数 while(!feof(ifp) ch=fgetc(ifp); f+; for(i=0;i=8) /每满八位,存储至文件 for(i=0;8;i+) if(bufi=1) ch=(ch1)|1; /左移一位,用零补,并加一 else ch=ch0) /flength不是八的整数倍,用0补全 strcat(buf,00000000); fs
10、eek(ofp,4,SEEK_SET);pt1,sizeof(long),1,ofp); /第二个四字节存放哈夫曼树在/压缩文件的位置 fseek(ofp,pt1,SEEK_SET);n,sizeof(long),1,ofp); /pt1个字节后存放哈夫曼树结点/数i+) /将哈夫曼编码信息存入压缩文件 fwrite(&(HTi.b),1,1,ofp); /单个字节存储一个叶子结点 ch=strlen(HTi.bits); /接着存储其哈夫曼编码数 j=strlen(HTi.bits); if(j%8!=0) /每个叶子结点哈夫曼编码不足八位,左移,并补零 for(f=j%8;ff+) str
11、cat(HTi.bits,0 while(HTi.bits0!=0) for(j=0;jj+) if(HTi.bitsj= strcpy(HTi.bits,HTi.bits+8); /将哈夫曼编码信息存入压缩文件 fclose(ifp); fclose(ofp);4.3.1.2实现部分MFC实现图形界面/类 Class CHuffmanDlg:public CDialog /主界面类 Class menu:public CDialog /菜单界面类 Class compress:public CDialog /压缩界面类 Class Decompress:public CDialog /解压界
12、面类/主界面类中的函数成员 afx_msg void OnBnClickedOk(); /鼠标按下功能选项按钮afx_msg void OnBnClickedCancel(); /鼠标按下退出/菜单界面类中的函数成员 afx_msg void OnOk2(); /鼠标按下解压按钮 /鼠标按下压缩按钮afx_msg void OnBnClickedButton1(); /鼠标按下取消按钮/压缩界面类中的函数成员afx_msg void OnButton1(); /鼠标按下查找1按钮(弹出文件查找界面) afx_msg void OnBnClickedButton2(); /鼠标按下查找2按钮(弹
13、出保存文/件路径界面)afx_msg void OnEnChangeEdit3(); /压缩文件命名编辑框 afx_msg void OnBnClickedButton3(); /鼠标按下确定按钮/解压界面类中的函数成员 afx_msg void OnButton1();afx_msg void OnEnChangeEdit2(); afx_msg void OnBnClickedButton4();4.3.2张颖设计实现实现部分解压/解压功能,此设有调试函数#includestring.hstdlib.h#ifndef HEAD2_H#define HEAD2_Hvoid DeCompres
14、s(char *filename, char *outputfile) char buf255, bx255; unsigned char c; long i, j, m, n, f, p, l; long flength; /flength文件中存储字节数 FILE *ifp, *ofp; for (i = 0; i 512; +i) headeri.count = 0; ifp = fopen(filename, rb if (ifp = NULL) exit(0); ofp = fopen(outputfile, wb if (ofp = NULL) fread(&flength, si
15、zeof(long), 1, ifp); /读取前四个字节 ,/flength为原文件字节数f, sizeof(long), 1, ifp); /f为压缩文件中哈夫曼树信息前/的字节数 fseek(ifp, f, SEEK_SET);n, sizeof(long), 1, ifp); /读取哈夫曼树叶子结点数nfor (i = 0; i0) m = p / 8 + 1; else m = p / 8; for (j = 0; jf; l-) /不足八位用零补 strcat(headeri.bits, strcat(headeri.bits, buf); headeri.bitsp = 0; i
16、+) for (j = i + 1; j+) if (strlen(headeri.bits)strlen(headerj.bits) tmp = headeri; headeri = headerj; headerj = tmp; p = strlen(headern - 1.bits); /最长叶子结点编码长度 fseek(ifp, 8, SEEK_SET); /ifp开始指向原文件内容信息 m = 0; bx0 = 0; while (1) while (strlen(bx)(unsigned int)p) l-) strcat(bx, strcat(bx, buf); i+) if (
17、memcmp(headeri.bits, bx, headeri.count) = 0) /比较内存区域headeri.bits和bx的前count个字节 strcpy(bx, bx + headeri.count); c = headeri.b;c, 1, 1, ofp); m+; if (m = flength) break; return;int main() char filename100,outputfile100; int c; char b; printf(n Haffman文件压缩软件解压模块测试:n 1 解压n 2 退出nn请输入序号选择功能: scanf(%d%c,&c,
18、&b); if(c=1)请输入要解压的文件名: gets(filename);) ;请输入解压后的文件名: gets(outputfile); DeCompress(filename,outputfile); return 0;4.3.3刘琪设计实现/统计:读入源文件,统计字符出现的次数(即统计权重),顺便根据权重进行从大到小的/排序(主要的话之后的操作会简单一些); /动态分配数组存储哈夫曼树 typedef char* HuffmanCode; /动态分配数组存储哈夫曼编码表/下面具体代码在head1.h的函数compress里 FILE *ifp,*ofp; HTNode HT512;
19、unsigned char ch; /无符号字符型,可以做数组下表 char buf512; int i,j,f,n,m,s1,s2; long pt1,flength; /flength原文件字节个数,pt1压缩文件中哈夫曼/树信息前字节个数 HTNode tmp;256;+i) HTi.count=0; ifp=fopen(filename, /原文件 if(ifp=NULL) ofp=fopen(outputfile, /压缩文件 if(ofp=NULL) flength=0;ch,1,1,ifp); HTch.count+; flength+; flength-; /flength表示
20、字节总数,feof判断,结尾重复一次 ,需要减一 HTch.count-; /最后一个字节频率减一512;i+) /二次定义结点 if(HTi.count!=0) HTi.b=(unsigned char)i; HTi.b=0; /NULL HTi.parent=-1; HTi.lchild=HTi.rchild=-1;for(i=0;i+) /排序,大在前,小在后 for(j=i+1; if(HTi.countHTj.count) tmp=HTi; HTi=HTj; HTj=tmp;4.3.4张晓雨设计实现设计实现哈夫曼树构建、哈夫曼编码生成/构建哈夫曼树功能,生成哈夫曼编码,设有调试函数HTNod
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1