📄 shiyan11.cpp
字号:
#include "iostream.h"
#include "stdlib.h"
class Matrix
{
friend Matrix Rotate(Matrix &m);
public:
int **pMatrix;
int iMaxx,iMaxy;
static int ObjectAliveNo;
public:
Matrix(unsigned int x ,unsigned int y);
Matrix(Matrix &m);
~Matrix();
bool SetValue( int x , int y ,int value);
void Input();
void Print() const;
Matrix operator*(Matrix &m);
Matrix operator=(Matrix &m);
};
int Matrix::ObjectAliveNo=0;
Matrix::Matrix(unsigned int x,unsigned int y)
{
pMatrix=new int *[x];
if(! pMatrix)
{
cerr<<"\n Matrix constructor error!\n";
exit(0);
}
for(unsigned int i=0;i<x;i++)
{
pMatrix[i]=new int[y];
}
iMaxx=x;
iMaxy=y;
ObjectAliveNo++;
}
Matrix::Matrix(Matrix & m)
{
iMaxx=m.iMaxx;
iMaxy=m.iMaxy;
pMatrix=new int*[iMaxx];
if(!pMatrix)
{
cerr<<"\n Matrix constructing error!\n";
exit(0);
}
for(int i=0;i<iMaxx;i++)
{
pMatrix[i]=new int[iMaxy];
}
int j;
for(i=0;i<iMaxx;i++)
for(j=0;j<iMaxy;j++)
pMatrix[i][j]=m.pMatrix[i][j];
ObjectAliveNo++;
}
Matrix Matrix::operator =(Matrix &m)
{
for(int i=0;i<iMaxx;i++)
delete[]pMatrix[i];
delete[]pMatrix;
iMaxx=m.iMaxx;
iMaxy=m.iMaxy;
pMatrix=new int *[iMaxx];
if(!pMatrix)
{
cerr<<"\n Matrix constructing error!\n";
exit(0);
}
for(i=0;i<iMaxx;i++)
{
pMatrix[i]=new int[iMaxy];
}
int j;
for(i=0;i<iMaxx;i++)
for(j=0;j<iMaxy;j++)
pMatrix[i][j]=m.pMatrix[i][j];
ObjectAliveNo++;
return *this;
}
Matrix::~Matrix()
{
for(int i=0;i<iMaxx;i++)
delete[]pMatrix[i];
delete[]pMatrix;
ObjectAliveNo--;
}
bool Matrix::SetValue( int x, int y,int value)
{
if((x>=iMaxx)||(y>=iMaxy))
{
cerr<<"\n Invalid(x,y):"<<x<<','<<y<<'\n';
return false;
}
else
{
pMatrix[x][y]=value;
return true;
}
}
void Matrix::Input()
{
int ix,iy,value;
for(ix=0;ix<iMaxx;ix++)
for(iy=0;iy<iMaxy;iy++)
{
cin>>value;
SetValue(ix,iy,value);
}
}
void Matrix::Print()const
{
int ix,iy;
cout<<"\n Sun of Matrix object(s)="<<ObjectAliveNo;
cout<<"\n Matrix("<<iMaxx<<','<<iMaxy<<")is";
for(ix=0;ix<iMaxx;ix++)
{
cout<<'\n';
for(iy=0;iy<iMaxy;iy++)
cout<<pMatrix[ix][iy]<<' ';
}
}
Matrix Matrix::operator *(Matrix & m)
{
if(iMaxy!=m.iMaxx)
{
cerr<<"\n Cannot multiply Matrix a with b!\n";
return * this;
}
int ix,iy,iz;
Matrix c(iMaxx,m.iMaxy);
for(ix=0;ix<iMaxx;ix++)
for(iy=0;iy<m.iMaxy;iy++)
{
c.pMatrix[ix][iy]=0;
for(iz=0;iz<iMaxy;iz++)
{
c.pMatrix[ix][iy]+=pMatrix[ix][iz]*m.pMatrix[iz][iy];
}
}
return c;
}
Matrix Rotate(Matrix & m)
{
int i,j;
Matrix mr(m.iMaxy,m.iMaxx);
for(i=0;i<m.iMaxx;i++)
for(j=0;j<m.iMaxy;j++)
mr.pMatrix[j][i]=m.pMatrix[i][j];
return mr;
}
Matrix Mul(Matrix a,Matrix b)
{
if(a.iMaxy!=b.iMaxx)
{
cerr<<"\n Cannot multiply Matrix a with b!\n";
return a;
}
int ix,iy,iz;
Matrix c(a.iMaxx,b.iMaxy);
for(ix=0;ix<a.iMaxx;ix++)
for(iy=0;iy<b.iMaxy;iy++)
{
c.pMatrix[ix][iy]=0;
for(iz=0;iz<a.iMaxy;iz++)
{
c.pMatrix[ix][iy]+=a.pMatrix[ix][iy]*b.pMatrix[iz][iy];
}
}
return c;
}
Matrix Mul(Matrix *pa,Matrix *pb)
{
if(!pa||!pb)
{
cerr<<"\n Invalid Matrix a or b!\n";
exit(1);
}
if(pa->iMaxy!=pb->iMaxx)
{
cerr<<"\n Cannot multiply Matrix a with b! \n";
exit(1);
}
int ix,iy,iz;
Matrix c(pa->iMaxx,pb->iMaxy);
for(ix=0;ix<pa->iMaxx;ix++)
for(iy=0;iy<pa->iMaxy;iy++)
{
c.pMatrix[ix][iy]=0;
for(iz=0;iz<pa->iMaxy;iz++)
{
c.pMatrix[ix][iy]+=pa->pMatrix[ix][iz]*pb->pMatrix[iz][iy];
}
}
return c;
}
Matrix Mul(Matrix &a,Matrix &b)
{
if(a.iMaxx!=b.iMaxy)
{
cerr<<"\n Cannot multiply Matrix a with b! \n";
return a;
}
int ix,iy,iz;
Matrix c(a.iMaxx,b.iMaxy);
for(ix=0;ix<a.iMaxx;ix++)
for(iy=0;iy<b.iMaxy;iy++)
{
c.pMatrix[ix][iy]=0;
for(iz=0;iz<a.iMaxy;iz++)
{
c.pMatrix[ix][iy]+=a.pMatrix[ix][iz]*b.pMatrix[iz][iy];
}
}
return c;
}
int main()
{
Matrix a(2,2);
cout<<"Input Matrix a[2][2]:\n";
a.Input();
a.Print();
Matrix b(2,3);
cout<<"\n Input matrix b[2][3]:\n";
b.Input();
b.Print();
//用以下三种矩阵乘积的函数分别测试时,
//需要测试何种方式,只需将相应的注释代码去掉即可。
/*
//测试矩阵的乘积(传值方式)
Matrix Mul(Matrix a,Matrix b);
cout<<"\n 传值方式Multiply Matrix a with b:";
Matrix c =Mul(a,b);
c.Print();
*/
/*
//测试矩阵的乘积(引用方式)
Matrix Mul(Matrix &a,Matrix &b);
cout<<"\n 引用方式Multiply Matrix a with b:";
Matrix d =Mul(a,b);
d.Print();
*/
/*
//测试矩阵的乘积(传地址方式)
Matrix Mul(Matrix *pa,Matrix *pb);
cout<<"\n 传地址方式Multiply Matrix a with b:";
Matrix e =Mul(&a,&b);
e.Print();
*/
//测试矩阵转置
cout<<"\n Recerse of Matrix b[2][3]:";
Matrix f=Rotate(b);
f.Print();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -