矩阵类运算(运算符重载)

244 阅读3分钟

​​持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

题目描述

利用重载运算符,实现矩阵的加法,减法。

请重载加减运算符并自定义矩阵类完成相应的操作

输入

第一行为测试数据数

对于每组测试数据

第一行为矩阵的行数和列数

接下来分别为两个矩阵的各个元素

输出

输出矩阵的和与差

输入样例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();
	}
}