欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

稀疏矩阵的压缩与解压缩

程序员文章站 2022-07-04 20:10:31
...

        这是大二时候自己学数据结构是,做的实验。整理文件夹时候找出来的,现在发出来,程序中,为了用到学到的知识,用到c中的结构体知识和c++的类,另外还有读文件知识点。


#include<iostream>
#include<fstream>
#include<iomanip>
#include<windows.h>
using namespace std;
int nozerocount=0;

typedef	struct triplesdata
{
	int newrow;//三元组的行
	int newcol;//三元组的列
	int data;//三元组的数值
}T;

class matrix 
{
private:
	ifstream file;
	ofstream file1;
	int row;
	int col;
	int num;
	int data[10][10];
	int newdata[10][10];
	T p[20]; 
public:
	matrix();
	~matrix();
	void menu();
	void domenu();
	void radomdata(int row,int col);
	void readfile();//从这里得到文件中的数据、
	void display(int row,int col);//显示矩阵的数据。
	void condess();//进行压缩的核心操作
	void recondess();//三元组解压缩
	void bound(char ch,int num);//绘制界线
	void save(int number);
};
matrix::matrix()
{
	file.open("矩阵的数据文件.txt",ios::in);
	file1.open("压缩矩阵的数据文件.txt",ios::out);
	row=0;
	col=0;
}
matrix::~matrix()
{
	file.close();
	file1.close();
}
void matrix::bound(char ch,int num)
{
	for(int i=0;i<num;i++)
		cout<<ch;
}
void matrix::readfile()//从文件中读取数据
{
	int i,j;
	file>>i;
	file>>j;
	for(row=0;row<i;row++)
	{
		for(col=0;col<j;col++)
		{
			file>>num;
			if(num!=0)
				nozerocount++;
			data[row][col]=num;
		}
	}
	display(row,col);
}
void matrix::menu()
{
	cout<<setw(40)<<"稀疏矩阵的压缩与解压缩的实验"<<endl;
	cout<<setw(7);
	bound('*',50);
	cout<<endl<<setw(50)<<"1.导入文件(将文件中的数据导入二维数组)"<<endl;
	cout<<setw(30)<<"2.压缩,产生三元组"<<endl;
	cout<<setw(16)<<"3.解压"<<endl;
	cout<<setw(36)<<"4.随机产生数据导入二维数组"<<endl;
	cout<<setw(16)<<"0.退出"<<endl;
	cout<<setw(7);
	bound('*',50);
	cout<<endl;
}
void matrix::display(int row,int col)//显示矩阵中的数据
{
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			cout<<data[i][j]<<"  ";
		}
		cout<<endl;
	}
}
void matrix::radomdata(int rown,int coln)
{
	for(int i=0;i<rown;i++)
		for(int j=0;j<coln;j++)
		{
			data[i][j]=rand()%10;
			if(data[i][j]!=0)
				nozerocount++;
		}
		row=rown;
		col=coln;
		display(rown,coln);
}
void matrix::condess()
{
	
	cout<<"不是0的个数:"<<nozerocount<<endl;	
	int r=0;
	int c=0;
	int count=0;
	cout<<setw(10)<<"row"<<setw(10)<<"col"<<setw(10)<<"value"<<endl;
	for(int i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			if(data[i][j]!=0)
			{
				p[count+1].newrow=i;
				p[count+1].newcol=j;
				p[count+1].data=data[i][j];
				count++;	
				save(i);
				save(j);
				save(data[i][j]);
				file1<<endl;
			}
		}
	}
	p[0].newrow=row;
	p[0].newcol=col;
	p[0].data=nozerocount;
	for(int n=0;n<=count;n++)
	{
		cout<<setw(10)<<p[n].newrow<<setw(10)<<p[n].newcol<<setw(10)<<p[n].data<<endl;
		bound('-',40);
		cout<<endl;
	}
	//system("pause");
}
void matrix::save(int num)
{
	file1<<num<<" ";
}
void matrix::recondess()
{
	system("cls");
	int i,j;
	int rowc,colc;
	int nrow=p[0].newrow;
	int ncol=p[0].newcol;
	//现将矩阵置0
	for( i=0;i<nrow;i++)
		for(j=0;j<ncol;j++)
			newdata[i][j]=0;
		//将非0的数据存入二维数组中
		for(int n=1;n<=nozerocount;n++)
		{
			rowc=p[n].newrow;
			colc=p[n].newcol;
			newdata[rowc][colc]=p[n].data;
		}
		cout<<"解压后的矩阵:"<<nrow<<"行"<<setw(10)<<ncol<<" 列"<<endl;
		for(i=0;i<nrow;i++)
		{
			for(j=0;j<ncol;j++)
			{
				cout<<setw(10)<<newdata[i][j]<<setw(10);
			}
			cout<<endl;
		}
}
void matrix::domenu()
{
	int choice;
	menu();
	cout<<"请输入选择:";
	cin>>choice;
	switch(choice)
	{
	case 1:readfile();break;
	case 2:
		{
			condess();
		}break;
	case 3:recondess();break;
	case 4:
		{
			int rowc;
			int colc;
			cout<<"请输入产生矩阵行数和列数";
			cin>>rowc>>colc;
			radomdata(rowc,colc);
		}break;
	case 0:exit(0);break;
	default:
		cout<<"输入错误"<<endl;break;
	}
	system("pause");
	system("cls");
}
int main()
{
	SetConsoleTitle("稀疏矩阵的压缩与解压缩");
	system("color f0");
	matrix m;
	while(1)
	{
		m.domenu();
	}
	return 0;
}

运行截图:

稀疏矩阵的压缩与解压缩


稀疏矩阵的压缩与解压缩


稀疏矩阵的压缩与解压缩


稀疏矩阵的压缩与解压缩


相关标签: 数据结构