1. 设计一个矩阵类Matrix(矩阵由二维数组实现),有分配空间和对矩阵赋值的功能。
2. 练习将这个矩阵类的对象作为参数传送到函数Mul(),用普通,指针和引用三种方法实现,并要注意这三种方式的区别。
(1) 直接传送:Mul(Matrix a,Matrix b)。实际上只是传送值,在函数中针对对象的任何修改均不影响该对象本身。
(2) 指针传送:Mul(Matrix *pa,Matrix *pb)。要注意指针的级数。
(3) 引用传送:Mul(Matrix &a,Matrix &b)这种调用将影响参数的实际值。
3. 将Mul函数实现:完成对传送的两个Martix对象的相乘运算。下面给出矩阵相乘的算法:
矩阵a[I][j]与矩阵b[x][y]相乘,条件是j==x。
乘积是一个新的矩阵c[I][j],其中c[I][j]的值是
∑(a[I][k]*b[k][y])
其中k=0,1,2,……,j。
4. 在Matrix类中定义一个静态数据成员,记录当前所有Matrix对象的数量。
5. 定义一个友元函数实现转制功能。转制是指将数组中a[i][j]与a[j][i]的值对调。
#include<iostream.h>
#include<stdlib.h>
class matrix{
public:
static int count;
int **array,**tarray,**c;
int m,n;
public:
matrix();
~matrix();
friend void t(const matrix &a,int *tarray);
void display();
};
int matrix::count=0;
matrix::matrix()
{
int i,j;
cout<<"输入初始化的矩阵对象 阶数m行,n列: ";
cin>> m>>n;
cout<<"输入矩阵数据:\n";
tarray=new (int* [n] ) ;
c=new (int* [m] );
array=new (int* [m] );
for(i=0;i<n;i++)
{
tarray[i]=new int[m];
c[i]=new int[n];
array[i]=new int[n];
}
if( array!=NULL)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cin>> array[i][j];
cout<<"\n";
}
count++;
}
else
{ cerr<<"申请内存失败!";
exit(1);
}
}
matrix::~matrix()
{
for(int i=0;i<count;i++)
{ delete []array ;
delete []tarray;
delete []c;
}
}
void t(const matrix &a,int **tarray,int &n,int &m)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
tarray[i][j]=a.array[j][i];
}
void matrix::display()
{
int i,j;
cout<<"显示矩阵乘积:\n";
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<c[i][j];
cout<<"\n";
}
cout<<"显示转置矩阵:\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<tarray[i][j];
cout<<"\n";
}
}
//矩阵乘积
int** mul(matrix& a,matrix& b )
{
if(a.m!=b.n)
{
cerr<<"错误矩阵,无法相乘!\n";
exit(1);
}
else
{
int i,j,k,temp=0;
for(i=0;i<a.m;i++)
{
for(j=0;j<a.n;j++)
{
for(k=0;k<a.n;k++)
temp+=a.array[i][k]*b.array[k][j];
a.c[i][j]=temp;
}
}
return a.c;
}
}
int main()
{
matrix a,b;
t(a,a.tarray,a.n,a.m);
int **carray=mul(a,b);
a.display();
return 0;
}