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

目录

题目描述

思路分析

AC代码1

AC代码2


题目描述

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

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

输入

第一行为测试数据数

对于每组测试数据

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

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

输出

输出矩阵的和与差

输入样例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();
	}
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员萌芽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值