哈夫曼(huffman)编译码器课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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");

相关文档
最新文档