计算机软件及应用哈夫曼树编码课程设计实验报告.docx

上传人:b****8 文档编号:10867824 上传时间:2023-02-23 格式:DOCX 页数:35 大小:161.97KB
下载 相关 举报
计算机软件及应用哈夫曼树编码课程设计实验报告.docx_第1页
第1页 / 共35页
计算机软件及应用哈夫曼树编码课程设计实验报告.docx_第2页
第2页 / 共35页
计算机软件及应用哈夫曼树编码课程设计实验报告.docx_第3页
第3页 / 共35页
计算机软件及应用哈夫曼树编码课程设计实验报告.docx_第4页
第4页 / 共35页
计算机软件及应用哈夫曼树编码课程设计实验报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

计算机软件及应用哈夫曼树编码课程设计实验报告.docx

《计算机软件及应用哈夫曼树编码课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《计算机软件及应用哈夫曼树编码课程设计实验报告.docx(35页珍藏版)》请在冰豆网上搜索。

计算机软件及应用哈夫曼树编码课程设计实验报告.docx

计算机软件及应用哈夫曼树编码课程设计实验报告

武汉工程大学

计算机科学与工程学院

综合设计报告

设计名称:

应用软件综合设计

设计题目:

哈夫曼编码/译码器

学生学号:

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

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

当前位置:首页 > 法律文书 > 调解书

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

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