数据结构课程设计报告

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构与算法》课程设计报告

学号:

班级序号:

姓名:

指导教师:

成绩:

中国地质大学信息工程学院地理信息系统系

2011年12 月

1.需求规格说明

【问题描述】

利用哈夫曼编码进行对已有文件进行重新编码可以大大提高减小文件大小,减少存储空间。但是,这要求在首先对一个现有文件进行编码行成新的文件,也就是压缩。在文件使用时,再对压缩文件进行解压缩,也就是译码,复原原有文件。试为完成此功能,写一个压缩/解压缩软件。

【基本要求】

一个完整的系统应具有以下功能:

(1)压缩准备。读取指定被压缩文件,对文件进行分析,建立哈夫曼树,并给出分析结果(包括数据集大小,每个数据的权值,压缩前后文件的大小),在屏幕上输出。

(2)压缩。利用已建好的哈夫曼树,对文件进行编码,并将哈夫曼编码及文件编码后的数据一起写入文件中,形成压缩文件(*.Haf)。

(3)解压缩。打开已有压缩文件(*.Haf),读取其中的哈夫曼编码,构建哈夫曼树,读取其中的数据,进行译码后,写入文件,完成解压缩。

(4)程序使用命令行方式运行

压缩命令:SZip A Test.Haf 1.doc

解压缩命令:SZip X Test.Haf 2.doc或SZip X Test.Haf

用户输入的命令不正确时,给出提示。

(5)使用面向对象的思想编程,压缩/解压缩、哈夫曼构建功能分别构建类实现。

2.总体分析与设计

(1)设计思想:

1、压缩准备:1> 读文件,逐个读取字符,统计频率

2> 建立哈夫曼树

3> 获得哈弗曼编码

2、压缩过程:

1> 建立一个新文件,将储存权值和字符的对象数组取存储在文件头

2> 从头连续读取源文件中的每个字符,对于所读取的每一个字符到统计表中

查找相应的哈弗曼编码,每8位转换成一个ascii码,转换成字符存入新文件,不

足八位的继续读取下一个字符,即:字符->哈弗曼编码->8位的二进制->ASCII码

->字符,直到文件结束

3> 统计文件大小,利用改变流指针的位置指向文件头和尾统计字符个数来统

计文件大小

3、解压过程:1> 将存于文件头的权值和字符的对象数组取出

3> 重新建立哈夫曼树

2> 建立一个新文件,从源文件中读取一个字符->ASCII码->8位的二进制->

遍历树,遇到叶子节点则将节点中存的字符写入新文件,再读取下一个字符,直到

文件结束

(2)设计表示:

统计频率:建立哈夫曼树:

GetFrequency() GetTree()

Judge(int c) HuffmanTree(charnode *ch, int n)

MakeTree(const T& element Initialize(T a[], BinaryTree& left, BinaryTree& right) int size, int ArraySize)

获得哈弗曼编码:压缩过程:

Coding() StoreIntoNew ()

GetIndex(char) GetIndex(char) EachStore(int ,ofstream &) ChangeInto(int a[])

解压过程:

Uncompress()

Restore(BinaryTree& bc Rechange(BinaryTree& bc

,int a,ofstream &output) ,int a,ofstream &output)

(3)详细设计表示:

class Compress

{

friend BinaryTree HuffmanTree(charnode *,int n);//构造霍夫曼树public:

Compress();

void GetFrequency();

bool Judge(int c);//判断是否c是否被读过

int GetIndex(char c);//获取对应字符的索引

void GetTree();//建立哈夫曼树

void Coding();//获得哈弗曼编码

int ChangeInto(int a[]);//将每位转化成一个int

void EachStore(int a,ofstream &output);

void StoreIntoNew();//将对应ASCII码存入新文件

void Restore(BinaryTree& bc,int a,ofstream &output);//遍历树直到叶节点时,解码,存入新文件

void Rechange(BinaryTree& bc,int a,ofstream &output);//将十进制转化为二进制,解码

void Uncompress();//解压

private:

char *filepath;//源文件路径

char *filepath2;//压缩后文件的路径

char *filepath3;//解压后文件路径

charnode ch[257];

int count;//调试后发现为:字符的种数-1

BinaryTree bt;//建立的哈弗曼树

BinaryTreeNode *tnode;//解压时遍历树时需要的

void coding(BinaryTreeNode *t,Chain& A);

int bit[8];//存八位以供转化为ASCII码

相关文档
最新文档