实验
3
对象数组与对象指针
1
.实验目的
(1)
掌握数组与指针的定义与使用方法。
(2)
理解数组与指针的存储分配与表示。
(3)
学习向函数传递数组的方法。
(4)
学习用指针和引用向函数传递参数。
(5)
学习静态数据成员和静态成员函数的使用。
(6)
理解友元与友元函数的作用与使用方法。
2
.实验基本要求
(1)
设计一个矩阵类
Matrix(
矩阵由二维数组实现
)
,有分配空间和对矩阵赋值的功能。
(2)
练习将这个矩阵类的对象作为参数传送到函数
Mul()
,用普通、指针和引用三种方法实现,并要注意这三种方式的区别。
①直接传送:
Mul(Matrix a
,
Matrix b)
。实际上只是传送值,在函数中针对对象的任何修改均不影响该对象本身。
②指针传送:
Mul(Matrix *pa
,
Matrix *pb)
。要注意指针的级数。
③引用传送:
Mul(Matrix & a
,
Matrix & b)
。这种调用将影响参数的实际值。
(3)
将
Mul()
函数实现:完成对传送的两个
Matrix
对象的相乘运算。下面给出矩阵相乘的算法:
①矩阵
a[i][j]
与矩阵
b[x][y]
相乘,条件是
j==x
。
②乘积是一个新的矩阵
c[i][y]
,其中
c[i][y]
的值是∑
(a[i][k]* b[k][y])
,其中
K
=
0,l,…,j
(4)
在
Matrix
类中定义一个静态数据成员,记录当前的所有
Matrix
对象的数量。
(5)
定义一个友元函数实现转置的功能。转置是指将数组中
a[i][j]
与
a[j] [i]
的值对调。
3
.实验基本步骤
(1)
建立一个工程。在工程中定义一个
Matrix
类,在构造函数中根据参数创建数据成员:一个二维数组。提示:用构造函数记录二维数组的大小
(unsigned int x
,
unsigned int y)
。类中实际定义的二维数组的数据成员是一个指针
(
二级指针
)
,
int **pMatrix
。
在构造函数中根据传送的参数为这个二维数组分配空间:
pMatrix
=
newint[x][y]
。
(2)
设计成员函数,完成对数组的赋值的功能。本例中定义的成员函数为
SetValue(unsigned int x
,
unsigned int y
,
int value)
。
(3)
参考以上的说明,以常用三种方式实现向
Mul()
函数传送参数,并返回矩阵相乘的结果。
(4)
在类中定义一个静态的数据成员
ObjectAliveNo
,记录当前共有几个
Matrix
类的对象。实现方法:可以在对象的构造函数中向该数据成员报告
(
使静态数据成员加
1)
;在析构函数中也向该数据成员报告
(
使静态数据成员减
1)
。并要注意,在程序开始时,给这个静态数据成员赋初值。
(5)
在
Matrix
类中定义一个友元函数,使其具有对
Matrix
类的对象内的数组进行转置的功能。
#include
<
iostream
>
using
namespace
std;
class
Matrix
{
private
:
int
rows,columns;
public
:
int
**
pMatrix;
Matrix(
int
rows,
int
columns);
Matrix(Matrix
&
);
~
Matrix();
int
GetRows();
int
GetColumns();
void
SetValue();
void
Mul(Matrix
&
a,Matrix
&
b);
}
;
int
Matrix::GetRows()
{
return
rows;}
;
int
Matrix::GetColumns()
{
return
columns;}
;
//
构造函数
Matrix::Matrix(
int
x,
int
y)
{
rows
=
x;
columns
=
y;
pMatrix
=
new
int
*
[x];
for
(
int
i
=
0
; i
<
x; i
++
)
pMatrix[i]
=
new
int
[y];
}
//
析构函数
Matrix::
~
Matrix()
{
for
(
int
i
=
0
;i
<
columns;i
++
)
delete []pMatrix[i];
delete[] pMatrix;
}
//
赋值函数
void
Matrix::SetValue()
{
int
i,j,value;
for
( i
=
0
; i
<
rows; i
++
)
{
for
( j
=
0
; j
<
columns; j
++
)
{
cout
<<
"
第
"
<<
i
<<
"
行
"
;
cout
<<
"
第
"
<<
j
<<
"
列:
"
;
cin
>>
value;
cout
<<
endl;
pMatrix[i][j]
=
value;
}
}
}
//
拷贝构造函数
Matrix::Matrix(Matrix
&
M)
{
for
(
int
i
=
0
; i
<
M.rows; i
++
)
for
(
int
j
=
0
; j
<
M.columns; j
++
)
pMatrix[i][j]
=
M.pMatrix[i][j];
/**/
///
这样对么?
}
void
Matrix::Mul( Matrix
&
a, Matrix
&
b)
{
Matrix c(a.GetRows(),b.GetColumns());
int
temp
=
0
;
for
(
int
ai
=
0
;ai
<
a.GetRows();ai
++
)
{
for
(
int
bj
=
0
;bj
<
b.GetColumns();bj
++
)
{
for
(
int
aj
=
0
;aj
<
a.GetColumns();aj
++
)
temp
=
temp
+
a.pMatrix[ai][aj]
*
b.pMatrix[aj][bj];
c.pMatrix[ai][bj]
=
temp;
temp
=
0
;
}
}
for
(
int
i
=
0
;i
<
c.GetRows();i
++
)
{
//
输出相乘后的矩阵
cout
<<
'
\n
'
;
for
(
int
j
=
0
;j
<
c.GetColumns();j
++
)
cout
<<
c.pMatrix[i][j]
<<
"
"
;
}
}
//
主函数
int
main()
{
Matrix Ma(
2
,
2
),Mb(
2
,
2
);
Ma.SetValue();
Mb.SetValue();
for
(
int
i
=
0
;i
<
Ma.GetRows();i
++
)
{
cout
<<
'
\n
'
;
for
(
int
j
=
0
;j
<
Ma.GetColumns();j
++
)
cout
<<
Ma.pMatrix[i][j]
<<
"
"
;
}
cout
<<
endl;
Matrix Mc(
2
,
2
);
Mc.Mul(Ma,Mb);
/**/
/*
for(int i=0;i<Mc.GetRows();i++)
{
cout<<'\n';
for(int j=0;j<Mc.GetColumns();j++)
cout<<Mc.pMatrix[i][j]<<" ";
}
*/
return
0
;
}
posted on 2006-04-03 16:21
华剑缘 阅读(1357)
评论(0) 编辑 收藏 引用