定义一个矩阵类Matrix,实现矩阵的加、减、转置和相乘。该类的矩阵是动态分配内存建立的动态数组。
【要求】① 完成运算符“-”的重载函数设计;
② 设计重载“+=”、“-=”和“*=”的函数;
③ 将“=”重载函数改为如下形式:
Matrix& operator =(Matrix &m);
④ 有了拷贝构造函数,重载“+”等的友元函数可以不用返回引用,
函数体内的对象temp也不再需要是static的。试按此修改程序。
⑤ 对矩阵类重载插入运算符“<<”
⑥ 在主函数中对新设计的函数进行测试。
#include
#include
class Matrix
{
int *p; //指向矩阵的指针
int row,col; //矩阵的行列数
public:
Matrix(){row=col=0;p=NULL; } //缺省的构造函数
Matrix(int,int);
void show(); //输出数组(矩阵)元素值
void operator =(Matrix &m);
friend Matrix& operator +(Matrix &m1,Matrix &m2);
friend Matrix& operator -(Matrix &m1,Matrix &m2);
friend Matrix& operator *(Matrix &m1,Matrix &m2);
void transf(); //矩阵转置
~Matrix() //析构函数
{
if (p) { delete []p;p=NULL; }
}
};
Matrix::Matrix(int m,int n) //构造函数
{
int i,j,x;
if (m<=0 || n<=0)
{
cout<<"矩阵行、列数错误!\n";
row=col=0;
p=NULL;
}
else
{
row=m;col=n;
p=new int[row*col];
cout<<"创建矩阵对象:\n";
for (i=0;i {
cout<<"请输入矩阵的第"< for (j=0;j cin>>x,*(p+i*col+j)=x;
}
}
}
void Matrix::show() //输出矩阵元素值
{
int i,j;
if (p)
{
for (i=0;i {
for (j=0;j cout<<*(p+i*col+j)<<'\t';
cout< }
}
}
void Matrix::operator =(Matrix &m)
{
if (p) delete[] p;
int i,k=m.row*m.col;
if (k>0)
{
p=new int[k];
for (i=0;i p[i]=m.p[i];
row=m.row;
col=m.col;
}
else { p=NULL;row=col=0; }
}
Matrix& operator +(Matrix &m1,Matrix &m2)
{
static Matrix temp;
if (m1.row!=m2.row || m1.col!=m2.col)
{
cout<<"两矩阵不能相加!\n";
return temp;
}
int i,k=m1.row*m1.col;
if (k>0)
{
int *s;
s=new int[k];
for(i=0;i s[i]=m1.p[i]+m2.p[i];
temp.p=s;
temp.row=m1.row;
temp.col=m1.col;
return temp;
}
return temp;
}
Matrix& operator -(Matrix &m1,Matrix &m2)
{
//请完成此函数的设计
return m1; //此行不对,必须改
}
Matrix& operator *(Matrix &m1,Matrix &m2)//矩阵相乘
{
static Matrix t;
int i,j,m,n,k;
m=m1.row;
n=m2.col;
if (m1.col!=m2.row)
{
cout<<"两矩阵不能相乘!\n";
return t;
}
if (m*n>0)
{
int *s=new int[m*n];
for (i=0;i for (j=0;j {
*(s+i*n+j)=0;
for (k=0;k *(s+i*n+j)+=*(m1.p+i*m1.col+k)**(m2.p+k*n+j);
}
t.p=s;t.row=m;t.col=n;
return t;
}
return t;
}
void Matrix::transf()
{
if (p)
{
int i,j,temp,*t;
if (row==col) //方阵,就地转置
{
for (i=0;i for (j=0;j<=i;j++)
{
temp=*(p+i*col+j); //p[i][j]
*(p+i*col+j)=*(p+j*col+i);
*(p+j*col+i)=temp;
}
}
else //非方阵的处理
{
t=new int[row*col];
for(i=0;i for (j=0;j *(t+j*row+i)=*(p+i*col+j);
i=row;row=col;col=i;
delete []p;
p=t;
}
}
}
void main(void)
{
Matrix m1(2,3),m2(2,3),m3(3,3),m4;
cout<<"\n矩阵m1:\n";
m1.show();
cout<<"\n矩阵m2:\n";
m2.show();
cout<<"\n矩阵m3:\n";
m3.show();
m4=m3;
cout<<"\n执行m4=m3后,矩阵m4:\n";
m4.show();
m4=m1+m2;
cout<<"\n矩阵m4=m1+m2:\n";
m4.show();
m4=m1*m3;
cout<<"\n矩阵m4=m1*m3:\n";
m4.show();
m1.transf();
cout<<"\n转置后的矩阵m1:\n";
m1.show();
m3.transf();
cout<<"\n转置后的矩阵m3:\n";
m3.show();
}
/*程序运行示例:
创建矩阵对象:
请输入矩阵的第1行3个元素值:1 2 3
请输入矩阵的第2行3个元素值:4 5 6
创建矩阵对象:
请输入矩阵的第1行3个元素值:1 2 3
请输入矩阵的第2行3个元素值:4 5 6
创建矩阵对象:
请输入矩阵的第1行3个元素值:1 2 3
请输入矩阵的第2行3个元素值:4 5 6
请输入矩阵的第3行3个元素值:7 8 9
矩阵m1:
1 2 3
4 5 6
矩阵m2:
1 2 3
4 5 6
矩阵m3:
1 2 3
4 5 6
7 8 9
执行m4=m3后,矩阵m4:
1 2 3
4 5 6
7 8 9
矩阵m4=m1+m2:
2 4 6
8 10 12
矩阵m4=m1*m3:
30 36 42
66 81 96
转置后的矩阵m1:
1 4
2 5
3 6
转置后的矩阵m3:
1 4 7
2 5 8
3 6 9
*/
--------------------next---------------------
阅读(990) | 评论(0) | 转发(0) |