稀疏矩阵的压缩与解压缩
程序员文章站
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;
}
运行截图: