综合实验实验报告书示例

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Main.cpp 的压缩比为 213%,主要有两个原因,一是文件本身很小,另一个是压 缩文件要存储相关的压缩信息(原文件各字节的权值及其他),相比一个小文件,其 长度比例成了很重要的因素。
第三部分:实验小结、收获与体会
6
pHT = ( HuffmanTree ) malloc ( (512 ) * sizeof ( HTNode ) );
for ( p = pHT+1, i = 1; i < 256; ++i, ++p)
*p = { weight[i-1], 0, 0, 0 };
for ( ; i <= 511; ++i, ++p ) *p = { 0, 0, 0, 0 };
再例:文件编码压缩 Encode()函数会产生编码后的一个缓冲区 char *pBuffer; 写文件函数会使用它直接写磁盘文件。调试过程中并没发现任何问题,就是不能成 功地写后缀为.huf 的文件。在相关函数中设置断点,观察缓冲区的情况,且编写屏 幕输出缓冲区数据的程序段,发现缓冲区是空的。通过在 Encode 函数中以及 WriteFile 函数中做同样的跟踪调试,发现在 Encode 函数中建立的缓冲区数据并没 有带出来,通过分析发现是缓冲区空间构建位置的问题,即不能放在 Encode 函数中。
学生学号
实验课成绩
学生实验报告书
实验课程名称 开课学院
指导教师姓名 学生姓名
学生专业班级
数据结构与算法综合实验 计算机科学与技术学院 伍新华
2015 -- 2016 学年 第 2 学期
1
实验课程名称: 数据结构与算法综合实验
实验项目名称
二叉树与赫夫曼图片压缩
实验者
专业班级
同组者
第一部分:实验分析与设计(可加页)
//删除已编码成字节的 8 个字符
for(int i=0;i<SIZE-8;i++)cd[i]=cd[i+8];
}
}
if(strlen(cd)>0)pBuffer[pos++]=Str2Byte(cd);
fclose(in); //关闭文件 }
3.测试用例设计
3
z 使用一个文本文件作为压缩的例,观察其压缩比; z 通过屏幕截图形成一个 BMP 图片文件,观察其压缩比; z 在互联网上搜索下载任意格式的图片文件,观察其压缩比。
例如在统计图片文件中 0-255 取值的 256 个字节出现的次数函数中,设置断点 并使用简单的文本文件进行测试,发现了“没有扫描完整个文件而是中途跳出”的 问题。通过断点出查看 weight 数组的值以及通过逐语句跳出的处定位错误所在之 处。找出问题的原因是以流的形式读入的字符定义问题,char ch;ch=fgetc(in); Weight[ch]++;字符变量 ch 在转换成 int 时出现了负数。当将 ch 的定义修改为 Unsigned char ch;问题解决。
① 读取图片文件、统计权值 ② 生成 Huffman 树 ③ 生成 Huffman 编码 ④ 压缩图片文件 ⑤ 保存压缩的图片文件
1.数据结构的设计
z 记录统计 256 种不同字节的重复次数使用整型数组。 Unsigned int weight[256];
z 二叉树的存储结构。使用结构体存储节点,使用数组存储树的节点,使用静态 二叉链表方式存储二叉树。 Struct HTNode{ Unsigned int weight; Int parent; Int lchild; Int rchild; }; Typedef HTNode *HuffmanTree;
start = n –1;
for ( c = i, f = pHT [i].parent; f != 0; c = f, f = pHT [f].parent )
if ( pHT [f].lchild = = c ) cd [--start] = “ 0” ;
else cd [--start] = “ 1” ; //判断 c 是 f 的左还是右孩子
while(!feof(in)){
ch=fgetc(in);
strcat(cd,pHC[ch]); //从 pHC 复制编码串到 cd
while(strlen(cd)>=8){
//截取字符串左边的 8 个字符,编码成字节
//Str2Byte 将由 8 个 1、0 组成的组成的串转换成一个字节
pBuffer[pos++]=Str2Byte(cd);
HfmCompressConsole 工程中新建 2 组相关文件。第 1 组是实现依据图片文件构 建其 Huffman 编码的头文件 Huffman.h 和源程序文件 Huffman.cpp。第 2 组是实现 图 片 文 件 压 缩 编 码 和 写 磁 盘 等 功 能 的 头 文 件 Compress.h 和 源 程 序 文 件 Compress.cpp。
HT [i].lchild = s1; HT [i].rchild = s2;
HT [i].weight = HT [s1].weight + HT [s2].weight;
}
Return 511;
}
2)生成 Huffman 编码算法 Input: HuffmanTree pHT[512];n; //n 为叶子节点数 Output: Char *HuffmanCode[256]; Process: int HuffmanCoding(HuffmanCode &pHC,HuffmanTree &pHT,int n){
//开辟缓冲区
pBuffer=(char*)malloc(nSize*sizeof(char));
if(!pBuffer){
return 0;
}
char cd[SIZE]={'\0'}; //工作区
int pos=0;
//缓冲区指针
unsigned char ch;
//扫描文件,根据 Huffman 编码表对其进行压缩,压缩结果暂存缓冲区
Huffman.h 存放与 Huffman.cpp 相关函数需要的数据类型的定义,函数原型的 声明等。Compress.h 存放与 Compress.cpp 相关函数需要的数据类型的定义,函数 原型的声明等。
最后新建一个 main.cpp 源文件,实现 main 函数按分析与设计中规定的流程调 用 Huffman.cpp 和 Compress.cpp 的功能函数。
pHC[i] = ( char * ) malloc ( ( n-start ) * sizeof ( char ) );
Strcpy ( pHC[i], &cd[start] );
}
free ( cd );
}
3)压缩编码算法
Input:pFileName(磁盘文件名串); HuffmanCode pHC(哈夫曼编码);
报告成绩 组别
完成日期ห้องสมุดไป่ตู้
年月日
一、 实验目的和要求
1.目的
z 掌握树的存储结构 z 掌握二叉树的三种遍历方法 z 掌握 Huffman 树、Huffman 编码等知识和应用 z 使用 C++、文件操作和 Huffman 算法实现“图片压缩程序”专题编程。 2.要求 z 针对一幅 BMP 格式的图片文件,统计 256 种不同字节的重复次数,以每种字
二、 调试说明(调试手段、过程及结果分析)
调试主要内容为编写程序的语法正确性与否,程序逻辑的正确性与否。调试手 段主要采用了 Microsoft Visual Studio 2010 集成开发环境中“调试(D)”菜单中 的调试方法或手段。即:F5:启动调试;F11:逐语句调试;F12:逐过程调试;F9: 切换断点;ctrl+B:新建断点等。
复的次数,即权值。定义一个文件头,保存相关的信息:
Struct fHEAD {
Char type[4];
//文件类型
Unsigned int length; //原文件的长度
Unsigned char weight[256]; //权值
}
压缩文件时,定义一个内存缓冲区:
Unsigned char *pBuffer;
节重复次数作为权值,构造一颗有 256 个叶子节点的哈夫曼二叉树。 z 利用上述哈夫曼树产生的哈夫曼编码对图片文件进行压缩。 z 压缩后的文件与原图片文件同名,加上后缀.huf(保留原后缀),如 pic.bmp
压缩后 pic.bmp.huf
二、 分析与设计
依据上述的实验目的与要求,可导出实现的二叉树与赫夫曼图片压缩软件的流 程为:
1
z Huffman 编码存储结构
定义一二维数组:char HufCode[256][];因考虑每个字节的 Huffman 编码长度
不一样,可使用字符串指针数组:
Char *HuffmanCode[256];
z 压缩文件的算法的数据结构
为正确解压文件,除了要保存原文件长度外,还要保存原文件中 256 种字节重
Output:pBuffer(压缩编码的缓冲区)
Process:
int Encode(const char *pFileName, const HuffmanCode pHC, char *pBuffer){ //
压缩编码
//以二进制流形式打开文件
FILE *in=fopen(pFileName,"rb");
三、主要仪器设备及耗材
1. 安装了 Windows XP 或 Windows 7 或其它版本的 Windows 操作系统的 PC 机 1 台
2.PC 机系统上安装了 Microsoft Visual Studio 2010 开发环境
第二部分:实验过程和结果(可加页)
一、 实现说明
在 Microsoft Visual Studio 2010 集成开发环境中新建一个 Win32 控制台应用 程序工程 HfmCompressConsole。
pHC = ( HuffmanCode ) malloc ( ( n+1 ) * sizeof ( char * ) ); cd = ( char * ) malloc ( n * sizeof ( char ) ); cd [n-1] = “ \0” ;
2
for ( i = 1; i <= n; ++i ) { //为 n 个叶子结点编码
//其大小视原文件压缩后的大小
2.核心算法设计
1)生成 Huffman 树算法
Input: Unsigned int weight[256]; //权值
Output: HuffmanTree pHT[512];
//哈夫曼树,静态二叉链表
Int root;
//树的根节点指针
Process:
int CreateHuffmanTree(HuffmanTree &pHT[], Unsigned int weight[]){
图 4 为一文本文件例的压缩比相关信息。
图 1:输入文件名界面
图 2:针对 pic.bmp 产生的部分不同权值字节的哈夫曼编码信息
5
图 3:pic.bmp 压缩文件写磁盘及压缩比情况
图 4:文本文件(本程序的 main 函数)压缩比信息
2.综合分析和结论
通过上述测试用例的效果截图,可以看出:使用哈夫曼编码对格式为 bmp 的图 片文件的压缩比在 50%左右,但对已经压缩的图片文件或文本文件的压缩情况不佳。 实际测试还使用了 jpg 格式的文件,限于篇幅没有截图过来,其压缩比为 100%,即 没有压缩。
for ( i = 256; i <= 511; ++i ) { //构造 n-1 个分支结点
Select ( pHT, i-1, s1, s2 );
//pHT[1..i-1]中 parent 为 0 的 w 最小的 2 个结点
HT [s1].parent = i; HT [s2].parent = i;
4
三、 软件测试(测试效果.界面、综合分析和结论) 1.测试效果.界面
使用屏幕截图编辑成 bmp 图片文件 pic.bmp 测试哈夫曼压缩程序效果截图如下 各图。图 1 为程序的文件名输入界面;图 2 为对本例 pic.bmp 文件依据其不同字节 出现的次数为权(Weight 列)进行哈夫曼编码(得到的部分编码信息 HuffmanCode 列),Byte 列为编码的字节编号;图 3 为其压缩比相关信息。
相关文档
最新文档