版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/1数据结构课程设计报告
《数据结构与算法》课程设计报告
学号:
班级序号:
姓名:
指导老师:
成果:
中国地质高校信息工程学院地理信息系统系
2023年12月
1.需求规格说明
【问题描述】
利用哈夫曼编码进行对已有文件进行重新编码可以大大提高减小文件大小,削减存储空间。但是,这要求在首先对一个现有文件进行编码行成新的文件,也就是压缩。在文件使用时,再对压缩文件进行解压缩,也就是译码,复原原有文件。试为完成此功能,写一个压缩/解压缩软件。
【基本要求】
一个完整的系统应具有以下功能:
(1)压缩预备。读取指定被压缩文件,对文件进行分析,建立哈夫曼树,并给出分析结果(包括数据集大小,每个数据的权值,压缩前后文件的大小),在屏幕上输出。
(2)压缩。利用已建好的哈夫曼树,对文件进行编码,并将哈夫曼编码及文件编码后的数据一起写入文件中,形成压缩文件(*.Haf)。
(3)解压缩。打开已有压缩文件(*.Haf),读取其中的哈夫曼编码,构建哈夫曼树,读取其中的数据,进行译码后,写入文件,完成解压缩。
(4)程序使用命令行方式运行
压缩命令:SZipATest.Haf1.doc
解压缩命令:SZipXTest.Haf2.doc或SZipXTest.Haf
用户输入的命令不正确时,给出提示。
(5)使用面对对象的思想编程,压缩/解压缩、哈夫曼构建功能分别构建类实现。
2.总体分析与设计
(1)设计思想:
1、压缩预备:1>读文件,逐个读取字符,统计频率
2>建立哈夫曼树
3>获得哈弗曼编码
2、压缩过程:
1>建立一个新文件,将储存权值和字符的对象数组取存储在文件头
2>从头连续读取源文件中的每个字符,对于所读取的每一个字符到统计表中
查找相应的哈弗曼编码,每8位转换成一个ascii码,转换成字符存入新文件,不
足八位的连续读取下一个字符,即:字符->哈弗曼编码->8位的二进制->ASCII码
->字符,直到文件结束
3>统计文件大小,利用转变流指针的位置指向文件头和尾统计字符个数来统
计文件大小
3、解压过程:1>将存于文件头的权值和字符的对象数组取出
3>重新建立哈夫曼树
2>建立一个新文件,从源文件中读取一个字符->ASCII码->8位的二进制->
遍历树,遇到叶子节点则将节点中存的字符写入新文件,再读取下一个字符,直到
文件结束
(2)设计表示:
统计频率:建立哈夫曼树:
GetFrequencyGetTree
Judge(intc)HuffmanTree(charnode*ch,intn)
MakeTree(constT&elementInitialize(Ta,BinaryTree&left,BinaryTree&right)intsize,intArraySize)
获得哈弗曼编码:压缩过程:
CodingStoreIntoNew
GetIndex(char)GetIndex(char)EachStore(int,ofstream&)ChangeInto(inta)
解压过程:
Uncompress
Restore(BinaryTree//构造霍夫曼树public:
Compress;
voidGetFrequency;
boolJudge(intc);//推断是否c是否被读过
intGetIndex(charc);//猎取对应字符的索引
voidGetTree;//建立哈夫曼树
voidCoding;//获得哈弗曼编码
intChangeInto(inta);//将每位转化成一个int
voidEachStore(inta,ofstream
voidStoreIntoNew;//将对应ASCII码存入新文件
voidRestore(BinaryTree//遍历树直到叶节点时,解码,存入新文件
voidRechange(BinaryTree//将十进制转化为二进制,解码
voidUncompress;//解压
private:
char*filepath;//源文件路径
char*filepath2;//压缩后文件的路径
char*filepath3;//解压后文件路径
charnodech[257];
intcount;//调试后发觉为:字符的种数-1
BinaryTreebt;//建立的哈弗曼树
BinaryTreeNode*tnode;//解压时遍历树时需要的
voidcoding(BinaryTreeNode*t,Chain
intbit[8];//存八位以供转化为ASCII码
intbitcount;
inttotal;//编码总长度
intcurrentcount;//解压时纪录当前已解压的编码长度
};
字符类
classcharnode
{
public:
charnode{weigh=0;codelen=0;asciikey=0;}
charcharacter;//字符
intasciikey;//字符对应的ASCII码
intweigh;//权重
intcode[100];//存储哈弗曼编码
intcodelen;
};
3.编码
1、用eof作为循环掌握条件时,总是会重复读取最终一个字符。解决方法将while(input.eof){...}改为while(true){input.get(temp);if(input.eof)break;...}
2、在获得字符的哈弗曼编码,原来觉得就是一个前序遍历,但要编码与遍历时刻同步却是个难点,最终打算用链表代替栈,并且调整了挨次,首先推断是否需要导出编码,便于递归
3、在压缩的时候首先想到要怎么解压,所以将解压所需的信息储存到文件头,却不能直接储已经存建立好的哈夫曼树,最终想到将建树所需的信息储存起来在解压前再建立一个相同的树
4、对于源文件末尾编码不满8位字符的处理,将缺位数补零,在解压时仅遍历到总编码位数(已保存在文件头)
5、在解压时,挨个读取压缩文件的字符时会有负数,第一次并没有考虑到,将十进制转化为二进制时得到的都是0,后面调试时才发觉这个问题,于是在转化前首先推断正负,若是负数则加上256
6、关于封装读取的字符类,前前后后改了许多次,最开头是结构体,结果不会调用,后面改成类,对于他的私有数据增增减减好几次
4.程序及算法分析初始界面
压缩功能
压缩后生成的文件
解压功能
解压后的文件
退出程序
5.小结
6.附录
统计频率
while(true)
{
input.get(temp);//get(char
if(!Judge((int)temp))//Judge推断该字符是否消失过
{
ch[count].asciikey=(int)temp;
ch[count].character=temp;
ch[count].weigh++;
count++;}
}
input.close;
}
获得哈弗曼编码
voidCompress::coding(BinaryTreeNode*t,Chain
A.GetCode(ch[index]);//存储哈弗曼编码
A.Delete(A.Length);
}
else{
if(t->LeftChild)
{
A.Insert(A.Length,0);//向左走记为0
coding(t->LeftChild,A);
}
if(t->RightChild)
{
A.Insert(A.Length,1);//向右走记为1
coding(t->RightChild,A);
}
A.Delete(A.Length);
}
}
压缩过程
voidCompress::StoreIntoNew//将对应ASCII码存入新文件
{
ifstreaminput;
input.open(filepath);//读入的源文件
cout>filepath2;
ofstreamoutput;
output.open(filepath2,ios::binary|ios::out);
if(!output)//顺当打开否
{
cout>filepath2;
fstreaminput;
input.open(filepath2,ios::binary|ios::in);
if(!input)
{
cout>filepath3;
ofstreamoutput;
output.open(filepath3,ios::app);//ios::app—全部输出附加在文件末尾while(!output)
{
cout>filepath3;
}
BinaryTreebc;
input.read((char*)//读取哈夫曼树
StoredNodesnode[256];
input.read((char*)
inttempbc1,tempbc2;
tempbc1=bc.count;
tempbc2=bc.lackcount;
total=bc.total;
bc=HuffmanTree(snode,bc.count);//重新建树bc.count=tempbc1;
bc.lackcount=tempbc2;
tnode=bc.root;
chartemcha;
in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 年消化内科护理质控缺陷分析与对策
- 2026 年小儿高热惊厥预防及急救护理处置
- 全面解析Android面试题与答案要点
- 安全生产法专项试题及参考答案
- 2026年1+X花卉园艺中级模考试题(含答案)
- 企业保安各类试题及标准答案
- 2026年度全国保密教育线上培训考试局部试题带答案
- 2026年国家开放大学电大《园艺基础》期末真题(考点提分)附答案详解
- 2026年农田水利知识试题及答案
- 2026年小学三年级数学下册期末考试测试卷附答案详解
- GB/T 32682-2026塑料聚乙烯环境应力开裂(ESC)的测定全缺口蠕变试验(FNCT)
- 零售药店医疗保障内部管理制度
- 2026年主管护师真题(含答案)
- 煤矿井下无轨胶轮车安全管理培训
- 2026年广东省中考数学试卷(含详细答案解析)
- 2026中国商业遥感卫星数据定价策略与政府采购偏好研究
- 肿瘤多学科会诊MDT模式介绍
- 2026年上海市杨浦区卫生健康系统人员招聘笔试参考题库及答案解析
- 2026年营养师(注册)考试历年机考真题集(考点提分)附答案详解
- 军用无人机讲解课件
- 保险知识问答题库及答案
评论
0/150
提交评论