编译码器课程设计精品.docx
《编译码器课程设计精品.docx》由会员分享,可在线阅读,更多相关《编译码器课程设计精品.docx(18页珍藏版)》请在冰豆网上搜索。
编译码器课程设计精品
工学系课程设计报告
设计题目:
哈夫曼(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、编译码器开发的背景
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
二、系统的分析与设计
(一)系统功能要求
一个完整的系统应具有以下功能:
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:
印哈夫曼树(TreePrinting)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。
(二)系统模块结构设计
通过对系统功能的分析,哈夫曼(huffman)编译码器功能如图
(1)所示。
图
(1)哈夫曼(huffman)编译码器功能图
通过上图的功能分析,把整个系统分为四个模块:
1.初始化模块,该模块主要实现:
输入二叉树的结点数,以及要加密的句子,建立哈夫曼树。
2.输出二叉树模块,该运算模块主要实现:
将输入的字符串中每个字符出现的次数当作权值,建立二叉树,将二叉树的parent,weight,lchild,rchild输出。
3.译码模块,该操作主要实现:
对编码后的代码进行译码,然后输出。
4.输出模块,该操作主要进行表头的输出。
是
否
否
图2 流程图
三、系统的设计与实现
(一)main()
输出1.输出二叉树操作2.进行输出二叉树操作3.退出编译码操作系统,并让用户选择所进行的操作,对其调用。
该模块的具体代码如下所示:
voidmain()
{
inti,n,s=1;
hnodetypehuffnode[maxnode];
while(s)
{
shuchu();
scanf("%d",&i);
switch(i)
{
case1:
{
haffmantree(huffnode,&n);
break;
}
case2:
{
haffmancode();
break;
}
case3:
s=0;
break;
}
}
}
分析:
首先输出一个主菜单,方便用户进行操作,用switch语句调用函数使用户对其进行选择要执行的操作(1.输出二叉树操作,2.进行编译码操作,3.退出程序)。
(二)运算
该模块的具体代码如下所示:
1.权值运算quanzhi()
分析:
此函数用于对一串字符进行求权值运算,利用循环将一串字符中每个字符的个数设定为权值。
voidquanzhi(intt[maxleaf],chars[maxleaf],intn)//求权值函数,将句子中的字符出现的个数当作权值
{
inti,j,h;
for(i=0;i{
for(j=0;jif(s[i]==s[j])
h++;
t[i]=h;
}
}
2.印二叉树函数huffmantree()
voidhaffmantree(hnodetypehuffnode[maxnode],int*m)
{
inti,j,n,k;
intm1,m2,x1,x2;
chars[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");
for(i=0;iprintf("第%d个结点",i+1);
scanf("%d",&huffnode[i].weight);
getchar();
}
printf("印二叉树:
\n");
for(i=0;i{
quanzhi(t,s,n);
k=huffnode[i].weight;
}
for(i=0;i{//构造哈夫曼树
m1=m2=maxvalue;
x1=x2=0;
for(j=0;j{//选取最小和次小两个权值
if(huffnode[j].parent==-1&&huffnode[j].weight{
m2=m1;
x2=x1;
m1=huffnode[j].weight;
x1=j;
}
else
if(huffnode[j].parent==-1&&huffnode[j].weight{
m2=huffnode[j].weight;
x2=j;
}
}//将找出的两棵子树合并为一颗子树
huffnode[x1].parent=n+i;
huffnode[x2].parent=n+i;
huffnode[n+i].weight=huffnode[x1].weight+huffnode[x2].weight;
huffnode[n+i].lchild=x1;
huffnode[n+i].rchild=x2;
}
for(i=0;i<2*n-1;i++)
{
printf("%4d",k);
printf("%4d",huffnode[i].lchild);
printf("%4d",huffnode[i].rchild);
printf("%4d\n",huffnode[i].parent);
}
*m=n;
}
3.编译码运算huffmancode()
voidhaffmancode()
{
hnodetypehuffnode[maxnode];
hcodetypehuffcode[maxleaf],cd;
inti,j,c,p,n=0;
haffmantree(huffnode,&n);
for(i=0;i{
cd.start=n-1;
c=i;
p=huffnode[c].parent;
while(p!
=-1)
{
if(huffnode[p].lchild==c)
cd.bit[cd.start]=0;
else
cd.bit[cd.start]=1;
cd.start--;
c=p;
p=huffnode[c].parent;
}
for(j=cd.start+1;jhuffcode[i].bit[j]=cd.bit[j];
huffcode[i].start=cd.start;
}
for(i=0;i{
printf("第%d个译码为:
",i+1);
for(j=huffcode[i].start+1;jprintf("%4d",huffcode[i].bit[j]);
printf("\n");
}
}
4.输出运算shuchu()
voidshuchu()
{
printf("********************************************************************************\n");
printf("***|**哈夫曼树的编译码**|***\n");
printf("***|**1.输出二叉树操作**|***\n");
printf("***|**2.进行编译码操作**|***\n");
printf("***|**3.退出编译码操作系统**|***\n");
printf("********************************************************************************\n");
printf("请选择要进行的操作:
");
}
四、系统测试
(一)测试主函数main()函数
该测试主要进行对主函数调用以及输出的测试,测试的结果:
(二)测试印二叉树函数
测试选择1,选择1操作首先输入叶子节点数,然后输入要编译的句子,分别输入第n+1个节点,然后系统会将输入字符的个数当作权值进行编译输出二叉树,测试结果为:
(3)测试译码运算函数
测试选择2,输入要选择的操作2,然后按要求依次输入需要的值,系统会根据输入的数据进行译码操作,最后输出译码。
输出结果为:
(4)测试退出函数
测试选择3进行退出,测试结果为:
五、总结
系统功能:
系统完成了将一段字符串进行哈夫曼加密,用户将自己的选择输入程序,然后按照程序的提示进行输入,系统将根据输入进行编码、译码操作,然后印出编译的二叉树,以及每个字符的译码。
不足:
系统没有将印哈夫曼树操作完成,系统没有将字符的权值根据大小将左孩子设为最小权值,将次小权值设为右孩子,导致加密有许多种,哈夫曼树也创建了许多种,输出的译码不唯一。
收获:
通过一学期数据结构的学习,我发现