【问题描述】
编写一个程序,定义一个安全、动态二维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; 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(); 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;
if (m1.b != m2.a) { return 1; } else { for (int i = 0; i < m1.a; ++i) { temp.clear(); for (int j = 0; j < m2.b; ++j) { temp_n = 0; 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; }
|