1、 1 工学系课程设计报告工学系课程设计报告 设设 计计 题题 目:目:哈夫曼哈夫曼(huffmanhuffman)编译码器编译码器 系系 别:别: 专专 业业 ( (方方 向向) ): 年年 级、级、 班:班: 学学 生生 姓姓 名:名: 学学 生生 学学 号:号: 指指 导导 教教 师:师: 年年 月日月日 2 目目 录录 哈夫曼(huffman )编译码器 2 一、 编译码器开发的背景 3 二、系统的分析与设计 3 (一)系统功能要求. 3 (二)系统模块结构设计. 4 三、系统的设计与实现 5 (一)main(). 5 (二)运算. 6 1. 权值运算 quanzhi(). 6 2. 印
2、二叉树函数 huffmantree( ). 7 3.编译码运算 huffmancode(). 8 4. 输出运算 shuchu() 9 四、系统测试 10 (一)测试主函数. 10 (二)测试印二叉树函数. 10 (三) 测试译码运算函数. 11 五、总结 12 六、附件(代码、部分图表) 12 哈夫曼哈夫曼(huffman )编译码器编译码器 3 一、编译码器开发的背景编译码器开发的背景 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息 传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统 对待传数据预先编码,在接收端将传来的数据进行译码(复原) 。对 于双工信道(即可以双向传
3、输信息的信道) ,每端都需要一个完整的 编/译码系统。 二、系统的分析与设计二、系统的分析与设计 (一)系统功能要求(一)系统功能要求 一个完整的系统应具有以下功能: 1) I:初始化(Initialization) 。从终端读入字符集大小 n,以 及 n 个字符和 n 个权值,建立哈夫曼树,并将它存于文件 hfmTree 中。 2) E:编码(Encoding) 。利用以建好的哈夫曼树(如不在内存, 则从文件 hfmTree 中读入) , 对文件 ToBeTran 中的正文进行编 码,然后将结果存入文件 CodeFile 中。 3) D: 译码 (Decoding) 。 利用已建好的哈夫曼树
4、将文件 CodeFile 中的代码进行译码,结果存入文件 TextFile 中。 4) P:印代码文件(Print) 。将文件 CodeFile 以紧凑格式显示在 终端上,每行 50 个代码。同时将此字符形式的编码文件写入 文件 CodePrin 中。 4 5) T:印哈夫曼树(Tree Printing) 。将已在内存中的哈夫曼树 以直观的方式(树或凹入表形式)显示在终端上,同时将此字 符形式的哈夫曼树写入文件 TreePrint 中。 (二)系统模块结(二)系统模块结构设计构设计 通过对系统功能的分析,哈夫曼(huffman)编译码器功能如图 (1)所示。 图(1)哈夫曼(huffman)
5、编译码器功能图 通过上图的功能分析,把整个系统分为四个模块: 1.初始化模块,该模块主要实现:输入二叉树的结点数,以及要 加密的句子,建立哈夫曼树。 2.输出二叉树模块,该运算模块主要实现: 将输入的字符串中每 个 字 符 出 现 的 次 数 当 作 权 值 , 建 立 二 叉 树 , 将 二 叉 树 的 parent,weight,lchild,rchild 输出。 初 始 化 输 出 二 叉 树 编 译 码 输 出 代 码 选 择 操 作 哈夫曼(huffman )编译码器 5 3.译码模块,该操作主要实现:对编码后的代码进行译码,然后 输出。 4.输出模块,该操作主要进行表头的输出。 图
6、 流程图 三、系统的设计与实现三、系统的设计与实现 (一)(一)main()main() 输出 1.输出二叉树操作2.进行输出二叉树操作3.退出编译码操 作系统,并让用户选择所进行的操作,对其调用。 开始 用户选择 y=1 y=2 y=3 建立二叉树, 输 出二叉树 输入叶子节点 数 对 输 入 的 句 子进行编码 结束 否 否 是 输入句子 退出系统 输出每个字符 的编码 6 该模块的具体代码如下所示: void main() int i,n,s=1; hnodetype huffnodemaxnode; while(s) shuchu(); scanf(“%d“, switch(i) case 1: haffmantree(huffnode, break; case 2: haffmancode(); break;