目录
利用重载运算符,实现矩阵的加法,减法。
请重载加减运算符并自定义矩阵类完成相应的操作
输入
第一行为测试数据数
对于每组测试数据
第一行为矩阵的行数和列数
接下来分别为两个矩阵的各个元素
输出
输出矩阵的和与差
输入样例1
2
4 5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
9 8 7 6 5
4 3 2 1 0
-1 5 6 9 1
2 0 2 1 6
4 5
9 8 7 6 5
4 3 2 1 0
-1 5 6 9 1
2 0 2 1 6
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
输出样例1
Add:
10 10 10 10 10
10 10 10 10 10
10 17 19 23 16
18 17 20 20 26
Minus:
-8 -6 -4 -2 0
2 4 6 8 10
12 7 7 5 14
14 17 16 18 14
-----------------
Add:
10 10 10 10 10
10 10 10 10 10
10 17 19 23 16
18 17 20 20 26
Minus:
8 6 4 2 0
-2 -4 -6 -8 -10
-12 -7 -7 -5 -14
-14 -17 -16 -18 -14
-----------------
先说一下我发现的问题,一个是原本是考虑到先定义a和b两个矩阵,然后定义矩阵c=a+b和c=a-b的,但如果要这样操作的话,必须重载赋值运算符=才可以,我的一些同学在这个时候会发现系统会说找不到匹配的赋值函数,有可能是没有加const在参数上,但我加了const还是运行不出正确结果,于是我觉得是涉及到内存问题而a+b没有返回具有地址的对象,而是仅仅返回一个值(后来发现是其他问题,并不是这个原因,a+b返回了一个对象,这个对象可以满足条件,即修改之后的AC代码1)。因此我换了一种方法,不去定义矩阵C,使用(a+b)和(a-b)的方法来替换c,如代码2,这样也不需要重载赋值运算符=,因为没有用上。
还有一个问题,就是我们创建矩阵元素必须得使用二级指针开辟内存了,因此原有的拷贝构造函数只是浅复制,我们必须重新定义一个拷贝构造函数来实现内存重新申请和copy矩阵元素。
- #include"iostream"
- #include"string"
- using namespace std;
- class matrix
- {
- int n, m;
- int** p=NULL;
- public:
- matrix(int n, int m) :n(n), m(m) {
- int i;
- p = new int* [n];
- for (i = 0; i < n; i++)
- p[i] = new int[m];
- }
- matrix(const matrix& a)
- {
- n = a.n;
- m = a.m;
- int i, j;
- p = new int* [n];
- for (i = 0; i < n; i++)
- p[i] = new int[m];
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- p[i][j] = a.p[i][j];
-
- }
- ~matrix()
- {
- if (p)
- {
- for (int i = 0; i < n; i++)
- delete[] p[i];
- delete[] p;
- }
- }
- void setmatrix()
- {
- int i, j;
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- cin>>p[i][j];
- }
- matrix operator=(const matrix &a)
- {
- int i, j;
- n = a.n;
- m = a.m;
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- p[i][j] = a.p[i][j];
- return *this;
- }
- matrix operator+(const matrix& b)
- {
- cout << "Add:" << endl;
- matrix c(*this);
- int i, j;
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- c.p[i][j] = p[i][j] + b.p[i][j];
- return c;
- }
- matrix operator-(const matrix& b)
- {
- cout << "Minus:" << endl;
- matrix c(*this);
- int i, j;
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- c.p[i][j] = p[i][j] - b.p[i][j];
- return c;
- }
- void display()
- {
- int i, j;
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < m ; j++)
- cout << p[i][j] << ' ';
- cout << endl;
- }
- }
- void showline() { cout << "-----------------" << endl; }
- };
-
- int main()
- {
- int t, n, m;
- cin >> t;
- while (t--)
- {
- cin >> n >> m;
- matrix a(n, m);
- a.setmatrix();
- matrix b(n, m);
- b.setmatrix();
- matrix c=a+b;
- c.display();
- c=a-b;
- c.display();
- c.showline();
- }
- }
- #include"iostream"
- #include"string"
- using namespace std;
- class matrix
- {
- int n, m;
- int** p=NULL;
- public:
- matrix(int n, int m) :n(n), m(m) {
- int i, j;
- p = new int* [n];
- for (i = 0; i < n; i++)
- p[i] = new int[m];
- }
- matrix(const matrix& a)
- {
- n = a.n;
- m = a.m;
- int i, j;
- p = new int* [n];
- for (i = 0; i < n; i++)
- p[i] = new int[m];
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- p[i][j] = a.p[i][j];
-
- }
- ~matrix()
- {
- if (p)
- {
- for (int i = 0; i < n; i++)
- delete[] p[i];
- delete[] p;
- }
- }
- void setmatrix()
- {
- int i, j;
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- cin>>p[i][j];
- }
- matrix operator+(const matrix& b)
- {
- cout << "Add:" << endl;
- matrix c(*this);
- int i, j;
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- c.p[i][j] = p[i][j] + b.p[i][j];
- return c;
- }
- matrix operator-(const matrix& b)
- {
- cout << "Minus:" << endl;
- matrix c(*this);
- int i, j;
- for (i = 0; i < n; i++)
- for (j = 0; j < m; j++)
- c.p[i][j] = p[i][j] - b.p[i][j];
- return c;
- }
- void display()
- {
- int i, j;
- for (i = 0; i < n; i++)
- {
- for (j = 0; j < m ; j++)
- cout << p[i][j] << ' ';
- cout << endl;
- }
- }
- void showline() { cout << "-----------------" << endl; }
- };
-
- int main()
- {
- int t, n, m;
- cin >> t;
- while (t--)
- {
- cin >> n >> m;
- matrix a(n, m);
- a.setmatrix();
- matrix b(n, m);
- b.setmatrix();
- (a+b).display();
- (a-b).display();
- a.showline();
- }
- }