哈弗曼编码课程设计实验报告
- 格式:doc
- 大小:94.50 KB
- 文档页数:19
目录
一、实训要求……………………………………………………………………………..2
二、课题分析和设计……………………………………………………………………..2
1、 基本需求分析……………………………………………………………………2,3
2、 对应的类………………………………………………………………................3,4,5
三、主要功能界面………………………………………………………………………...5
1、 主界面……………………………………………………………………………5
2、 读取文章并对字符编码…………………………………………………………5
3、 哈弗曼编码信息………………………………………………………………….6
4、 文章编码………………………………………………………………………….6
5、 文章译码………………………………………………………………………….6
6、 错误处理………………………………………………………………………….7
四、总结(课设心得体会)………………………………………………………………7
五、附录(主要函数代码)………………………………………………………………7~14
—
欢迎下载 2 一、实训要求
1、输入为:一段中文或英文的文章的文件名。
2、读取文章的字符信息。
3、对字符进行权值的计算。
4、根据权值构造哈弗曼树。
5、生成对应的编码。
6、输出为:原文章的编译(译文)。
7、根据已经生成的编码表,输入任意的译文可以得到原文。
二、课题分析和设计
1.基本需求分析:
(1)在通信过程中,为了提高信道利用率,缩短信息传输时间降低传输成本,需要一编译码器。
(2)此哈弗曼编码译码器应具有编码译码的双向功能,即在发送端通过编码系统对传入的数据进行编码。
(3)在接收端将数据译码,将具有两项功能的编码译码器用于双工信道就可满足,双工信道的双向编译功能。
(4)输入某段报文是,系统将自己完成编译输出。
(5)、程序设计流程:
<1>文字表述:
开始进入功能选择界面,包含五种操作
(1)读取文章并对字符编码。
(2)哈夫曼编码信息。
(3)文章编码。
(4)文章译码。
(5)退出程序。
<2>操作:
(1)给定一篇文章,统计字符出现的概率,并根据概率建立哈弗曼树,并利用哈弗曼 树对字符进哈夫曼编码。
(2)显示哈弗曼编码信息,包括字符和其哈弗曼编码。
(3)对文章进行译码,显示译码信息,并保存。
(4)对文章进行译码,显示并保存。
<3>流程图:
—
欢迎下载 3
2、对应的类:
<1>定义类:
class Element //结点类
{
public:
char name;//字符名
int weight;//字符权值
int lchild;//左孩子
int rchild;//右孩子
int parent;//父结点
Element()
{
weight = 0;
lchild = -1; 文章编码 哈夫曼编码信息
显示编码 退出程序 程序主界面
读取文章并对文章进行编码 文章译码 程序开始
显示译码 保存编码 保存译码 返回主界面 返回主界面 —
欢迎下载 4 rchild = -1;
parent =-1;
}
~Element(){}
};
<2>定义字符和出现的次数:
class Name //字符类
{
public:
char pname;//字符名
int num;//字符出现的次数
double lweight;//字符的权值
Name()
{
num = 0;
lweight = 0;
}
~Name(){}
};
<3>定义字符总类总数和存储信息:
class GetName //关于字符类
{
public:
char file_name[max2];//文件名
int n; //字符的种类
int sum; //字符的总数
Name letter[max1]; //存储字符信息的类的数组
GetName()
{
sum = 0;
n = 0;
}
};
<4>定义编码类:
class CodeNode//编码类
{
public:
char ch; //存储字符
char save_code[max1]; //存储编码
}; —
欢迎下载 5
<5>主要功能实现类:
class Function
{
public:
GetName L;
int fn; //定义哈夫曼数组大小
Element HuffmanT[max3]; //哈夫曼数组
CodeNode Code[max1]; //字符编码数组
Function()
{
fn = 0;
}
};
三、主要功能界面:
1、主界面:
2、读取文章并对字符编码:
3、哈弗曼编码信息: —
欢迎下载 6
4、文章编码:
5、文章译码:
6、错误处理: —
欢迎下载 7
四、总结(课设心得体会):
三周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。 课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础. 通过这次课程设计,本人在多方面都有所提高。在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
六、 附录(源代码):
#include
#include
#include
#include
欢迎下载 8 #define max1 150
#define max2 50
#define max3 256
using namespace std;
class Element //结点类
{
public:
char name;//字符名
int weight;//字符权值
int lchild;//左孩子
int rchild;//右孩子
int parent;//父结点
Element()
{
weight = 0;
lchild = -1;
rchild = -1;
parent =-1;
}
~Element(){}
};
class CodeNode//编码类
{
public:
char ch; //存储字符
char save_code[max1]; //存储编码
};
class Name //字符类
{
public:
char pname;//字符名
int num;//字符出现的次数
double lweight;//字符的权值
Name()
{
num = 0;
lweight = 0;
}
~Name(){}
};