计算机软件及应用哈夫曼树编码课程设计实验报告.docx
- 文档编号:10867824
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:35
- 大小:161.97KB
计算机软件及应用哈夫曼树编码课程设计实验报告.docx
《计算机软件及应用哈夫曼树编码课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《计算机软件及应用哈夫曼树编码课程设计实验报告.docx(35页珍藏版)》请在冰豆网上搜索。
计算机软件及应用哈夫曼树编码课程设计实验报告
武汉工程大学
计算机科学与工程学院
综合设计报告
设计名称:
应用软件综合设计
设计题目:
哈夫曼编码/译码器
学生学号:
1005080228
专业班级:
计算机工程02班
学生姓名:
张建雄
学生成绩:
指导教师(职称):
刘黎志(副教授)
课题工作时间:
2012-9-17至2012-9-28
说明:
1、报告中的第一、二、三项由指导教师在综合设计开始前填写并发给每个学生;四、五两项(中英文摘要)由学生在完成综合设计后填写。
2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。
3、指导教师评语一栏由指导教师就学生在整个设计期间的平时表现、设计完成情况、报告的质量及答辩情况,给出客观、全面的评价。
4、所有学生必须参加综合设计的答辩环节,凡不参加答辩者,其成绩一律按不及格处理。
答辩小组成员应由2人及以上教师组成。
5、报告正文字数一般应不少于5000字,也可由指导教师根据本门综合设计的情况另行规定。
6、平时表现成绩低于6分的学生,其综合设计成绩按不及格处理。
7、此表格式为武汉工程大学计算机科学与工程学院提供的基本格式(适用于学院各类综合设计),各教研室可根据本门综合设计的特点及内容做适当的调整,并上报学院批准。
成绩评定表
学生姓名:
张建雄学号:
1005080228班级:
计算机工程02班
类别
合计
分值
各项分值
评分标准
实际得分
合计得分
备注
平时表现
10
10
按时参加综合设计,无旷课、迟到、早退、违反实验室纪律等情况。
完成情况
30
20
按设计任务书的要求完成了全部任务,能完整演示其设计内容,符合要求。
10
能对其设计内容进行详细、完整的介绍,并能就指导教师提出的问题进行正确的回答。
报告质量
35
10
报告文字通顺,内容翔实,论述充分、完整,立论正确,结构严谨合理;报告字数符合相关要求,工整规范,整齐划一。
5
课题背景介绍清楚,综述分析充分。
5
设计方案合理、可行,论证严谨,逻辑性强,具有说服力。
5
符号统一;图表完备、符合规范要求。
5
能对整个设计过程进行全面的总结,得出有价值的结论或结果。
5
参考文献数量在3篇以上,格式符合要求,在正文中正确引用。
答辩情况
25
10
在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。
15
在规定时间内能准确、完整、流利地回答教师所提出的问题。
总评成绩:
分
补充说明:
指导教师:
(签字)
日期:
年月日
答辩记录表
学生姓名:
张建雄学号:
1005080228班级:
计算机工程02班
答辩地点:
答辩内容记录:
答辩成绩
合计
分值
各项分值
评分标准
实际得分
合计得分
备注
25
10
在规定时间内能就所设计的内容进行阐述,言简意明,重点突出,论点正确,条理清晰。
15
在规定时间内能准确、完整、流利地回答教师所提出的问题。
答辩小组成员(签字):
年月日
指导教师评语
指导教师:
(签字)
日期:
年月日
一、综合设计目的、条件、任务和内容要求:
利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。
对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。
试为这样的信息收发站写一个哈夫曼码的编译码系统。
一个完整的哈夫曼码的编译码系统系统应具有以下功能:
I:
初始化(Initialization)。
从终端读入字符集大小n,几个字符和n个权值,建立哈夫曼树,并将它存于文件hfmtree中。
C:
编码(Coding)。
利用已建好的哈夫曼树(如不在内存,则从文件hfmtree中读入),对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中。
D:
译码(Decoding)。
利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入文件textfile中。
P:
打印代码文件(Print)。
将文件codefile以紧凑格式显示在终端上,每行50个代码。
同时将此字符形式的编码文件写入文件codeprint中。
T:
打印哈夫曼树(Treeprinting)。
将已在内存中的哈夫曼树以直观的方式(数或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。
[测试数据]
用下表中给出的字符集和频度的实际统计数据建立哈夫曼数,并实现以下报文的编码和译码:
“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
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
通过本设计可以巩固已经学过的基础课及专业课知识,开阔学生的视野,锻炼学生的自学能力及独立动手能力。
指导教师签字:
刘黎志
2012年9月17日
二、进度安排:
2012-9-17:
明确所选课题的具体要求,按要求阅读相关的参考文献及资料
2012-9-18至2012-9-27:
课题代码实现、课程设计报告书写
2012-9-28:
课程设计答辩
3、应收集资料及主要参考文献:
[1]李纯莲,刘玉宝,刘金凤等.C#.NET实用教程[M].北京:
电子工业出版社,2011年.100-150.
[2]田鲁怀.数据结构[M].北京:
电子工业出版社,2010年.178-210.
[3]李春葆,尹为民,李蓉蓉等.数据结构教程[M].北京:
清华大学出版社.2010年.210-250.
四、综合设计(课程设计)摘要:
在这次课程设计中,所进行的实验是:
哈夫曼编码和编译器。
对哈夫曼树进行建立,由节点的权值建立最小二叉树,哈夫曼树haftree,并由所建立的哈夫曼树进行编码,求出各个节点的编码。
在由所求的哈夫曼树,输入一段二进制电文,能够输出那所建立的哈夫曼树中的节点。
建立的haftree用图形化表示出来。
在整个代码实现中,窗体的实现,功能的完善,哈夫曼树的建立,哈夫曼树的编码,遇到了许多难题,haftree对象数组的分配空间,节点的属性等都比较困难。
在整个过程中,用的是C#语言,包的应用,字符串数组的空间分配,在计算每个字符的权值时,用的是sizeOf()检索整个字符串,计算字符的权值,建立字符出现频度的表格,根据表格中每个字符频度建立起哈夫曼树。
从根节点出发检索每个节点的左右孩子,如果是左孩子遍历左边,路径为0,然后左孩子为根节点;如果是右孩子,遍历右孩子,路径为1,然后右孩子为根节点。
在重新上述方法,直到所有的节点都遍历完,每个节点的编码就确定后输出来。
在译码过程中,由所输入的二进制电文,根据所建立的哈夫曼树,如果是0走左边,如果是1,走右边,直到节点的左右孩子为空时,输出给节点的信息,在回到根节点重新遍历后面的二进制电文,直到所有电文都遍历完为止,输出所有从电文中译码出来的信息。
关键词:
编译器;频度;译码
五、综合设计(课程设计)Abstract:
Inthisdesign,theexperimentwas:
Huffmancodingandcompiler.TheHuffmantreetoestablish,bythenodeweightstoestablishaminimumoftwoforktree,Huffmantreehaftree,andbytheHuffmantreecoding,andeverynodecoding.BytheHuffmantree,enterabinarymessage,canoutputthesetupbytheHuffmantreenodes.Establishmentofhaftreegraphicalrepresentation.Intheimplementationofthecode,therealizationform,functionperfect,Huffmantreeisestablished,Huffmancodingtree,encounteredalotofproblems,anarrayofhaftreeobjectsallocatedspace,nodeattributesaredifficult.Throughouttheprocess,usingtheC#language,theapplicationpackage,anarrayofstringsinthespatialdistribution,calculatedforeachweightofcharacters,usingsizeOftoretrievetheentirestring,calculatingtheweightofcharacters,establishcharacterappearancefrequencyofform,formthebasisofeachcharacterfrequencyestablishedHuffmantree.Startingfromtherootnodetoretrieveeachnodearoundchildren,ifchildrenlefttraverseleft,path0,thenleftthechildastherootnode;ifitisrightchild,traversingtherightpathforchildren,1childrenfortherootnode,thentheright.Inthenewmethoddescribedabove,untilallofthenodetraversalfinished,eachnodeisdeterminedaftertheoutputcoding.
Inthedecodingprocess,bytheinputbinarymessage,accordingtotheestablishedHuffmantree,ifitis0theleft,ifitis1,goright,untiltheleftandrightchildnodeisempty,theoutputtothenodeinformation,inthebackoftherootnodetotraversebehindabinarymessage,untilallmessagetraversalfinishedsofar,theoutputfromallthemessagedecodingofinformation.
Keywords:
compiler;frequency;decoding
摘要
在这次课程设计中,所进行的实验是:
哈夫曼编码和编译器。
对哈夫曼树进行建立,由节点的权值建立最小二叉树,哈夫曼树haftree,并由所建立的哈夫曼树进行编码,求出各个节点的编码。
在由所求的哈夫曼树,输入一段二进制电文,能够输出那所建立的哈夫曼树中的节点。
建立的haftree用图形化表示出来。
在整个代码实现中,窗体的实现,功能的完善,哈夫曼树的建立,哈夫曼树的编码,遇到了许多难题,haftree对象数组的分配空间,节点的属性等都比较困难。
在整个过程中,用的是C#语言,包的应用,字符串数组的空间分配,在计算每个字符的权值时,用的是sizeOf()检索整个字符串,计算字符的权值,建立字符出现频度的表格,根据表格中每个字符频度建立起哈夫曼树。
从根节点出发检索每个节点的左右孩子,如果是左孩子遍历左边,路径为0,然后左孩子为根节点;如果是右孩子,遍历右孩子,路径为1,然后右孩子为根节点。
在重新上述方法,直到所有的节点都遍历完,每个节点的编码就确定后输出来。
在译码过程中,由所输入的二进制电文,根据所建立的哈夫曼树,如果是0走左边,如果是1,走右边,直到节点的左右孩子为空时,输出给节点的信息,在回到根节点重新遍历后面的二进制电文,直到所有电文都遍历完为止,输出所有从电文中译码出来的信息。
关键词:
编译器;频度;译码
Abstract
Inthisdesign,theexperimentwas:
Huffmancodingandcompiler.TheHuffmantreetoestablish,bythenodeweightstoestablishaminimumoftwoforktree,Huffmantreehaftree,andbytheHuffmantreecoding,andeverynodecoding.BytheHuffmantree,enterabinarymessage,canoutputthesetupbytheHuffmantreenodes.Establishmentofhaftreegraphicalrepresentation.Intheimplementationofthecode,therealizationform,functionperfect,Huffmantreeisestablished,Huffmancodingtree,encounteredalotofproblems,anarrayofhaftreeobjectsallocatedspace,nodeattributesaredifficult.Throughouttheprocess,usingtheC#language,theapplicationpackage,anarrayofstringsinthespatialdistribution,calculatedforeachweightofcharacters,usingsizeOftoretrievetheentirestring,calculatingtheweightofcharacters,establishcharacterappearancefrequencyofform,formthebasisofeachcharacterfrequencyestablishedHuffmantree.Startingfromtherootnodetoretrieveeachnodearoundchildren,ifchildrenlefttraverseleft,path0,thenleftthechildastherootnode;ifitisrightchild,traversingtherightpathforchildren,thentheright.Innewmethoddescribedabove,untilallofthenodetraversalfinished,eachnodeisdeterminedaftercoding。
Inthedecodingprocess,bytheinputbinarymessage,accordingtotheestablishedHuffmantree,ifitis0theleft,ifitis1,goright,untiltheleftandrightchildnodeisempty,theoutputtothenodeinformation,inthebackoftherootnodetotraversebehindabinarymessage,untilallmessagetraversalfinishedsofar,theoutputfromall.
Keywords:
compiler;frequency;decoding
第一章课题背景
1.1设计背景目的及意义
1.1.1设计背景
在当今信息时代,信息技术已经成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
但是这些海量的数据是怎么保存在计算机里面的呢?
在客户需要数据时它又是怎么发送给用户的呢?
这就涉及到哈弗曼编码的技术了。
哈弗曼编码在这种背景下,适应时代的要求诞生了。
作为无损压缩算法,哈弗曼编码用途非常广泛,在各个领域都有应用。
1.1.2设计目的
这次可课程设计主要是回顾我们上学期所学习的数据结构这门课程,重新温习一下这些经典算法,加深对它们的影响,以至于今后更好的应用这些经典算法,还有就是培养我们的程序设计算法,平时都是在教室里上课,很少有像这样集体性的编程,通过这次课程设计,不仅能加强我们的编程能力,更能加强我们的程序设计能力。
1.1.3设计意义
这次课程设计很有意义。
哈夫曼编码是个很有用、很有效的编码方式,是一个伟大的发明。
通过这次课程设计,让我们亲身体会到了课本上知识的作用和重要性,从而达到了学以致用的目的,让我们对今后的学习有了更清楚的方向和更加强烈的兴趣。
1.2理论依据和工作原理
1.2.1理论依据
哈夫曼编码(HuffmanCoding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。
Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
1.2.2工作原理
哈夫曼编码依据字符出现的频率来构造一棵二叉树,然后根据这棵树对字符进行编码,这种编码机制使用最短编码来表示字符串,大大节省了字符传递时的长度,在网络通信中,特别是网络流量方面作用特别明显,它大大节省了网络资源,提高了网络运行速度,方便了人们的生活。
第二章设计简介及设计方案论述
2.1设计简介
这次课程设计是哈夫曼编码,要求实现可视化编程。
哈夫曼树是一种很有用的数据结构,在数据传输方面更显方便,它能用较少的编码代替复杂的字符。
我们这次课程设计就是要实现对一段报文进行哈弗曼编码,然后随便输入一段编码,根据前面的编码进行解码。
2.2设计方案的论述
看到这个课程设计,第一感觉就是不怎么难。
因为哈弗满编码主要代码课本上都有,我们只需要将代码添加到窗体类中就可以。
首先,我设计了3个类,分别是HafumanNode类,HafumanT类和Form1主窗体类。
HafumanNode类是哈弗曼节点类,这个类中有publicchardata;publicintpinDu;publicdoubleweight;publicintparent;publicintlchild;publicintrchild;这六个字段和构造函数publicHafumanNode(charc,doublew)。
还有就是HafumanT类,这个类中主要实现哈夫曼树的构造和编码以及解码。
Form1类是主窗体类,在这里就不详细介绍了,在后面详细设计里面会有详细分析。
第三章详细设计
3.1总体分析
这次课程设计,我设计了3个类,分别是哈夫曼节点类(HafumanNode)、哈夫曼树(HafumanT)、主窗体类(Form1)。
这些类各有各的功能和作用,分别实现不同的功能,这样设计使代码更显调理性,而不至于把所有的功能都写在一个类里面,钠那样显得没有调理,很乱,可读性和可维护性不强。
3.2详细分析
3.2.1HafumanNode类
这个类的主要代码如下:
classHafumanNode
{
publicchardata;
publicintpinDu;
publicdoubleweight;
publicintparent;
publicintlchild;
publicintrchild;
publicHafumanNode(charc,doublew)
{
data=c;
weight=w;
pinDu=0;
parent=-1;
lchild=-1;
rchild=-1;
}
}
这个类比较简单,代码非常少,这个类相当于课本上C语言中的结构体,只是在C#中我用类来实现。
3.3.2HafumanT类
这个类有点复杂,因为它要实现很多功能。
这里就不详细列出它的所有代码了,而是把主要代码展示如下:
publicvoidCreateHafumanTree()
{
intlchild,rchild;
doublemin1,min2;
intnumber=listNode.Count;
for(inti=number;i { lchild=-1; rchild=-1; min1=3000; min2=3000; for(intj=0;j if(listNode[j].parent==-1) if(listNode[j].weight { min2=min1; rchild=lchild; min1=listNode[j].weight; lchild=j; } elseif(listNode[j].weight { min2=listNode[j].weight; rchild=j; } doublew=listNode[lchild].weight+listNode[rchild].weight; HafumanNodenewNode=newHafumanNode('#',w); newNode.lchild=lchild; newNo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 应用 哈夫曼树 编码 课程设计 实验 报告