1187:矩形关系(运算符重载)

这是一个C++编程问题,要求定义一个`CPoint`类表示点,一个`CRectangle`类表示矩形,并实现矩形类中包括构造函数、运算符重载(大于、等于、乘号、类型转换)以及其他方法。问题提供了主函数的框架,要求编写矩形类的相关成员函数,处理矩形的位置关系,面积计算以及输出。样例输入和输出展示了矩形坐标、面积以及它们之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 C: 矩形关系(运算符重载)
时间限制: 1 Sec 内存限制: 128 MB
提交: 231 解决: 88
[提交][状态][讨论版]
题目描述
假设坐标采用二维平面坐标。

定义点类CPoint,包含属性x,y(整型)。方法有:带参构造函数,getX,getY分别返回点的x坐标,y坐标。

定义矩形类CRectangle,包含属性:矩形的左上角坐标leftPoint,右下角坐标rightPoint。类中方法有:

1)带参构造函数,初始化矩形的左上角、右下角

2)重载>运算符,参数为CPoint点对象,假设为p,若p在矩形内,返回true,否则返回false。

3)重载>运算符,第一个矩形若包含第二个矩形(部分边界可以相等),返回true,否则返回false。(要求该函数调用2)实现)

4)重载==运算符,判断两个矩形是否一致,返回true或false。

5)重载*运算符,判断两个矩形是否有重叠部分,返回true或false。

6)重载类型转换运算符,计算矩形的面积并返回,面积是整型。

7)重载《运算符,输出矩形的两个角坐标,具体格式见样例。

输入2个矩形,计算面积,判断矩形的关系。主函数如下,不可修改。

可根据需要,添加构造函数和析构函数。

输入
测试次数

每组测试数据如下:

矩形1的左上角、右下角坐标

矩形2的左上角、右下角坐标

输出
每组测试数据输出如下,中间以空行分隔:

矩形1的坐标和面积(具体格式见样例)

矩形2的坐标和面积(具体格式见样例)

矩形1和矩形2的关系(矩形1包含矩形2、矩形2包含矩形1、矩形2和矩形1相等、矩形1和矩形2相交、矩形1和矩形2不相交)

样例输入
2
1 4 4 1
2 3 3 2
1 4 4 1
0 3 5 2
样例输出
矩形1:1 4 4 1 9
矩形2:2 3 3 2 1
矩形1包含矩形2

矩形1:1 4 4 1 9
矩形2:0 3 5 2 5
矩形1和矩形2相交
提示.

#include<iostream>
using namespace std;

class CPoint {
	int x, y;
public:
	CPoint() {};
	CPoint(int _x, int _y) : x(_x), y(_y) {};

	int getX() { return x; }
	int getY() { return y; }
};

class CRectangle {
	CPoint leftPoint, rightPoint;
public:
	CRectangle() {};
	CRectangle(int x1, int y1, int x2, int y2) : leftPoint(x1, y1), rightPoint(x2, y2) {};

	bool operator>(const CPoint& c) {
		return c.getY() >= rightPoint.getY() && c.getY() <= leftPoint.getY() && c.getX() >= leftPoint.getX() && c.getX() <= rightPoint.getX();
	}

	bool operator>(const CRectangle& c) {
		return c.leftPoint.getY() >= rightPoint.getY() && c.leftPoint.getY() <= leftPoint.getY() && c.leftPoint.getX() >= leftPoint.getX() && c.leftPoint.getX() <= rightPoint.getX() &&
			c.rightPoint.getY() >= rightPoint.getY() && c.rightPoint.getY() <= leftPoint.getY() && c.rightPoint.getX() >= leftPoint.getX() && c.rightPoint.getX() <= rightPoint.getX();
	}

	bool operator==(const CRectangle& obj) {
		return (leftPoint.getX() == obj.leftPoint.getX()) && (leftPoint.getY() == obj.leftPoint.getY()) && (rightPoint.getX() == obj.rightPoint.getX()) && (rightPoint.getY() == obj.rightPoint.getY());
	}

	bool operator*(const CRectangle& obj) {
		return (rightPoint.getX() >= obj.leftPoint.getX() && rightPoint.getX() <= obj.rightPoint.getX() && rightPoint.getY() >= obj.leftPoint.getY() && rightPoint.getY() <= obj.rightPoint.getY()) ||
			(leftPoint.getX() >= obj.leftPoint.getX() && leftPoint.getX() <= obj.rightPoint.getX() && leftPoint.getY() >= obj.leftPoint.getY() && leftPoint.getY() <= obj.rightPoint.getY());
	}

	operator int() {
		return (leftPoint.getY() - rightPoint.getY()) * (rightPoint.getX() - leftPoint.getX());
	}

	friend ostream& operator<<(ostream& os, const CRectangle& d);
};

ostream& operator<<(ostream& os, const CRectangle& d) {
	os << d.leftPoint.getX() << " " << d.leftPoint.getY() << " " << d.rightPoint.getX() << " " << d.rightPoint.getY();
	return os;
}

int main() {
	int t, x1, x2, y1, y2;
	cin >> t;
	while (t--) {
		cin >> x1 >> y1 >> x2 >> y2;
		CRectangle rect1(x1, y1, x2, y2);
		cin >> x1 >> y1 >> x2 >> y2;
		CRectangle rect2(x1, y1, x2, y2);
		cout << "矩形1:" << rect1 << " " << (int)rect1 << endl;
		cout << "矩形2:" << rect2 << " " << (int)rect2 << endl;

		if (rect1 == rect2)
			cout << "矩形1和矩形2相等" << endl;
		else if (rect1 > rect2)
			cout << "矩形1包含矩形2" << endl;
		else if (rect2 > rect1)
			cout << "矩形2包含矩形1" << endl;
		else if (rect1 * rect2)
			cout << "矩形1和矩形2相交" << endl;
		else
			cout << "矩形1和矩形2不相交" << endl;
		cout << endl;
	}
	return 0;
}

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谁的BUG最难改

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

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

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

打赏作者

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

抵扣说明:

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

余额充值