赫夫曼编码课程设计.docx

上传人:b****5 文档编号:3187452 上传时间:2022-11-19 格式:DOCX 页数:26 大小:432.80KB
下载 相关 举报
赫夫曼编码课程设计.docx_第1页
第1页 / 共26页
赫夫曼编码课程设计.docx_第2页
第2页 / 共26页
赫夫曼编码课程设计.docx_第3页
第3页 / 共26页
赫夫曼编码课程设计.docx_第4页
第4页 / 共26页
赫夫曼编码课程设计.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

赫夫曼编码课程设计.docx

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

赫夫曼编码课程设计.docx

赫夫曼编码课程设计

 

《数据结构与算法》课程设计

(2012/2013学年第二学期19周)

 

指导教师:

杨东鹤王敏丽

 

《数据结构与算法》课程设计

目录

一、题目1

二、实验目的1

三、需求分析1

四、概要设计2

五、详细设计3

六、调试分析12

1、输入八个字符和频率12

2、开始界面13

3、对文件ToBeTran.txt编码:

16

4、对文件Code.txt译码:

17

5、打印代码17

6、打印赫夫曼树18

7、退出20

七、实验心得与体会20

一、题目

利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完成的编\译码系统。

试为这样的信息收发站写一个哈夫曼的编\译码系统。

一个完整的系统应具有以下功能:

(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中。

二、实验目的

(1)已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。

(2)用下表给出的字符集和频度的实际统计数据建立赫夫曼树,并实现以下报文的编码和译码:

“THISPROGRAMEISMYFAVORITE”。

字符

A

B

C

D

E

F

G

H

I

J

K

L

M

频度

186

64

13

22

32

103

21

15

47

57

1

5

32

20

字符

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

频度

57

63

15

1

48

51

80

23

8

18

1

16

1

实现提示

(1)编码结果以文本方式存储在文件Codefile中。

(2)用户界面可以设计为“菜单”方式:

显示上述功能符号,再加上“Q”,表示退出运行Quit。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。

(3)在程序的一次执行过程中,第一次执行I,D或C命令之后,赫夫曼树已经在内存了,不必再读入。

每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

三、需求分析

(1)在通信过程中,为了提高信道利用率,缩短信息传输时间降,低传输成本,需要一个编译码器。

(2)此哈夫曼编/译码器应具有编和译的双向功能,即在发送端通过编码系统对传入的数据进行编码,

在接受端将数据译码.将具有这两项功能的编译码器用于双工信道,就可满足双工信道的双向编译功能.

(3)输入某段报文时,系统将自动完成编译输出.

四、概要设计

本程序主要定义了6个函数:

voidInitialization();//初始化

voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn);//初始化时的编码函数

voidSelect(HuffmanTreeHT,intt,int&s1,int&s2);//选择函数,选择最小的2个权值

voidEncoding();//编码函数

voidDecoding();//译码函数

voidPrint();//编码的打印

voidTree_printing(HuffmanTreeHT,intw);//哈夫曼树的打印

1)分析哈夫曼树的定义

1.哈夫曼树节点的数据类型定义为:

typedefstruct

{

unsignedintweight;//结点权值

unsignedintparent,lchild,rchild;//结点的父指针,左右孩子指针

}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树

typedefchar**HuffmanCode;//动态分配数组存储哈夫曼编码表

2)所实现的功能函数如下

1、intmain()

主函数:

利用已建好的哈夫曼树(如不在内存,则从文件hfmTree.txt中读入)

对文件中的正文进行编码,然后将结果存入文件Codefile.txt中。

如果正文中没有要编码的字符,则键盘读入并存储到ToBeTran文件中。

读入ToBeTran中将要编码的内容,将编码好的哈夫曼编码存储到CodeFile中。

2、voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn)

初始化哈夫曼树,处理InputHuffman(HuffmanHfm)函数得到的数据,按照哈夫曼规则建立2叉树。

此函数块调用了Select()函数。

3、voidSelect(HuffmanTreeHT,intt,int&s1,int&s2);

Select函数,选出HT树到a为止,权值最小且parent为0的2个节点

4、Encoding

编码功能:

对输入字符进行编码

5、Decoding

译码功能:

利用已建好的哈夫曼树将文件Codefile.txt中的代码进行译码,结果存入文件textfile.dat中。

6、Print()

打印功能函数:

输出哈夫曼树,字符,权值,以及它对应的编码。

7、voidTree_printing(HuffmanTreeHT,intw)

打印赫夫曼树

 

系统结构图(功能模块图)

五、详细设计

#include

#include

#include

#include

#include

#include

usingnamespacestd;

typedefstruct

{doubleweight;//结点权值

unsignedintparent,lchild,rchild;//结点的父指针,左右孩子指针

}HTNode,*HuffmanTree;//动态分配数组存储哈夫曼树

typedefchar**HuffmanCode;//动态分配数组存储哈夫曼编码表

voidInitialization();//初始化

voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn);//初始化时的编码函数

voidSelect(HuffmanTreeHT,intt,int&s1,int&s2);//选择函数,选择最小的2个权值

voidEncoding();//编码

voidDecoding();//译码

voidPrint();//编码的打印

voidTree_printing(HuffmanTreeHT,intw);//哈夫曼树的打印

//全局变量

HuffmanTreeHT;//哈夫曼树HT

HuffmanCodeHC;//哈夫曼编码表HC

int*w;

inti,j,n;

char*z;

intflag=0;

intnumb=0;

voidInitialization()

{

flag=1;

intnum;

doublenum2;

cout<<"初始化"<

cout<<"请输入字符的个数n"<

cin>>num;

n=num;

w=(int*)malloc(n*sizeof(int));

z=(char*)malloc(n*sizeof(char));

cout<<"请依次输入字符:

"<

charbase[2];

getchar();

for(i=0;i

{

cout<<"第"<

"<

gets(base);//由于要接受空格,cin函数不能区分空格和回车,所以改用gets

*(z+i)=*base;

}

cout<

cout<<"输入的字符为:

";

for(i=0;i<=n-1;i++)

{

cout<<*(z+i);

}

cout<

cout<<"请输入"<

"<

for(i=0;i<=n-1;i++)

{

cout<<"第"<

"<

cin>>num2;

*(w+i)=num2;

}

cout<

HuffmanCoding(HT,HC,w,n);

//存入文件hfmTree中

cout<<"inputfile"<

ofstreamoutfile("htmTree.txt",ios:

:

out);

if(!

outfile)

{

cerr<<"openerror!

"<

exit

(1);

}

for(i=0;i

outfile<<*(z+i)<<"";

outfile<

for(i=0;i

outfile<<*(w+i)<<"";

outfile<

for(i=1;i<=n;i++)

outfile<

outfile<

outfile.close();

cout<<"字符与对应编码已写入文件htmTree.txt中"<

cout<

}

//--------------算法6.12--------------------------

voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn)

{

//w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC

intm,i,s1,s2,start;

intc,f;

HuffmanTreep;

char*cd;

if(n<=1)

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

当前位置:首页 > 农林牧渔 > 水产渔业

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

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