📄 4_3.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 + -