武汉工程大学计算机科学与工程学院 综合设计报告
第一章 课题背景
1.1 设计背景目的及意义
1.1.1设计背景
在当今信息时代,信息技术已经成为当代知识经济的核心技术。我们时刻都在和数据打交道。但是这些海量的数据是怎么保存在计算机里面的呢?在客户需要数据时它又是怎么发送给用户的呢?这就涉及到哈弗曼编码的技术了。哈弗曼编码在这种背景下,适应时代的要求诞生了。作为无损压缩算法,哈弗曼编码用途非常广泛,在各个领域都有应用。
1.1.2设计目的
这次可课程设计主要是回顾我们上学期所学习的数据结构这门课程,重新温习一下这些经典算法,加深对它们的影响,以至于今后更好的应用这些经典算法,还有就是培养我们的程序设计算法,平时都是在教室里上课,很少有像这样集体性的编程,通过这次课程设计,不仅能加强我们的编程能力,更能加强我们的程序设计能力。
1.1.3设计意义
这次课程设计很有意义。哈夫曼编码是个很有用、很有效的编码方式,是一个伟大的发明。通过这次课程设计,让我们亲身体会到了课本上知识的作用和重要性,从而达到了学以致用的目的,让我们对今后的学习有了更清楚的方向和更加强烈的兴趣。
- - 4
武汉工程大学计算机科学与工程学院 综合设计报告
1.2理论依据和工作原理
1.2.1 理论依据
哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
1.2.2工作原理
哈夫曼编码依据字符出现的频率来构造一棵二叉树,然后根据这棵树对字符进行编码,这种编码机制使用最短编码来表示字符串,大大节省了字符传递时的长度,在网络通信中,特别是网络流量方面作用特别明显,它大大节省了网络资源,提高了网络运行速度,方便了人们的生活。
- - 5
武汉工程大学计算机科学与工程学院 综合设计报告
第二章 设计简介及设计方案论述
2.1设计简介
这次课程设计是哈夫曼编码,要求实现可视化编程。哈夫曼树是一种很有用的数据结构,在数据传输方面更显方便,它能用较少的编码代替复杂的字符。我们这次课程设计就是要实现对一段报文进行哈弗曼编码,然后随便输入一段编码,根据前面的编码进行解码。
2.2设计方案的论述
看到这个课程设计,第一感觉就是不怎么难。因为哈弗满编码主要代码课本上都有,我们只需要将代码添加到窗体类中就可以。首先,我设计了3个类,分别是HafumanNode类,HafumanT类和Form1主窗体类。HafumanNode类是哈弗曼节点类,这个类中有public char data; public int pinDu; public double weight; public int parent;public int lchild; public int rchild;这六个字段和构造函数public HafumanNode(char c,double w)。还有就是HafumanT类,这个类中主要实现哈夫曼树的构造和编码以及解码。Form1类是主窗体类,在这里就不详细介绍了,在后面详细设计里面会有详细分析。
- - 6
武汉工程大学计算机科学与工程学院 综合设计报告
第三章 详细设计
3.1 总体分析
这次课程设计,我设计了3个类,分别是哈夫曼节点类(HafumanNode)、哈夫曼树(HafumanT)、主窗体类(Form1)。这些类各有各的功能和作用,分别实现不同的功能,这样设计使代码更显调理性,而不至于把所有的功能都写在一个类里面,钠那样显得没有调理,很乱,可读性和可维护性不强。
3.2详细分析
3.2.1 HafumanNode类
这个类的主要代码如下:
class HafumanNode {
public char data; public int pinDu; public double weight; public int parent; public int lchild; public int rchild;
public HafumanNode(char c,double w) {
data = c; weight = w; pinDu = 0; parent = -1; lchild = -1; rchild = -1; }
- - 7
武汉工程大学计算机科学与工程学院 综合设计报告
}
这个类比较简单,代码非常少,这个类相当于课本上C语言中的结构体,只是在C#中我用类来实现。
3.3.2 HafumanT类
这个类有点复杂,因为它要实现很多功能。这里就不详细列出它的所有代码了,而是把主要代码展示如下:
public void CreateHafumanTree() {
int lchild, rchild; double min1, min2; int number = listNode.Count;
for (int i = number; i < number * 2 - 1; i++) {
lchild = -1; rchild = -1; min1 = 3000; min2 = 3000; for (int j = 0; j < i; j++) if(listNode[j].parent==-1) if (listNode[j].weight < min1) {
min2 = min1; rchild = lchild;
min1 = listNode[j].weight; lchild = j; }
else if (listNode[j].weight < min2) {
- - 8