【问题描述】

编写一个程序,定义一个安全、动态二维double型的数组类Matrix。

  • 实现Matrix table(row,col)定义row行col列的二维数组, row和col为正整数;
  • 实现table(i,j)访问table的第i行第j列的元素,行号和列号从0开始;
  • 实现Matrix的输入输出(>>、<<);
  • 实现矩阵加等、乘等运算(+=、=),例:Matrix& operator+=(const Matrix&); Matrix& operator=(const Matrix&);
  • 实现矩阵的赋值运算(=),例:Matrix& operator=(const Matrix&)。

【输入形式】

  • 第一行table1的行列值row1和col1,空格分隔;
  • 第二行table1的初始化值,共row1*col1个数据,空格分隔;
  • 第三行table2的行列值row2和col2,空格分隔;
  • 第四行table2的初始化值,共row2*col2个数据,空格分隔;

【输出形式】

  • Matrix的输出格式为row行col列, 数据空格分隔;
  • 若table1和table2不满足矩阵的加法和乘法运算规则,输出ERROR!;
  • 依次输出以下表达式的值,每个输出间隔一行;
  • table1(row1/2,col1/2);
  • table1 *= table2;
  • table1 += table2;
  • table1 = table2。

【样例输入1】

1
2
3
4
1 3
1 1 1
2 3
2 2 2 2 2 2

【样例输出1】

1
2
3
4
5
1
ERROR!
ERROR!
2 2 2
2 2 2

【样例输入2】

1
2
3
4
2 3
1 1 1 1 1 1
3 2
2 2 2 2 2 2

【样例输出2】

1
2
3
4
5
6
7
1
6 6
6 6
ERROR!
2 2
2 2
2 2

【样例输入3】

1
2
3
4
2 2
1 1 1 1
2 2
1 0 0 1

【样例输出3】

1
2
3
4
5
6
7
1
1 1
1 1
2 1
1 2
1 0
0 1

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include  <iostream>
#include <vector>
using namespace std;

class Matrix
{
public:
Matrix(int a, int b) : a(a), b(b) {}
Matrix() {}
vector<vector<double>> num; // 矩阵
int a, b; // a->行;b->列
friend istream &operator>>(istream &in, Matrix &m);
friend ostream &operator<<(ostream &out, Matrix &m);
int operator()();
friend int operator*=(Matrix& m1, Matrix& m2);
friend int operator+=(Matrix& m1, Matrix& m2);
Matrix& operator=(Matrix& m2);
};

istream &operator>>(istream &in, Matrix &x)
{
double num;
vector<double> temp;
in >> x.a >> x.b;
for (int i = 0; i < x.a; ++i)
{
temp.clear(); // 注意每输入一行应该清空temp
for (int j = 0; j < x.b; ++j)
{
in >> num;
temp.push_back(num);
}
x.num.push_back(temp);
}
return in;
}
ostream &operator<<(ostream &out, Matrix &x)
{
for (int i = 0; i < x.a; ++i)
{
for (int j = 0; j < x.b; ++j)
{
cout << x.num[i][j] << " ";
}
cout << endl;
}
return out;
}
int Matrix::operator()()
{
return num[a / 2][b / 2];
}
int operator*=(Matrix &m1, Matrix &m2)
{
double temp_n = 0;
vector<double> temp;
vector<vector<double>> num; // 暂存结果,防止破坏m1的数据

if (m1.b != m2.a) // 相乘条件:前一个矩阵的列数=后一个矩阵的行数
{
return 1; // 返回1表示无法执行
}
else
{
for (int i = 0; i < m1.a; ++i)
{
temp.clear(); // 注意每输入一行应该清空temp
for (int j = 0; j < m2.b; ++j)
{
temp_n = 0; // 注意每输入一个数字应该置零temp_n
for (int k = 0; k < m1.b; ++k)
temp_n += m1.num[i][k] * m2.num[k][j];
temp.push_back(temp_n);
}
num.push_back(temp);
}
}

m1.num.swap(num);
m1.b = m2.b; // 结果的行数就是前一个矩阵的行数,所以只需要修改列数即可
return 0;
}
int operator+=(Matrix &m1, Matrix &m2)
{
if (m1.a != m2.a || m1.b != m2.b)
return 1;
else
{
for (int i = 0; i < m1.a; ++i)
{
for (int j = 0; j < m1.b; ++j)
{
m1.num[i][j] += m2.num[i][j];
}
}
return 0;
}
}
Matrix& Matrix::operator=(Matrix &m2)
{
a = m2.a;
b = m2.b;
num.clear();
vector<double> temp;

for (int i = 0; i < a; ++i)
{
temp.clear();
for (int j = 0; j < b; ++j)
{
temp.push_back(m2.num[i][j]);
}
num.push_back(temp);
}
return *this;
}

int main()
{
Matrix m1, m2;
cin >> m1;
cin >> m2;

cout << m1() << endl;

if(!(m1 *= m2))
cout << m1;
else
cout << "ERROR!" << endl;

if (!(m1 += m2))
cout << m1;
else
cout << "ERROR!" << endl;

m1 = m2;
cout << m1;
return 0;
}