⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 4_3.cpp

📁 稀疏矩阵的运算
💻 CPP
字号:
#include<iostream>
#include<iomanip>
using namespace std;
int G;

template <class T>
struct Terms
{
	int row,col;
	T value;
};


template <class T>
class SeqTriple
{
	public:
		SeqTriple(int mSize=0);
		~SeqTriple(){delete []trip;}
		virtual void Add(const SeqTriple<T>&B,SeqTriple<T>&C)const;
		virtual void sub(const SeqTriple<T>&B,SeqTriple<T>&C)const;
	    virtual void Mul(const SeqTriple<T>&B,SeqTriple<T>&C)const;
		virtual void Transpose(SeqTriple<T>&B)const;
		virtual void ShowTriple(char A)const;
	private:
		int maxSize;
		int m,n,t;
		Terms<T>*trip;
};

template <class T>
SeqTriple<T>::SeqTriple( int mSize)
{
    int maxRowSize, maxColSize;
	m=n=t=0;
	cout<<"输入非零元素个数:"<<endl;
	cin>>t;
	maxSize=mSize;
	trip=new Terms<T>[maxSize];
	int data;
	cout<<"存入稀疏矩阵非零元素的行、列、值:"<<endl;
	for(int i=0;i<t;i++)
	{	
		cin>>maxRowSize>>maxColSize>>data;
		trip[i].row=maxRowSize;
		trip[i].col=maxColSize;
		trip[i].value=data;
        if(trip[i].row>m) m=trip[i].row;
		if(trip[i].col>n) n=trip[i].col;
	} 
}

template<class T>
void SeqTriple<T>::ShowTriple(char A)const
{
	cout<<"稀疏矩阵"<<A<<"为:"<<endl;
	for(int i=0;i<=m;i++)
	{   
       for(int j=0;j<=n;j++)
	   {
		   int judge=1;
			for(int k=0;k<t;k++)
				if(trip[k].row==i&&trip[k].col==j){ cout<<setw(3)<<trip[k].value; judge=0;}
	   
		if(judge) cout<<setw(3)<<0;
		}
		cout<<endl;

	}
}

template<class T>
void SeqTriple<T>::Add(const SeqTriple<T>&B,SeqTriple<T>&C)const
{
	if(B.m!=C.m&&B.n!=C.n){cout<<"此两个矩阵不符合相加规则!"<<endl;G=0;}
	else 
	{G=1;
		for (int i=0;i<C.maxSize;i++)	
			for(int j=0;j<B.maxSize;j++)
			{
				if(C.trip[i].row==B.trip[j].row)
					if(C.trip[i].col==B.trip[j].col)
				{
					if(C.trip[i].value+B.trip[j].value){ C.trip[i].value=B.trip[j].value+C.trip[i].value;}
					else for(int r=i;r<maxSize;r++)C.trip[r]=C.trip[r+1];
				}
				else 
				{
					if(B.trip[j].col<C.trip[i].col)
					{
					     for(int k=maxSize-1;k<i;k--) C.trip[k+1]=C.trip[k];
						 C.trip[k].value=B.trip[j].value;
					}
				}
			}
				
	}
}


template<class T>
void SeqTriple<T>::sub(const SeqTriple<T>&B,SeqTriple<T>&C)const
{
	if(B.m!=C.m&&B.n!=C.n){cout<<"此两个矩阵不符合相减规则!"<<endl;G=0;}
	else 
	{G =1;
		for (int i=0;i<C.maxSize;i++)	
			for(int j=0;j<B.maxSize;j++)
			{
				if(C.trip[i].row==B.trip[j].row)
					if(C.trip[i].col==B.trip[j].col)
				{
					if(C.trip[i].value+B.trip[j].value){ C.trip[i].value=B.trip[j].value-C.trip[i].value;}
					else for(int r=i;r<maxSize;r++)C.trip[r]=C.trip[r+1];
				}
				else 
				{
					if(B.trip[j].col<C.trip[i].col)
					{
					     for(int k=maxSize-1;k<i;k--) C.trip[k+1]=C.trip[k];
						 C.trip[k].value=B.trip[j].value;
					}
				}
			}
				
	}
}

  template<class T>
  void SeqTriple<T>::Mul(const SeqTriple<T>&B,SeqTriple<T>&C)const
{	
	  if(B.n!=C.m){cout<<"此两矩阵不符合相乘规则!"<<endl;G=0;}
	  else{G=1;
	  T E[10][10];
	  T A[10][10];
	  T D[10][10];

	  for(int a=0;a<10;a++)
		  for(int b=0;b<10;b++)
		  { E[a][b]=0;A[a][b]=0;D[a][b]=0;}

	  for(int m=0;m<B.t;m++)
		  A[B.trip[m].row][B.trip[m].col]=B.trip[m].value;
	  for(int n=0;n<C.t;n++)
		  D[C.trip[n].row][C.trip[n].col]=C.trip[n].value;
	  
	  for(int i=0;i<10;i++)
		  for(int j=0;j<10;j++)
		  {
			  E[i][j]=0;
			  for(int k=0;k<10;k++)
				  E[i][j]+=A[i][k]*D[k][j];
		  }
    cout<<"稀疏矩阵相乘后结果为:"<<endl;
	for(int p=0;p<=B.m;p++)
	{   
       for(int r=0;r<=C.n;r++)
	   {
		   cout<<setw(3)<<E[p][r];
	   }  
	   cout<<endl;
	   }
	  }
}

template<class T>
void SeqTriple<T>::Transpose(SeqTriple<T>&B)const
{
	int change;
	int compare,x;
	x=B.m;B.m=B.n;B.n=x;B.t=t;
	for(int i=0;i<B.t;i++)
	{
		change=B.trip[i].row;
		B.trip[i].row=B.trip[i].col;
		B.trip[i].col=change;
	}
	for(int k=1;k<B.t;k++)
	for(int j=k;j<B.t;j++)
	{
		if(B.trip[j].row<B.trip[j-1].row)
		{compare=B.trip[j].row;
		B.trip[j].row=B.trip[j-1].row;
		B.trip[j-1].row=compare;}
	}

}


void main()
{ 
	cout<<"欢迎进入稀疏矩阵的运算!!!"<<endl;
	cout<<endl;
	cout<<"请输入参加运算的两个稀疏矩阵!!"<<endl;
	int mSize1,mSize2;
	cout<<"输入稀疏矩阵A的最大存储空间:"<<endl;
	cin>>mSize1;
	SeqTriple<int> a(mSize1);
	cout<<"输入稀疏矩阵B的最大存储空间:"<<endl;
	cin>>mSize2;
	SeqTriple<int>b(mSize2);
    int x,y=1;

	cout<<"1 显示两个稀疏矩阵"<<endl;
    cout<<"2 两个稀疏矩阵相加"<<endl;
    cout<<"3 两个稀疏矩阵相减"<<endl;
    cout<<"4 两个稀疏矩阵相乘"<<endl;
    cout<<"5 第一个稀疏矩阵转置"<<endl;
	cout<<"0 退出系统"<<endl;
   loop: 
	cin>>x;
	if(y){
	switch(x)
	{
	case 1:a.ShowTriple('A');b.ShowTriple('B');y=1;goto loop;	   
	case 2: a.Add(a,b);if(G){cout<<"相加结果为:"<<endl;b.ShowTriple('1');}y=1;goto loop;
	case 3: a.sub(a,b);if(G){cout<<"相减结果为:"<<endl;b.ShowTriple('2');}y=1;goto loop;
	case 4: a.Mul(a,b);if(G){cout<<"相乘结果为:"<<endl;a.ShowTriple('3');}y=1;goto loop;
    case 5: a.Transpose(a);cout<<"第一个矩阵转置结果为:"<<endl;a.ShowTriple('C');y=1;goto loop;
	case 0: cout<<"谢谢使用!"<<endl;y=0;break;
	}
	}




}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -