Closed x10chenyilin closed 2 years ago
基本可行,注意几点
请细化题面后回复,最好给出样例输入输出
在线性代数中,我们学习了矩阵以及矩阵的一些运算规则。现在你需要完善下面的代码,实现一个整数矩阵类Matrix
,并实现矩阵的
6个功能。
Matrix.h
class Matrix {
private:
int** elem;
int col, row;
public:
Matrix();
Matrix(int _row, int _col);
~Matrix();
Matrix operator+(const Matrix&);
Matrix operator-(const Matrix&);
Matrix operator*(const int);
Matrix operator*(const Matrix&);
friend Matrix transpose(const Matrix&);
int* operator[](int) const;
friend ostream& operator<<(ostream&, const Matrix&);
friend istream& operator>>(istream&, Matrix&);
};
Matrix
类内有成员elem
,指向一个存放了矩阵元素的二维数组,elem[a][b]
代表矩阵第a行第b列的元素(指标从0开始);成员col
和row
记录了矩阵的行数和列数。
transpose
函数和重载的运算符实现了矩阵的运算和输入输出功能。其中,重载operator[]
实现形如matrix[a][b]
的下标访问只需要返回指向行数组的指针(即重载了第一个[]
)。
第一行包含一个正整数n
,表示接下来要输入的矩阵个数,矩阵的序号按输入次序从0开始递增。
对每个矩阵,第一行给出两个正整数r
和c
,表示这个矩阵的行数和列数,接下来r
行,每行c
个整数以空格隔开,表示这个矩阵的元素。
矩阵输入完成后,输入一个正整数m
,表示操作个数。
接下来m
行,每行包含一个字符串op
和若干个参数。
op
为+
时,参数有2个:opnd1
、opnd2
,表示将序号为opnd1
、opnd2
的两个矩阵相加。op
为-
时,参数有2个:opnd1
、opnd2
,表示用序号为opnd1
矩阵减去序号为opnd2
的矩阵。op
为*
时,参数有2个:opnd1
、opnd2
,表示用序号为opnd1
矩阵左乘序号为opnd2
的矩阵。op
为.*
时,参数有2个:opnd1
、opnd2
,表示序号为opnd1
矩阵数乘opnd2
。op
为t
时,参数有1个:opnd1
,表示求序号为opnd1
矩阵的转置。op
为[]
时,参数有3个:opnd1
、opnd2
、opnd3
,表示求序号为opnd1
矩阵的第opnd2
行、第opnd3
列的元素。op
为?
时,参数有1个:opnd1
,表示求序号为opnd1
的矩阵。对于所有要被执行的运算,保证输入是合法的。(例如加减法保证矩阵形状相同)
对每个运算符,输出得到的矩阵或元素。每个r
行c
列的的矩阵输出r
行,每行c
个元素以空格隔开。
3
3 3
0 8 1
8 6 7
2 3 -1
3 2
5 0
1 -6
9 -10
3 3
1 0 0
0 1 0
0 0 1
7
+ 0 2
- 2 0
* 0 1
.* 2 -6
t 1
[] 1 1 1
? 2
1 8 1
8 7 7
2 3 0
1 -8 -1
-8 -5 -7
-2 -3 2
17 -58
109 -106
4 -8
-6 0 0
0 -6 0
0 0 -6
5 1 9
0 -6 -10
-6
1 0 0
0 1 0
0 0 1
对于100%的数据,有$$2 \leq n \leq 10$$,$$1\leq r,c \leq 30$$,$$1 \leq m \leq 50 $$,所有元素和运算结果都在int
范围内。
时间限制:1s
空间限制:256MB
可以。对于乘法,请写明是矩阵乘法而不是逐元素乘法。然后每个操作都在输入格式部分强调一下参与运算矩阵的维度吧,保证运算合法。
请将完整题面、数据(包括数据生成文件)、judger和答案程序,自行测试通过。完成之后发到邮箱 huangfei382@163.com。对于编写judger有问题可在小教员群(或找助教)讨论
验收通过
知识点
类与对象、函数重载、运算符重载
题目描述
实现一个整数矩阵类Matrix,并通过运算符重载完成矩阵的
等功能。
再附加实现求转置的函数transpose()。(求逆和求行列式啥的可能有点难?)