Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2341980
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:03:12

定义一个矩阵类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) |
给主人留下些什么吧!~~