哈夫曼编码译码器课程设计报告docxWord文档格式.docx
《哈夫曼编码译码器课程设计报告docxWord文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码译码器课程设计报告docxWord文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
电报通信是传递文字的二进制码形式的字符串。
但在信息传递时,总希望总长度尽可能最短,即采用最短码。
作为计算机专业的学生,我们应该很好的掌握这门技术。
在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!
课程设计就是为解决这个问题提供了一个平台。
在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。
这样不但有助于我们消化课堂所讲解的内容,还
可以增强我们的独立思考能力和动手能力;
通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。
在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮
助我们完成系统。
更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。
同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。
数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。
课程设计是一个重要的教学环节。
我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。
通过这次实验让我们明白:
作为一名大学生必须严格训练分析总结能力、书面表达能力。
需要逐步培养书写科学实验报告以及科技论文的能力。
只有这样,我们的综合素质才会有好的提高。
2需求分析
课题:
哈夫曼编码译码器
问题描述:
打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们
作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。
问题补充:
1.从硬盘的一个文件里读出一段英语文章;
2.统计这篇文章中的每个字符出现的次数;
3.以字符出现字数作为权值,构建哈夫曼树,并将哈夫曼树的存储结构的初态和终态进行输出;
4.对每个字符进行编码并将所编码写入文件然后对所编码进行破
译。
具体介绍:
在本课题中,我们在硬盘中预先建立一个文档,在里面编辑一篇文章。
然后运行程序,调用函数读出该文章,显示在界面;
再调用函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;
然后以每个字符出现次数作为权值,调用函数构建哈夫曼树;
并调用函数将哈夫曼的存储结构的初态和终态进行输出。
然后调用函数对哈夫曼树进行编码,调用函数将编码写入文件;
再调用对编码进行译码,再输出至界面。
至此,整个工作就完成了
3概要设计。
对系统进行分析,给出系统结构图;
哈弗曼树编码译码器
编码译码退出
图1系统结构图
(1).编码:
提示要编码的文件文件名→读取文件→以字母出现次数为权值建立哈弗曼树→对文本进行哈弗曼编码并输出编码→提示将编码保存的文件名→保存编码文件;
(2).译码:
提示输入要译码的文件名→利用建立好的哈弗曼树进行译码→将译码输出→提示保存译码文件的文件名→保存译码文件;
(3).退出:
退出系统,程序运行结束。
1.打开文件函数:
Open(chars[])
开始
输入要打开
的文件名
if((fp=fopen(n打开失败
ame,"
rt"
))==NU
s[i++]=fgetc(f
fclose(fp
图2打开文件函数流程图
2.保存文件函数Save(chars[])
开始
输入要保存
是
if((fp=fopen(n
wt"
存储失败
fputs(s,fp)
图3保存文件函数流程图
2.哈弗曼编码函数:
HFMCode(HFMTreeHT,CodeNodeHC[],charstr[])
将字符存入哈夫
曼编码结构体数
组的字符单元中
if(q==q->
Pare
nt->
LChild)
HC[i].code[--H
C[i].start]='
p=p->
next
I=n时结束
图4哈弗曼编码函数流程图
HC[i].code[-
-HC[i].start
]='
1'
4.译码函数:
DeCoding(charcode[],HFMTreeHT,charstr[],char
s[])
RChil
d
Root指向根节点
P!
=root
code[i]==
'
0'
LChil
p->
LChild==NULL&
&
p
->
RChild==NULL
s[k++]=str
[j]
p=root
结束
图5译码函数流程图
4详细设计
本是用最二叉即哈夫曼来哈夫曼器的功能。
假每
种字符在文中出的次数Wi,度Li,文中有n种字符,文度(W1*L1)+(W2*L2)+⋯+(Wi*Li)。
若将此到二叉上,Wi叶点,Li根点到叶点的路径度。
那么,(W1*L1)+(W2*L2)+⋯+(Wi*Li)
恰好二叉上路径度。
因此,文最短的二制前,就是以n种字符出的率作,构造一棵哈夫曼,此构造程称哈夫曼
系将以下几大功能:
从硬取字符串,建立哈夫曼,哈弗曼
以及哈夫曼等。
1.从硬盘读出字符串的函数:
voidOpen(chars[])
立哈夫曼树函数
voidCreatHFMTree(HFMTree*HT,intcount[])
{
h=str[i];
HC[i].code[n-1]='
\0'
;
tart=n-1;
for(q=p;
q->
Parent;
q=q->
Parent)
ode[--HC[i].start]='
elseHC[i].code[--HC[i].start]='
next;
行程序得到如下界面:
6主界面运行截
2.1,按回,在入字符串行,得到如下界面:
图7编码运行截图
2.输入按回车键保存哈弗曼编码:
图8保存编码运行截图
3.输入按回车键进行译码得到如下界面:
图9译码运行截图
6总结
通过一周的课程设计使我对哈夫曼树以及哈夫曼编码有了更深的认识和理
解,也使我更加明白哈夫曼编码译码在信息技术中的重要性和地位。
首先我谈谈我在设计期间我遇到的难点。
开始的时候,代码中有许多的错误,
特别是有一个“无法找到文件”的错误让我束手无策,最后还是屏蔽了定义的四
个头文件然后慢慢地改正错误才让我又看到了希望。
然后在实现文章的读入时,
由于对文件不是太熟悉,只好翻开C语言书本仿照其模式编写。
许多的错误让我
明白了一个道理---细心是非常重要的。
同时,对于编程者而言,思路清晰是相
当重要的。
在适当的时候和同学一起交流探讨是一个十分好的学习机会。
请教老
师也很重要,因为毕竟我们是新手,对于某些问题很难弄清楚。
而且,某些错误
对于我们来说有时候想半天都弄不来,但老师几下下就搞好了,这样就更加有效地节约了时间。
这次课程设计不但让我学得了一些编程知识,还学会了系统的做一份课程设计报告,学会了如何截图,学会了如何更好的画流程图,明白了做事情只有认真,才能真正做得更好!
这段时间里,可谓是酸甜苦辣都尝过。
有时,为了一个错误而焦头烂额;
有时,连吃饭都是匆匆了事;
但一旦程序运行成功,总会让我兴奋不已。
通过这次课程设计,我看清楚了自己的编程功底和动手能力还不如人意,这主要是平时实践太少的缘故。
我想,在未来的暑假中,我会努力尝试编写一些程序。
虽然我们信息管理专业的学生,但现在编程的能力太差了,毕竟多精通一门技术总是好事。
在这个程序中,还有许多地方值得完善。
比如,读出文本只能是大写的文档,空格和小写不能识别,更不用说是任意的ASCⅡ码字符了。
由于时间问题,暂时不能实现了。
我想在暑假里好好研究这个问题
7致谢
在这次设计中我要感谢与我同组的两位同学喻霞林和董茗桓,有很多不懂得地方我们可以互相讨论研究,没有他们的配合我不可能完成这次课程设计!
8附录:
#include<
>
#defineM10000
#defineN128
typedefstructnode
intweight;
structnode*LChild,*RChild,*Parent;
structnode*next;
}HFMNode,*HFMTree;
typedefstruct
charch;
charcode[N+1];
intstart;
}CodeNode;
intn;
voidclearscreen()
system("
cls"
);
}
charname[10];
FILE*fp;
inti=0;
printf("
请输入要打开的文件名:
"
gets(name);
if((fp=fopen(name,"
))==NULL)
打开失败!
\n"
exit
(1);
s[i++]=fgetc(fp);
while(s[i-1]!
=EOF)
s[i]='
fclose(fp);
voidSave(chars[])
请输入要保存的文件名: