哈夫曼编码译码器系统Word下载.docx

上传人:b****6 文档编号:16218548 上传时间:2022-11-21 格式:DOCX 页数:21 大小:72.76KB
下载 相关 举报
哈夫曼编码译码器系统Word下载.docx_第1页
第1页 / 共21页
哈夫曼编码译码器系统Word下载.docx_第2页
第2页 / 共21页
哈夫曼编码译码器系统Word下载.docx_第3页
第3页 / 共21页
哈夫曼编码译码器系统Word下载.docx_第4页
第4页 / 共21页
哈夫曼编码译码器系统Word下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

哈夫曼编码译码器系统Word下载.docx

《哈夫曼编码译码器系统Word下载.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码译码器系统Word下载.docx(21页珍藏版)》请在冰豆网上搜索。

哈夫曼编码译码器系统Word下载.docx

【测试数据】

利用教科书中的数据调试程序。

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

“THISPROGRAMISMYFAVORITE”。

字符

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

20

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

63

48

51

80

23

8

18

16

(二)系统模块结构设计

通过对系统功能的分析,哈夫曼编码/译码器系统功能如图1所示。

图1哈夫曼编码/译码器系统功能图

通过上图的功能分析,把整个系统划分为5个模块:

1、初始化(Initialization),该模块主要实现:

初始化要编辑的语句,然后语句里面有个调用输入编码的语句len=InputCode();

2、编码(Encoding),该模块主要实现:

voidEncoding();

3、译码(Incoding),该模块主要实现:

voidDecoding();

4、印代码文件(Print),该模块主要实现:

由函数voidCode_printing()和函数voidCode_printing1()实现。

5、印哈夫曼树(TreePrinting),该模块主要实现:

coprint(p,HT);

三、系统的设计与实现

(一)初始化(Initialization),该模块主要实现

voidInitialization()

{inta,k,flag,len;

a=0;

len=InputCode();

for(i=0;

i<

len;

i++)

{k=0;

flag=1;

cou[i-a].data=str[i];

cou[i-a].count=1;

while(i>

k)

{

if(str[i]==str[k])

a++;

flag=0;

}

k++;

if(flag==0)

break;

}

if(flag)

for(j=i+1;

j<

j++)

{if(str[i]==str[j])

++cou[i-a].count;

}

n=len-a;

n;

i++)

printf("

%d%d"

i,cou[i].data);

%d%d\n"

i,cou[i].count);

=n;

*(z+i)=cou[i].data;

*(w+i)=cou[i].count;

(二)编码(Encoding),该模块主要实现

voidEncoding()

{

char*tran;

i=99;

tran=(char*)malloc(100*sizeof(char));

while(i==99)

if(fgets(tran,100,tobetran)==NULL)

printf("

不能打开文件\n"

);

break;

*(tran+i)!

='

\0'

;

for(j=0;

if(*(z+j-1)==*(tran+i))

fputs(HC[j],codefile);

if(j>

n)

字符错误,无法编码!

\n"

(三)译码(Decoding),该模块主要实现

voidDecoding()

{char*work,*work2,i2;

inti4=0,i,i3;

unsignedlonglength=10000;

work=(char*)malloc(length*sizeof(char));

fgets(work,length,codef);

work2=(char*)malloc(length*sizeof(char));

i3=2*n-1;

for(i=0;

*(work+i-1)!

i2=*(work+i);

if(HT[i3].lchild==0)

{*(work2+i4)=*(z+i3-1);

i4++;

i--;

elseif(i2=='

0'

i3=HT[i3].lchild;

elseif(i2=='

1'

i3=HT[i3].rchild;

(四)印代码文件(Print),该模块主要实现

voidCode_printing1()

{char*work5;

work5=(char*)malloc(51*sizeof(char));

do

if(fgets(work5,51,txtfile)==NULL)

不能读取文件\n"

fputs(work5,CodePrin1);

puts(work5);

}while(strlen(work5)==50);

free(work5);

(五)印哈夫曼树(TreePrinting),该模块主要实现

voidTree_printing(HuffmanTreeHT,intw)

HuffmanTreep;

p=HT+w;

printf("

下面打印哈夫曼树\n"

打印工作结束\n"

四、系统测试

(一)测试main函数

(二)测试编码(Encoding)及译码(Decoding)函数

.

(二)测试印代码文件(Print)函数

(四)相关的根目录

五、总结

系统完成的功能:

本程序完成的功能是可以在信息发送端通过一个编码系统对待传数据预先编码,在信息接收端将传来的数据进行译码(复原)。

系统的不足:

本次课程设计,我认为还有很多不足,比如说不能把一个随机输入的字符串中不同字符作为叶子结点元素,把其在该字符串中出现的次数作为权值构造一个赫夫曼树,并得到各个叶子结点的赫夫曼编码和整个输入的字符串的赫夫曼编码,还有不能够顺利按题目要求写出相应的文件,将编码存储在tex文件中。

我的收获是:

通过本次实验,提高了自已调试程序的能力,充分体会到了在程序执行时的提示性输出的重要性,编写程序的时候,应先写出算法,再写程序,一段一段调试;

此外,学编程一定要亲自动手,实践是检验真理正确性的唯一标准,不能眼高手低,还要学会归纳,发现编程的捷径,想着用更高效的方法去完成一个个任务。

六、附件(代码、部分图表)

#include<

stdio.h>

#include<

string.h>

malloc.h>

stdlib.h>

constintUINT_MAX=1000;

charstr[50];

typedefstruct

intweight,K;

intparent,lchild,rchild;

}HTNode,*HuffmanTree;

typedefchar**HuffmanCode;

HuffmanTreeHT;

HuffmanCodeHC;

intw[50],i,j,n;

charz[50];

intflag=0;

intnumb=0;

structcou{

chardata;

intcount;

}cou[50];

intmin(HuffmanTreet,inti)

{

intj,flag;

intk=UINT_MAX;

for(j=1;

=i;

if(t[j].weight<

k&

&

t[j].parent==0)

k=t[j].weight,flag=j;

t[flag].parent=1;

returnflag;

voidselect(HuffmanTreet,inti,int&

s1,int&

s2)

intj;

s1=min(t,i);

s2=min(t,i);

if(s1>

j=s1;

s1=s2;

s2=j;

voidHuffmanCoding(HuffmanTree&

HT,HuffmanCode&

HC,int*w,intn)

intm,i,s1,s2,start;

intc,f;

char*cd;

if(n<

=1)

return;

m=2*n-1;

HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));

for(p=HT+1,i=1;

++i,++p,++w)

p->

weight=*w;

parent=0;

lchild=0;

rchild=0;

for(;

=m;

++i,++p)

for(i=n+1;

++i)

{

select(HT,i-1,s1,s2);

HT[s1].parent=HT[s2].parent=i;

HT[i].lchild=s1;

HT[i].rchild=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight;

HC=(HuffmanCode)malloc((n+1)*sizeof(char*));

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

cd[n-1]='

for(i=1;

start=n-1;

for(c=i,f=HT[i].parent;

f!

=0;

c=f,f=HT[f].parent)

if(HT[f].lchild==c)

cd[--start]='

else

HC[i]=(char*)malloc((n-start)*sizeof(char));

strcpy(HC[i],&

cd[start]);

free(cd);

intInputCode()

FILE*tobetran;

if((tobetran=fopen("

tobetran.txt"

"

w"

))==NULL)

return0;

请输入你想要编码的字符\n"

gets(str);

fputs(str,tobetran);

获取报文成功\n"

fclose(tobetran);

returnstrlen(str);

}

{*(z+i)=cou[i].data;

HuffmanCoding(HT,HC,w,n);

字符对应的编码为:

puts(HC[i]);

下面将哈夫曼编码写入文件\n...................\n\n"

FILE*htmTree;

charr[]={'

'

'

};

if((htmTree=fopen("

htmTree.txt"

cannotopenfile\n"

fputs(z,htmTree);

n+1;

fprintf(htmTree,"

%6d"

*(w+i));

fputs(r,htmTree);

fputs(HC[i],htmTree);

fclose(htmTree);

已将字符与对应编码写入根目录下文件htmTree.txt中\n\n"

下面对目录下文件tobetran.txt中的字符进行编码\n"

FILE*tobetran,*codefile;

rb"

if((codefile=fopen("

codefile.txt"

wb"

编码工作完成\n\n编码写入目录下的codefile.txt中\n\n"

fclose(codefile);

free(tran);

下面对根目录下文件codefile.txt中的字符进行译码\n"

FILE*codef,*txtfile;

if((txtfile=fopen("

txtfile.txt"

if((codef=fopen("

r"

char*work,*work2,i2;

inti4=0,i,i3;

unsignedlonglength=10000;

work=(char*)malloc(length*sizeof(char));

fgets(work,length,codef);

work2=(char*)malloc(length*sizeof(char));

i3=2*n-1;

i2=*(work+i);

if(HT[i3].lchild==0)

*(work2+i4)=*(z+i3-1);

i4++;

i--;

)i3=HT[i3].lchild;

)i3=HT[i3].rchild;

*(work2+i4)='

fputs(work2,txtfile);

译码完成\n内容写入根目录下的文件txtfile.txt中\n\n"

free(work);

free(work2);

fclose(txtfile);

fclose(codef);

voidCode_printing()

下面打印根目录下文件CodePrin.txt中编码字符\n"

FILE*CodePrin,*codefile;

if((CodePrin=fopen("

CodePrin.txt"

char*work3;

work3=(char*)malloc(51*sizeof(char));

if(fgets(work3,51,c

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

当前位置:首页 > PPT模板 > 动态背景

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

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