哈夫曼(huffman)编译码器课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
兰州商学院陇桥学院
工学系课程设计报告
设计题目:哈夫曼(huffman)编译码器系别:
专业 (方向):
年级、班:
学生姓名:
学生学号:
指导教师:
年月日
目录
哈夫曼(huffman )编译码器 (3)
一、编译码器开发的背景 (3)
二、系统的分析与设计 (3)
(一)系统功能要求 (3)
(二)系统模块结构设计 (4)
三、系统的设计与实现 (6)
(一)main() (6)
(二)运算 (7)
1. 权值运算quanzhi() (7)
2. 印二叉树函数huffmantree( ) (7)
3.编译码运算huffmancode() (9)
4. 输出运算 shuchu() (9)
四、系统测试 (10)
(一)测试主函数 (10)
(二)测试印二叉树函数 (10)
(三)测试译码运算函数 (11)
五、总结 (12)
六、附件(代码、部分图表) (13)
哈夫曼(huffman )编译码器
一、编译码器开发的背景
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
二、系统的分析与设计
(一)系统功能要求
一个完整的系统应具有以下功能:
1)I:初始化(Initialization)。从终端读入字符集大小n,以
及n个字符和n个权值,建立哈夫曼树,并将它存于文件
hfmTree中。
2)E:编码(Encoding)。利用以建好的哈夫曼树(如不在内存,
则从文件hfmTree中读入),对文件ToBeTran中的正文进行编
码,然后将结果存入文件CodeFile中。
3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile
中的代码进行译码,结果存入文件TextFile中。
4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在
终端上,每行50个代码。同时将此字符形式的编码文件写入
文件CodePrin中。
5)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树
以直观的方式(树或凹入表形式)显示在终端上,同时将此字
符形式的哈夫曼树写入文件TreePrint中。
(二)系统模块结构设计
通过对系统功能的分析,哈夫曼(huffman)编译码器功能如图(1)所示。
图(1)哈夫曼(huffman)编译码器功能图
通过上图的功能分析,把整个系统分为四个模块:
1.初始化模块,该模块主要实现:输入二叉树的结点数,以及要加密的句子,建立哈夫曼树。
2.输出二叉树模块,该运算模块主要实现:将输入的字符串中每
个字符出现的次数当作权值,建立二叉树,将二叉树的parent,weight,lchild,rchild输出。
3.译码模块,该操作主要实现:对编码后的代码进行译码,然后输出。
4.输出模块,该操作主要进行表头的输出。
图2流程图
三、系统的设计与实现
(一)main()
输出1.输出二叉树操作2.进行输出二叉树操作3.退出编译码操作系统,并让用户选择所进行的操作,对其调用。
该模块的具体代码如下所示:
void main()
{
int i,n,s=1;
hnodetype huffnode[maxnode];
while(s)
{
shuchu();
scanf("%d",&i);
switch(i)
{
case 1:
{
haffmantree(huffnode,&n);
break;
}
case 2:
{
haffmancode();
break;
}
case 3:
s=0;
break;
}
}
}
分析:首先输出一个主菜单,方便用户进行操作,用switch语句调用函数使用户对其进行选择要执行的操作(1.输出二叉树操作,2.进行编译码操作,3.退出程序)。
(二)运算
该模块的具体代码如下所示:
1.权值运算quanzhi()
分析:此函数用于对一串字符进行求权值运算,利用循环将一串字符中每个字符的个数设定为权值。
void quanzhi(int t[maxleaf],char s[maxleaf],int n)//求权值函数,将句子中的字符出现的个数当作权值
{
int i,j,h;
for(i=0;i { for(j=0;j if(s[i]==s[j]) h++; t[i]=h; } } 2.印二叉树函数huffmantree( ) void haffmantree(hnodetype huffnode[maxnode],int *m) { int i,j,n,k; int m1,m2,x1,x2; char s[maxleaf],t[maxleaf]; printf("输入叶子结点个数:"); scanf("%d",&n); for(i=0;i<2*n-1;i++)//数组huffnode[]初始化 { huffnode[i].weight=0; huffnode[i].parent=-1; huffnode[i].lchild=-1; huffnode[i].rchild=-1; } printf("输入要编译的句子的\n");