文件压缩与解压实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
院系:计算机学院
实验课程:实验3
实验项目:文本压缩与解压
指导老师:
开课时间:2010 ~ 2011年度第 1学期专业:
班级:
学生:
学号:
一、需求分析
1.本程序能够实现将一段由大写字母组成的容转为哈弗曼编码的编码功能以及将哈弗曼编码翻译为字符的译码功能。
2.友好的图形用户界面,直观明了,每一个操作都有相应的提示,用户只需按着提示去做,便能轻松实现编码以及译码的效果,编码及译码结果都被保存成txt 文档格式,方便用户查看。
3.本程序拥有极大的提升空间,虽然现在只能实现对大写字母的译码以及编码,但通过改进鉴别的算法,即能够实现小写字母乃至其他特殊符号等的编码。
4.本程序可用于加密、解密,压缩后文本的大小将被减小,更方便传输
5.程序的执行命令包括:
1)初始化 2)编码 3)译码 4)印代码文件 5)印哈弗曼树 6)退出
6.测试数据
(1)THIS PROGRAM IS MY FAVOURITE
(2)THIS IS MY FAVOURITE PROGRAM
BUT THE REPORT IS NOT
二、概要设计
为实现上述功能,应有哈弗曼结点,故需要一个抽象数据类型。
1.哈弗曼结点抽象数据类型定义为:
ADT HaffTree{
数据对象:HaffNode* ht,HaffCode* hc
基本操作:
Haffman(int w[],int n)
操作结果:构造哈弗曼树及哈弗曼编码,字符集权值存在数组w,大小为n
setdep()
setdep(int p,int l)
操作结果:利用递归,p为哈弗曼节点序号,l为哈弗曼节点深度setloc()
操作结果:设置哈弗曼节点坐标,用以输出到界面
setloc2()
操作结果:设置哈弗曼节点坐标,用以输出到文本,默认状态下不启用
} ADT HaffTree
2.本程序包含4个模块
1)主程序模块:
接受用户要求,分别选择执行①初始化②编码③译码④印代码文件⑤印哈弗曼树⑥退出
2)哈弗曼树单元模块——建立哈弗曼树
3)哈弗曼编码单元模块——进行哈弗曼编码、译码
4)响应用户操作,输出容到界面或文本
各模块之间的关系如下:
三、详细设计
1.全局变量、结点
int m_gcharnum;//记录字符集大小全局变量
int t;//用于输入框弹出次数的计数
int *w;//用于存储各个字符权值的数组
int x;//用于计算各个哈弗曼结点x坐标的全局变量
int initswitch;//用于判断是否已经进行了初始化操作int printtree;//用于判断哈弗曼树是否已经生成的操作HaffTree HF;//哈弗曼树类
struct HaffNode
{
int weight;//记录结点权值
int parent;//记录结点双亲序号
int lchild;//记录结点左孩子序号
int rchild;//记录结点右孩子序号
int x;//记录x坐标
int y;//记录y坐标
int dep;//记录深度
int sn;//记录空格个数
int k;//0为左孩子,1为右孩子,-1为根
string s;
};
struct HaffCode
{
int bit[28];//记录各结点的哈弗曼编码
int start;//记录遍历哈弗曼树的起始位置
int weight;//记录结点权值
};
2.哈弗曼树的实现
//函数名:Haffman
//功能:生成哈弗曼树,为每一个哈弗曼结点生成哈弗曼编码
//函数参数:int w[]引入各个字符的权值
// int n字符集大小
void HaffTree::Haffman(int w[],int n)
{
int i,j,m1,m2,x1,x2;//m1,m2表示最小、次小x1,x2表示左右孩子
for(i=0;i<2*n-1;i++)//进行初始化操作,记录权值
{
if(i ht[i].parent=0;//清空父母序号 ht[i].lchild=-1;//清空左孩子序号 ht[i].rchild=-1;//清空右孩子序号 } for(i=0;i { m1=m2=1000; x1=x2=0; for(j=0;j { if(ht[j].weight { m2=m1; x2=x1; m1=ht[j].weight; x1=j; } else if(ht[j].weight { m2=ht[j].weight; x2=j; } } ht[x1].parent=n+i; ht[x2].parent=n+i; ht[n+i].weight=ht[x1].weight+ht[x2].weight; ht[n+i].lchild=x1; ht[ht[n+i].lchild].k=0;//为左孩子添加标记 ht[n+i].rchild=x2; ht[ht[n+i].rchild].k=1;//为右孩子添加标记 }