无损数据压缩LZW算法——C++实现

兹于2017年11月,应《多媒体技术基础》课程实验的要求,本人就基于无损数据压缩LZW算法做了较为深入的理解,用C++语言实现无损数据压缩LZW算法。



无损数据压缩LZW算法


一、实验目的

1.掌握LZW算法的编码过程;

2.掌握LZW算法的译码过程。

 

二、实验设备与环境

Dev-C++ 5.9.2,Windows 7 操作系统

 

三、实验内容、程序清单及运行结果

实验要求:

Dev-C ++编写LZW算法程序。

1. 实现LZW编码程序。

2. 实现LZW解码程序。

实验参考步骤:

1.打开Dev-C ++,进入编程环境,新建一个源代码文件,文件名任意;

2.将下面我所编写的代码拷贝到所新建的源代码文件中;

3.点击编译运行。

 

 

C++源代码:

/**
*	作者:戴文治
*	时间:2017年11月3日
*	描述:LZW编码译码算法
*	特点:该代码具有可移植性,可在Dev-C++、VC++6.0、VS2010等多种平台完美运行
*		  该代码具有可重用性,运行后可对多个测试用例进行顺序测试而不受影响
*/
#include
#include
#define N 1000
using namespace std;
class LZW{ //LZW算法类
public:
	char encodeStr[N];		//要编码的字符串
	int decodeList[N];		//要译码的数组
	int firstDictionaryNum; //先前词典的大小 
	int length;				//当前词典的大小 
	char dictionary[N][N];	//先前词典
	
	
	LZW(){					//构造函数 
		encodeStr[0] = '\0';
		
		for(int i=0;idecodeList[i]=-INT_MAX;
		}
		
		for(int i=0;idictionary[i][0] = '\0';
		}
		
		firstDictionaryNum = 0;
		length = 0;
	}
	
	
	bool initDictionary() 		//初始化先前词典
	{	
		if(encodeStr[0]=='\0'){			//若没有要编码的字符串,则不能生成先前词典 
			return false;
		}
		dictionary[0][0] = encodeStr[0];//将要编码的字符串的第一个字符加入先前词典 
		dictionary[0][1] = '\0';
		length = 1;
		int i,j; 
		for(i=1;encodeStr[i]!='\0';i++){//将要编码的字符串中所有不同的字符加入先前词典 
			for(j=0;dictionary[j][0]!='\0';j++){
				if(dictionary[j][0]==encodeStr[i]){
					break;
				}
			}
			if(dictionary[j][0]=='\0'){
				dictionary[j][0] = encodeStr[i];
				dictionary[j][1] = '\0';
				length++;
			}
		}
		firstDictionaryNum = length;			//先前词典的大小
		return true;
	}
	
	
	void Encode() 	 		 	//编码
	{
		for(int g=0;g>x;
		LZW lzw;
		if(x=='1'){
			cout<<"请输入要编码的字符串:"<>lzw.encodeStr;
			if(lzw.initDictionary()==false){
				cout<<"请先设置要编码的字符串encodeStr属性"<=lzw.firstDictionaryNum){
					cout<>tempNum;
			int index = 1; 
			while(tempNum!=0){
				if(tempNum<0){
					cout<<"输入序号错误,重新输入该行"<>tempNum;
					continue;
				}
				if(tempNum!=index){
					cout<<"请以递增顺序输入序号,重新输入该行"<>tempNum;
					continue;
				}
				cin>>lzw.dictionary[tempNum-1];
				cin>>tempNum;
				index++; 
			}
			lzw.firstDictionaryNum = index-1;
			lzw.length = lzw.firstDictionaryNum; 
			
			cout<>temp;
			while(temp!=0){
				if(temp<0){
					cout<<"输入要译的编码错误,重新输入该编码"<>temp;
					continue;
				}
				lzw.decodeList[j] = temp;
				j++;
				cin>>temp;
			}
			lzw.Decode();	//开始译码 
			cout<


测试用例1截图:

编码:

 无损数据压缩LZW算法——C++实现_第1张图片


译码:

无损数据压缩LZW算法——C++实现_第2张图片

 

测试用例2截图:

编码:

无损数据压缩LZW算法——C++实现_第3张图片

 

译码:

无损数据压缩LZW算法——C++实现_第4张图片


四、注意事项

注意指针的使用。

要求熟练掌握字符串处理函数,对这些函数的功能和效果要有很明确的意识,否则会出现很多BUG

最后,这次实验我遇见许多细微的问题,最后还是通过DEBUG调试才发现的。事实证明Dev-C++VC++非常地难以调试,很不直观!而用VS2010调试程序的话,它会有一个程序变量的窗口,每执行一条语句,它会显示出当前所有变量的值,还会把此次修改的变量用红色标注出来,在此推荐通过VS2010来调试程序。


第三次发博客,写的不是很好,望各位大神多多指正,不喜勿喷。

你可能感兴趣的:(C++,高级算法)