华 北 科 技 学 院
课程设计说明书
学号:
201807014120
姓名:
哈夫曼编译码器
在线教学设计
班级:
设计题目:
设计地点:
设计时间:
至 2020.6.12
总评成绩:___________________________
指导教师:
盛建瓴 鞠宏军 邵铁君
2020.6.1
1
目 录
第一章 需求分析................................................................................................................................1
1.1 设计名称......................................................................................................................................1
1.2 设计内容、目的与要求..............................................................................................................1
1.2.1 设计内容....................................................................................................................1
1.2.2 目的与要求................................................................................................................ 1
1.2.3 主要功能....................................................................................................................1
1.3 解决的问题..................................................................................................................................2
第二章 总体设计................................................................................................................................2
2.1 系统框图.....................................................................................................................................2
2.2 总流程图.....................................................................................................................................3
第三章 详细设计................................................................................................................................4
3.1 数据结构.....................................................................................................................................4
3.1.1 函数列表....................................................................................................................4
3.1.2 文件存放内容列表.................................................................................................... 4
3.2 主要函数介绍...........................................................................................................................5
3.2.1 main()主函数......................................................................................................5
3.2.2 初始化 Init()函数 ..................................................................................................6
3.2.3 编码 Encoding()函数 .............................................................................................7
3.2.4 译码 Decoding()函数 ............................................................................................ 8
3.2.5. 打印编码 CodePrint()函数................................................................................... 8
3.2.6. 打印哈夫曼树表 HuffmanTreePrint()函数 ............................................................9
第四章 调试与测试..........................................................................................................................10
4.1 调试...........................................................................................................................................10
4.1.1 开始进入菜单界面................................................................................................... 10
4.1.2 初始化......................................................................................................................10
4.1.3 编码......................................................................................................................... 13
4.1.3 译码......................................................................................................................... 14
4.1.3 打印编码..................................................................................................................14
2
4.1.3 打印哈夫曼树表.......................................................................................................15
4.1.3 退出程序..................................................................................................................15
4.2.测试............................................................................................................................................16
第五章 心得体会..............................................................................................................................17
附 录:源程序................................................................................................................................18
指导教师评语及成绩..........................................................................................................................26
3
第一章 需求分析
1.1 设计名称
1.2 设计内容、目的与要求
1.2.1 设计内容
项目二、哈夫曼树编译码器
哈夫曼树的构造采用的是链式存储结构,方便修改替换,每个节点都有以下 5 个域:ch,weight,
parent,lchild,rchild,分别存储了哈夫曼树的字符,权值,双亲,左孩子,右孩子等内容。其他数
组形式的数据采用的都是顺序存储结构,方便查找。
1) 初始化和打印哈夫曼编译码表,初始化赫夫曼树,并将哈夫曼编译码表打印到
D:\HuffmanTree.txt 中;
源字符串存入 D:\ToBeTran.txt 中;
2) 编码,对文件 D:\Code.txt 中的正文进行编码,然后将结果存入文件 D:\Code.txt 中,
3) 译码,利用已经建立好的哈夫曼树将文件 codefile 中的代码进行译码,结果存入
D:\Decode.txt 中;
4) 打印编码,每行 50 个代码将 D:\Code.txt 中加密好的编码打印到 D:\CodePrint.txt 中;
5) 打印哈夫曼树,将文件 D:\Code.txt 以紧凑格式显示在终端上,每行 50 个代码,同时
将此字符形式的编码写入文件 D:\CodePrint.txt 中;
6) 退出,退出程序。
1.2.2 目的与要求
(1) I:初始化(Initialization)。从终端读入字符集大小 n,以及 n 个字符和 n 个权值,建立哈
夫曼树,并将它存于文件 D:\HuffmanTree.txt 中。
(2)E:编码(Encoding)。利用已经建好的哈夫曼树(如不在内存,则从文件 D:\HuffmanTree.txt
中读入),对文件 D:\Code.txt 中的正文进行编码,然后将结果存入文件 D:\Code.txt 中,源字符串
放入 D:\ToBeTran.txt 文件中。
(3) D:译码(Decoding)。利用已经建好的哈夫曼树将文件 CodeFile 中的代码进行译码,结
果存入文件 TextFile 中。
(4) P:打印代码文件(Print)。将文件 D:\Code.txt 以紧凑格式显示在终端上,每行 50 个代码,
同时将此字符形式的编码写入文件 D:\CodePrint.txt 中。
(5)T:打印哈夫曼树(HuffmanTreePrint)。在终端上显示哈夫曼树表,并打印到 D:\HuffmanTree.txt
文件中;
(6)Q:退出程序(Exit)。
1.2.3 主要功能
本设计是通过读取文件中的字符及其使用频度构造哈夫曼树,再根据哈夫曼树进行
哈夫曼编码,然后再根据构建的哈夫曼树对加密后的编码进行编译,还原成字符串形
1
式。1.3 解决的问题
哈夫曼编译码器采用变长编码表示,给频率高的字符较短的编码;频率低的字符
较长的编码,达到整体编码减少的目的,大幅度减少储存空间。
第二章 总体设计
2.1 系统框图
图 2-1 哈夫曼树编译码器系统框图
2
2.2 总流程图
图 2-2 哈夫曼编译码器系统流程图
3
第三章 详细设计
3.1 数据结构
3.1.1 函数列表
函数名
函数类型 对应功能
表 3-1 函数列表
Select()
void
选出 HT 树到 a 为止,权值最小且 parent 为 0 的 2 个节点
HuffmanCoding() void
构建赫夫曼树 HT,并求出 n 个字符的赫夫曼编码 HC
Vision()
Init()
Encoding()
Decoding()
void
void
void
void
CodePrint()
void
HuffmanTreePrint
()
main()
void
void
3.1.2 文件存放内容列表
打印界面菜单
初始化,构造编译码表
编码
译码
将 D:\Code.txt 中加密好的编码打印到 D:\CodePrint.txt
中
以表的形式打印哈夫曼树
构造一个选择功能的菜单
文件地址
文件内容
表 3-2 文件存放内容列表
D:\Code.txt
字符串加密后的编码
D:\Decode.txt
翻译编码之后得到的译码
D:\ToBeTran.txt
输入的要加密的字符串
D:\HuffmanTree.txt 编译码表和哈夫曼树表
D:\CodePrint.txt
从 Code.txt 中复制过来的加密后的编码
4
3.2 主要函数介绍
3.2.1 main()主函数
这个函数是本程序的主体部分,用 while 使调用每个功能之后都能循环回到菜单,通过 if 语句
来实现菜单选择功能,工作流程如下:
图 3-1
main()主函数流程图
5