JianGuanTHU / UOJ_Offline

Offline test system for THUOOP
7 stars 0 forks source link

Proposal (第二次作业,矩阵运算) #14

Closed x10chenyilin closed 2 years ago

x10chenyilin commented 2 years ago

知识点

类与对象、函数重载、运算符重载

题目描述

实现一个整数矩阵类Matrix,并通过运算符重载完成矩阵的

  1. 数乘 (Matrix * int)
  2. 矩阵相加减 (Matrix ± Matrix)
  3. 矩阵相乘 (Matrix * Matrix)
  4. 下标访问元素(Matrix[a][b])
  5. 流输入输出 (cin >> Matrix & cout << Matrix)

等功能。

再附加实现求转置的函数transpose()。(求逆和求行列式啥的可能有点难?)

hzhwcmhf commented 2 years ago

基本可行,注意几点

  1. OOP作业主要目标是设计接口,算法实现不作为主要考点,所以求逆之类的算法可以不用,包括矩阵相乘如果和加减重复也可以只实现一个。
  2. matrix[a][b]访问需要有中间对象,这一点课上应该不会讲,所以在题面要有一定提示
  3. 矩阵内存的管理看起来比较复杂,需要进一步说明,需要同学们做到什么程度

请细化题面后回复,最好给出样例输入输出

x10chenyilin commented 2 years ago

题目描述

在线性代数中,我们学习了矩阵以及矩阵的一些运算规则。现在你需要完善下面的代码,实现一个整数矩阵类Matrix,并实现矩阵的

  1. 数乘
  2. 加减
  3. 下标访问元素
  4. 流输入输出
  5. 转置

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开始);成员colrow记录了矩阵的行数和列数。

transpose函数和重载的运算符实现了矩阵的运算和输入输出功能。其中,重载operator[]实现形如matrix[a][b]的下标访问只需要返回指向行数组的指针(即重载了第一个[])。

输入格式

第一行包含一个正整数n,表示接下来要输入的矩阵个数,矩阵的序号按输入次序从0开始递增。

对每个矩阵,第一行给出两个正整数rc,表示这个矩阵的行数和列数,接下来r行,每行c个整数以空格隔开,表示这个矩阵的元素。

矩阵输入完成后,输入一个正整数m,表示操作个数。

接下来m行,每行包含一个字符串op和若干个参数。

对于所有要被执行的运算,保证输入是合法的。(例如加减法保证矩阵形状相同)

输出格式

对每个运算符,输出得到的矩阵或元素。每个rc列的的矩阵输出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

hzhwcmhf commented 2 years ago

可以。对于乘法,请写明是矩阵乘法而不是逐元素乘法。然后每个操作都在输入格式部分强调一下参与运算矩阵的维度吧,保证运算合法。

请将完整题面、数据(包括数据生成文件)、judger和答案程序,自行测试通过。完成之后发到邮箱 huangfei382@163.com。对于编写judger有问题可在小教员群(或找助教)讨论

hzhwcmhf commented 2 years ago

验收通过