哈夫曼编译码器实验报告.doc
文本预览下载声明
实验五 哈夫曼编/译码器
学院: 工学院 系: 计算机系 专业: 计算机科学与技术 年级: 姓名:学号:实验时间: 2011-5-19
需求分析
1.问题描述
用huffman编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。是为着这样的信息收发站写一个huffman编/译码系统。
2.基本要求
该系统应具有以下功能:
I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存进文件hfmTree中。
E:编码(Encoding)。利用建好的哈夫曼树(如不在内存中,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。
D:译码(Decoding)。(利用已经建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。
P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrin中。
T:印哈夫曼树(Tree printing)。将已在内存中的哈夫曼树以直观的方式(凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrin中。
3.测试数据
(1)利用下面这道题中的数据调试程序。
某系统在通信联络中只可能出现八种字符,其概率分别为0.25,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计哈夫曼编码。
(2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROMGRAM IS MY FAVORITE”。
字符 A B C D E F G H I J K L M 频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符 N O P Q R S T U V W X Y Z 频度 57 63 15 1 48 51 80 23 8 18 1 16 1
二.概要设计
本程序的数据类型定义为
typedef struct{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char** HuffmanCode;
所实现的功能函数如下
void initHuffmanTree();//选择初始化哈夫曼树的方式
int openfileInit();//通过打开的data.txt文件初始化哈夫曼树 该文件是为了测试数据2 包涵26个字符
int inputInit();//通过手动输入字符初始化哈夫曼树
int HuffmanCoding(int *w); //初始化哈夫曼数,按照哈夫曼规则建立二叉树。此函数块调用了Select()函数。
void Select(int j,int s1,int s2); //选择parent为0,且weight最小的两个节点 序号为s1,s2
void encoding();//选择哈夫曼编码方式
void openfileEnco();//通过打开文件encode.txt的方式进行编码
void inputEnco();//通过手动输入的方式进行编码
void decode();//选择译码方式
void openfileDeco();//通过打开文件CodeFile.txt的方式进行译码
void inputDeco();//通过手动输入的方式进行译码
void dispHT( HuffmanTree nodeRoot, int level ); //以缩进方式输出哈夫曼树直观图
主函数
主函数主要设计的是一个分支语句,让用户挑选所实现的功能。
如图所示:
三.详细设计
#includeiostream
#includefstream
#includecstring
using namespace std;
ofstream outstuf;
typedef struct{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char** HuffmanCo
显示全部