编译码器课程设计精品.docx

上传人:b****6 文档编号:3239075 上传时间:2022-11-20 格式:DOCX 页数:18 大小:172.75KB
下载 相关 举报
编译码器课程设计精品.docx_第1页
第1页 / 共18页
编译码器课程设计精品.docx_第2页
第2页 / 共18页
编译码器课程设计精品.docx_第3页
第3页 / 共18页
编译码器课程设计精品.docx_第4页
第4页 / 共18页
编译码器课程设计精品.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

编译码器课程设计精品.docx

《编译码器课程设计精品.docx》由会员分享,可在线阅读,更多相关《编译码器课程设计精品.docx(18页珍藏版)》请在冰豆网上搜索。

编译码器课程设计精品.docx

编译码器课程设计精品

 

工学系课程设计报告

设计题目:

哈夫曼(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;j

if(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;i

printf("第%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;j

huffcode[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;j

printf("%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进行退出,测试结果为:

五、总结

系统功能:

系统完成了将一段字符串进行哈夫曼加密,用户将自己的选择输入程序,然后按照程序的提示进行输入,系统将根据输入进行编码、译码操作,然后印出编译的二叉树,以及每个字符的译码。

不足:

系统没有将印哈夫曼树操作完成,系统没有将字符的权值根据大小将左孩子设为最小权值,将次小权值设为右孩子,导致加密有许多种,哈夫曼树也创建了许多种,输出的译码不唯一。

收获:

通过一学期数据结构的学习,我发现

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1