目录
题目描述
利用重载运算符,实现矩阵的加法,减法。
请重载加减运算符并自定义矩阵类完成相应的操作
输入
第一行为测试数据数
对于每组测试数据
第一行为矩阵的行数和列数
接下来分别为两个矩阵的各个元素
输出
输出矩阵的和与差
输入样例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矩阵元素。
AC代码1
#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();
}
}
AC代码2
#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();
}
}