当前位置:文档之家› 哈夫曼实验报告材料(附代码)

哈夫曼实验报告材料(附代码)

哈弗曼编码/译码器一、程序的功能分析1.构造哈夫曼树及哈夫曼编码:从终端读入字符集大小n、n个字符以及n个对应的权值,建立哈夫曼树;利用已经建好的哈夫曼树求每个叶结点的哈夫曼编码,并保存。

2.编码:利用已构造的哈夫曼编码对“明文”文件中的正文进行编码,然后将结果存入“密文”文件中。

3.译码:将“密文”文件中的0、1代码序列进行译码。

(读文件)4.打印“密文”文件:将文件以紧凑格式显示在终端上,每行30个代码;同时,将此字符形式的编码文件保存。

5.打印哈夫曼树及哈夫曼编码:将已在存中的哈夫曼树以凹入表形式显示在终端上,同时将每个字符的哈夫曼编码显示出来;并保存到文件。

二、基本要求分析1、输入输出的要求按提示容从键盘输入命令,系统根据用户输入的需求在保证界面友好的前提下输出用户所需信息,并按要求保存文件,以便保存备份信息。

2、测试数据(1).令叶子结点个数N为4,权值集合为{1,3,5,7},字符集合为{A,B,C,D},且字符集与权值集合一一对应。

(2).令叶子结点个数N为7,权值集合为{12,6,8,18,3,20,2},字符集合为{A,B,C,D,E,F,G},且字符集与权值集合一一对应。

(3).请自行选定一段英文文本,统计给出的字符集,实际统计字符的频度,建立哈夫曼树,构造哈夫曼编码,并实现其编码和译码。

三、概要设计1.主模块的流程及各子模块的主要功能主函数负责提供选项功能,循环调控整个系统。

创建模块实现接收字符、权值、构建哈夫曼树,并保存文件,此功能是后续功能的基础。

编码模块实现利用已编好的哈夫曼树对每个字符进行哈夫曼编码,即对每个字符译出其密文代码,并保存文件。

译码模块实现对用户输入的密文翻译成明文,即用户所需的字符串信息。

输出模块实现对已编好的哈夫曼树以凹入表的的形式输出。

2、模块之间的层次关系1.采用c语言定义的相关数据类型(1)结点的类型定义描述如下:#define N 叶子结点的个数typedef strcut{int weight; /*结点权值*/int parent;int lchild;int rchild;}HNodeType;HNodeType HNode[2*N-1];(2)编码的类型定义描述如下:#define MAXBIT 10typedef struct{int bit[MAXBIT];int start;}HCodeType;HCodeType HCode[N];2.各模块伪算法(1)主函数int main(){do:{界面友好设计;cout<<各个选项功能容;cin>>ch;容错处理;switch(ch){case 1:.....}}while();return 0;}(2)系统初始化模块void create() //系统初始化{for(i=0;i<2*N-1;i++) //数组HNode初始化{};从键盘接收字符;for(i=0;i<N;i++){ cout<<"输入字符"<<endl;cin>>HNode[i].data;}接收权值;构造哈夫曼树;for(i=0;i<N-1;i++){ 找最小和次小两个权值;将找出的两棵子树合并为一棵子数;}将已建好的哈夫曼树存入文件hfmtree.txt中;调用哈夫曼编码子函数;}void HaffmanCode() //对哈夫曼树进行编码{从hfmtree.txt文件中读出哈夫曼树的信息存入存HNodeType a[2*N-1];求每个叶子结点的哈夫曼编码;for(i=0;i<N;i++){从叶节点回溯,回溯到根结点(parent==-1);记录回溯路径;}打印出每个字符对应的密文;将密文信息存入文件codefile.dat中;}(3)编码模块void HfmanCode() //对用户输入的字符串进行编码{提示输入信息;接收用户输入的要编译的字符串;cin>>s;//从文件中读取哈夫曼编码信息infile.open ("F:\\codefile.dat",ios::in|ios::binary); //读文件for(i=0;i<N;i++) //将文件中的数据读出放在temp[i]//从文件中读字节到指定的存储器区域。

infile.read ((char*)&temp[i],sizeof(temp[i]));循环实现将用户输入的字符串转换成对应的密文,并保存;将保存结果存入密文文件;}(4(5五、调试分析1.调试过程中遇到的问题和对问题的解决方法对文件的读写操作不熟悉,调试时,将已写入的文件不能读出,以至于后续操作无法实现,对此,我有翻看C++程序设计课本,了解关于文件操作的具体容,明白二进制文件和文本文件的读写方式是有很大区别的,不可混淆操作。

另外,对于程序的输出阶段开始时出现了问题,递归调用没有分析清楚,递归思想是层次分明,逐层深入。

2.算法的时间复杂度(1)创建模块O(N^3)(2)编码模块O(N)(3)译码模块O(n)其中n为用户输入的密文位数(4)打印模块O(N)六、使用说明及测试结果用户根据提示信息,初次使用本系统时要首先选择创建选项来初始化系统,根据提示信息输入信息,存入文件,使得后续功能顺利实现。

非初次使用时,用户可根据自己的需求来选择功能选项,根据提示信息输入、获得所需信息。

测试:1. 令叶子结点个数N为4,权值集合为{1,3,5,7},字符集合为{A,B,C,D},且字符集与权值集合一一对应。

2.令叶子结点个数N为7,权值集合为{12,6,8,18,3,20,2},字符集合为{A,B,C,D,E,F,G},且字符集与权值集合一一对应。

3.自行选定一段英文文本,统计给出的字符集,实际统计字符的频度,建立哈夫曼树,构造哈夫曼编码,并实现其编码和译码。

w h i l c t p4 3 3 1 1 1 54.可实现多个编码文件共存以及容错处理七、程序代码#include<iostream.h>#include<iomanip.h>#include<fstream.h>#include<string.h>#define N 7 //叶子结点的个数#define MAXBIT 50 //编码位数#define Maxvalue 100 //定义最大权值整数常量//结点的类型定义描述如下:typedef struct{char data;int weight; /*结点权值*/int parent;int lchild;int rchild;}HNodeType;HNodeType HNode[2*N-1];//编码类型描述如下:typedef struct{int bit[MAXBIT];int start;char s;}HCodeType;HCodeType HCode[N];//密文格式类型typedef struct{int code[MAXBIT];int num;}CD;void create();void HaffmanCode();void print();void print_t(HNodeType temp[],HNodeType T,int h);void translate();void HfmanCode();char name[50][30];//用来记录用户输入的密文文件int filenum=0;int textnum=0;int main(){char ch;int h=1;HNodeType *pNode;pNode=HNode;do{cout<<setw(60)<<" "<<endl;cout<<setw(60)<<"--------- 欢迎进入系统!--------------"<<endl;cout<<setw(50)<<"1:初始化编译系统"<<endl<<setw(40)<<"2:编码"<<endl<<setw(40)<<"3:译码"<<endl<<setw(48)<<"4:打印哈弗曼树"<<endl<<setw(40)<<"5:退出"<<endl;cout<<setw(60)<<"--------------------------------------"<<endl;cout<<" 请选择(0~5):";cin>>ch;while(!(ch<='5'&&ch>='0')) /*输入不在0到5之间无效*/{cout<<" 数据输入错误,请重新选择(0~7):";cin>>ch;}switch(ch){case '1': create(); break; //系统初始化,构造哈夫曼树case '2': HfmanCode(); break; //对哈夫曼树进行编码case '3': translate(); break; //译码case '4': print(); //将哈夫曼树以凹入表的形式输出case '5': break;}}while(ch!='5');return 0;}void create() //模块一,系统初始化{fstream outfile;int i,j;int m1,m2,x1,x2;for(i=0;i<2*N-1;i++) //数组HNode初始化{HNode[i].data='\0';HNode[i].weight=0;HNode[i].parent=-1;HNode[i].lchild=-1;HNode[i].rchild=-1;}cout<<"分别输入"<<N<<"个叶子结点的字符。

"<<endl; //从键盘接收叶子节点的权值for(i=0;i<N;i++){cout<<"输入字符"<<endl;cin>>HNode[i].data;}cout<<"分别输入"<<N<<"个与字符对应的权值。

相关主题