当前位置:文档之家› 数据结构应用设计设计报告

数据结构应用设计设计报告

数据结构应用设计设计报告题目名称:___基于哈夫曼编码的文件压缩器_设计环境:____ __VC6.0 ____________指导教师:_____ _蔡茂蓉______________专业班级:______软件工程0601班__ ___姓名:__ _ __杨文辉_____________学号:___ ____ _____联系电话:_ _电子邮件:设计日期:年月日至年月日设计报告日期:年月日1 .题目................................................................................................... 错误!未定义书签。

2 .需求分析........................................................................................... 错误!未定义书签。

2.1文件压缩过程:......................................................................... 错误!未定义书签。

2.2文件解压过程:......................................................................... 错误!未定义书签。

2.3压缩文件的存储结构设计图:................................................. 错误!未定义书签。

2.4HAF文件示例:...................................................................... 错误!未定义书签。

3 .详细设计........................................................................................... 错误!未定义书签。

3.1压缩流程图:............................................................................. 错误!未定义书签。

3.2解压流程图:............................................................................. 错误!未定义书签。

3.3节点类设计:............................................................................. 错误!未定义书签。

3.4编码和译码时的控制结构的实现............................................. 错误!未定义书签。

4.调试分析........................................................................................... 错误!未定义书签。

6 .测试结果........................................................................................... 错误!未定义书签。

6.1文件压缩..................................................................................... 错误!未定义书签。

6.2文件解压..................................................................................... 错误!未定义书签。

7.实验总结........................................................................................... 错误!未定义书签。

8 .参考文献........................................................................................... 错误!未定义书签。

1 .题目基于哈夫曼编码的文件压缩器2 .需求分析哈夫曼编码在文件压缩中有其独特一点,它的编码方式特殊。

在通信领域可以得到应用。

本程序使用C++编写,在VC6.0上调试,完成了文件的读取,文件字符的统计,哈夫曼树的建立,哈夫曼编码的实现,文件转换为哈夫曼编码成为压缩文件以及文件从压缩状态进行解码。

2.1文件压缩过程:1、找出一个待压缩文件,进行读取,并且统计其每种字节出现的频率。

2、根据已经统计的频率,进行哈夫曼树的构建。

3、对已经构建的哈夫曼树进行哈夫曼编码,将这个文件读入到一个新的文件中4、再次读取文件并且对每一个字符编码,并继续读入到这个新的文件中,这个新的文件就是压缩后的文件5、压缩时函数调用关系为,使用类CHaffmanCode,所有的程度操作函数集中在该类中。

float CHaffmanCode::OpenandCloseFile(char *OpenFile,char *CloseFile){//这个函数压缩函数,把所有要用的操作函数都集中在该函数中。

……CreateHaffmanTree(hArray); //使用得到的权值构建哈夫曼树,这里用矩阵实现EnHaffmanCode(hArray,codes);//对已经构建好的哈夫曼树的每个叶结点进行编码fCompre = ChangtoCode(OpenFile,CloseFile);//把所有的内容都按照编码存入一个新文件,返回文件压缩率return fCompre;//这是返回文件压缩率}2.2文件解压过程:1、从压缩文件读出前部分,就是压缩到文件中的各个节点的权值。

2、使用这些权值再次构建一个哈夫曼树。

3、再读入文件其他的压缩信息,并且使用递推的方式,找到文件中应该有的字符4、把这些字读入一个新文件,完成解压5、解压时函数调用关系,使用类CHaffmanCode,所有的程度操作函数集中在该类中void CHaffmanCode::TranslateCodes(char* OpenFile,char *CloseFile){//这是个解压函数,把相关的操着都封装在其中……CreateHaffmanTree(hArray); //再次使用这些权值建立一个哈夫曼树//再读出压缩文件中存储的原文件的后缀名,且保存在CloseFile的尾部//使用递推的办法在建立的哈弗曼树中找出各个压缩后字符的原子符//将其保存在CloseFile中}2.3压缩文件的存储结构设计图:HAF文件的组成结构2.4HAF文件示例:这是文件压缩时候产生的头部信息,存储的是每个节点的权值的信息,主要为256个节点的权值信息,每个节点的权值是由1个整数表示(即8*4个二进制位)。

在存入节点信息的末尾,存入了4个字符型(即8*4个二进制位),用以存入文件的后缀名。

综上,如果压缩的是空文件(即没有任何字符),那么在压缩文件头部(即haf 文件组成前两部分)应该存储的是一个(4 * 256 + 4 * 1 = 1028(字节))。

这是文件压缩的信息部分,是对待压缩文件每个节点的编码,然后存储的信息。

设计时每种叶子节点的编码为24个整型数据的组成的数组。

用这24个整数表示24个二进制位。

但是由于编码的长度不等,所以字符存入的 长度不等,因此,设计一个数组(暂定1024位),当数组被每个节点的编码(即24位整数中有效的整数位)填满了以后,对这个数组以8位为单位进行转换。

最后一次会由的编码可能不足1024位,这时又对其单独处理。

如果最后剩下的位数不是8位,那么就以加0的方式补充为8位,并在文件的末尾加上补0的个数。

如果未补零,自然这个补0的个数为0。

3 .详细设计3.1压缩流程图:3.2 3.3{int iParent;int iFlag;HaffNode(){iWeight = 0;iLeftChild = -1; iRightChild = -1; iParent = -1; iFlag = 0; }};struct HaffNode设计的作用是使用该节点类构建256个叶子节点,255个非叶子节点。

最终构建成为一个哈夫曼树。

struct Code //用于存每个叶子节点的编码{int iStart;//编码在数组中的开始端int Bit[24];//每个都设置为24位的整数struct Code类的设计旨在构建存储哈夫曼编码后的编码class CHaffmanCode{private:HaffNode *hArray ;Code *codes;char Temp[iMax];int iNumofBits;public:void CreateHaffmanTree(HaffNode *p);//建立哈夫曼树void EnHaffmanCode(HaffNode *p,Code *cd);//对哈夫曼树的每个节点编码float OpenandCloseFile(char *OpenFile,char *CloseFile);//打开文件,调用函数进行编码压float ChangtoCode(char *OpenFile,char *CloseFile);//使用已有的编码,压缩文件,返回压缩率void TranslateCodes(char *OpenFile, char *CloseFile);//译码,解压缩CHaffmanCode();virtual ~CHaffmanCode();};3.4编码和译码时的控制结构的实现class CHaffmanCode是整个编码和译码的控制类,将函数封装在其中。

CHaffmanCode::CHaffmanCode(){hArray = new HaffNode[iNumofCode];//一共申请了511个节点,其中256个叶子节点codes= new Code[256];//对每个叶子节点相应的编码}//////////////////////////////////////////////////////////////////////////float CHaffmanCode::OpenandCloseFile(char *OpenFile,char *CloseFile){//打开一个待压缩文件,提供压缩后存储的地址ifstream infile(OpenFile, ios::in | ios::binary);do{//统计每个节点在ASCII中的出现频率} while(iNumofBits == iMax); //每次读入1024个字节CreateHaffmanTree(hArray); //使用得到的权值构建哈夫曼树,这里用矩阵实现EnHaffmanCode(hArray,codes);//对已经构建好的哈夫曼树的每个叶结点进行编码reutrn ChangtoCode(OpenFile,CloseFile);//把所有的内容都按照编码存入一个新文件}////////////////////////////////////////////////////////////////////////// void CHaffmanCode::CreateHaffmanTree(HaffNode *p){//构建哈夫曼树}////////////////////////////////////////////////////////////////////////// void CHaffmanCode::EnHaffmanCode(HaffNode *p,Code *cd){//使用已经构建的哈夫曼树对每个叶子节点进行编码}////////////////////////////////////////////////////////////////////////// float CHaffmanCode::ChangtoCode(char *OpenFile,char *CloseFile){ifstream ifile(OpenFile,ios::in | ios::binary); //再次读入待压缩的文件ofstream outfile(CloseFile, ios::out | ios::binary);//保存压缩文件for(int iWright = 0; iWright < 256; ++iWright){ //在压缩文件中存入每个叶子节点的权值}outfile.write(FileName,4);//读入文件后缀名do{ //压缩后的文件读入到文件中} while(iNumofBits == iMax); //读入1024个字节ifile.seekg(0,ios::end);long double ldOriginSize = ifile.tellg();outfile.seekp(0,ios::end);long double ldChangedSize = outfile.tellp();return (float)((ldOriginSize - ldChangedSize)/ldOriginSize)*100;//计算压缩率}////////////////////////////////////////////////////////////////////////// void CHaffmanCode::TranslateCodes(char* OpenFile,char *CloseFile){ifstream infile(OpenFile,ios::in | ios::binary);int iRead;for (iRead = 0; iRead < 256; ++iRead){ //把每个节点的权值读出文件}CreateHaffmanTree(hArray); //再次使用这些权值建立一个哈夫曼树infile.read(FileName,4); //文件的后缀名一共存了4个字节,读出文件后缀名。

相关主题