课 程 设 计 说 明 书
哈夫曼编码
题目:
姓名:
学号:
班级:
电 信 学 院 软 件 工 程 系
2017 年 07 月 07 日
课程设计任务书
数据结构(C++)
哈夫曼编码系统
学号
班级
【1】运用哈夫曼树的基础知识,统计一篇英语文章中的字符种类和数量。
【2】完成哈夫曼树的创建,编码等操作。
【3】运用链式存储结构,用来从文件中读取数据,构造哈夫曼编码。
【4】对文件的操作,打开及读写。
1 代码书写规范。
2 关键函数要有流程图。
3 要有测试用例和相应运行结果(截图)。
4 报告内容要清晰明了,并遵守格式规范。
5 总结完成设计过程中的得失。
课程
名称
题目
姓名
设
计
任
务
设
计
要
求
指导教师
签字
课程设计评分表
课程设计题目:哈夫曼编码系统
姓名
学院
评价指标
学号
专业
指标内涵
分值 评分
选题难度
选题难度分为两个等级,A 类选题为一级,B 类选
题为二级
工 作 量
工作量饱满,工作认真、严谨,遵守纪律,与同学
团结协作、协调能力强,能按时完成设计任务。
综合运用
识
知
综合运用知识能力强,能较系统地运用有关理论与
知识解决实际问题。能够独立查阅文献资料,从事
调查研究;具有收集、整理、加工各种信息及获取
新知识的能力。
30
设计水平与
实际能力
能独立开展设计工作,能熟练掌握和运用所学基本
理论、基本知识和基本技能分析解决相关理论和实
际问题,设计方案合理可行,界面友好,符合课题
要求,实现相应功能;可以加以其他功能或修饰,
使程序更加完善、合理;操作方便易行。
写作水平
语言表达清晰,报告内容详实,能对本人所做工作
进行详细论述。
30
文档质量 能够按照给定格式排版,页面美观。
思路清晰,语言流畅,回答问题准确。(无此环节则删除此行) 30
按时出勤,不迟到早退,以每次点名为准
10
选
题
与
设
计
完
成
情
况
说
明
书
撰
写
答
辩
考
勤
成
绩
评阅时间: 2017 年 07 月 日
目录
1.系统概述........................................................................................... 5
2.系统分析........................................................................................... 5
(1)功能函数模块划分................................................................5
(2)流程图....................................................................................5
3.系统详细设计................................................................................... 6
(1)菜单部分................................................................................6
(2)统计字符................................................................................7
(3)创建哈夫曼树以及哈夫曼编码........................................... 8
(4)文档的哈夫曼编码............................................................. 10
4.运行结果展示..................................................................................11
(1)统计字符出现的个数......................................................... 12
(2)哈夫曼编码..........................................................................12
(3)文档的编码加密..................................................................13
5.总结心得......................................................................................... 13
附件(完整代码)............................................................................. 14
1.系统概述
随着信息时代的到来,信息越来越多,如何压缩信息已经是重要课题。特别是多媒体
技术的发展,使得信息量大的问题凸显。哈夫曼编码是广泛用于数据文件压缩的十分有效的
方法。本系统的前端开发工具是 Visual studio 2013,主要是对文本的处理,打开一篇英文
文章,统计该文章中每个字符出现的次数,然后以它们作为权值,设计一个哈夫曼编码。本
程序经过测试后功能均能实现。
2.系统分析
(1)功能函数模块划分
HuffmanClass();
//Setvalue 设置初值
void CreateHT();
//构造哈夫曼树
void CreateHCode();
//根据哈夫曼树求哈夫曼编码
void DispHCode();
//输出哈夫曼编码
void Revertext();
//将文本转化成二进制代码存入另一个文件中
(2)流程图
break
3.系统详细设计
(1)菜单部分
本模块主要涉及 while 和 switch 语句,在程序运行时候非常简洁,易于操作,具有较强
的可视性及便捷性。
while (i != 0)
{
cout << "******************(*^__^*) 哈夫曼编码系统欢迎您
(*^__^*)******************" << endl;
" << endl;
" << endl;
" << endl;
" << endl;
cout << "
cout << "
cout << "
cout << "
switch (i)
{
case 1:
1.统计文件中各个字符出现的个数;
2.对文件进行处理得到哈夫曼树编码;
3.对文件进行编码加密;
0.退出
List.creatlist();
List.disp();
List.total(); break;
case 2:
L.CreateHT();
L.CreateHCode();
L.DispHCode(); break;
case 3:
L.CreateHT();
L.CreateHCode();
L.Revertext(); break;
case 0:
/*
exit(0);*/
case 0:
cout << "欢迎下次使用译码器(哈夫曼)" << endl;
break;
}
cout << "请输入您要进行的操作:";
cin >> i;
system("cls");
}
}
(2)统计字符
下面函数主要涉及单链表的链式存储结构,利用数组对已经建立好的文本统计字符出现
的次数。
void total()
{
linklist *s;
int j = 0;
int count[127] = { 0 };
s = head->next;
int num;
while (s)
{
num = s->data;
if (num != 32)
{
count[num - 0]++;
}
s = s->next;
}
cout << "统计" << endl;
cout << "|---------------------------------------------|" << endl;
cout << "| 字母
|" << endl;
for (int i = 0; i < 127; i++)
{
频度
|
if (count[i])
{
aa[j].data = i;
aa[j].weight = count[i];
j++;
cout << "|
" << char(i) << "
<< setw(6) << count[i] << "
|" << endl;
}
|
"
}
Count = j;
cout << "|---------------------------------------------|" << endl;
cout << "出现的字母种类为:" << Count << "个" << endl;
cout << endl;
}
(3)创建哈夫曼树以及哈夫曼编码
void HuffmanClass::CreateHT()
{
int i, k, lnode, rnode;
double min1, min2;
for (i = 0; i < (2 * no - 1); i++)
{
}
ht[i].parent = -1;
ht[i].lchild = -1;
ht[i].rchild = -1;
for (i = no; i < (2 * no - 1); i++)
{
min1 = min2 = 32767.0;
lnode = rnode = -1;
for (k = 0; k <= (i - 1); k++)
if (ht[k].parent == -1)
{
}
if (ht[k].weight < min1)
{
}
min2 = min1;
rnode = lnode;
min1 = ht[k].weight;
lnode = k;
else if (ht[k].weight < min2)
{
}
min2 = ht[k].weight;
rnode = k;
ht[lnode].parent = i;