cpp练习:矩形关系(运算符重载)

题目描述

假设坐标采用二维平面坐标。
定义点类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个矩形,计算面积,判断矩形的关系。主函数如下,不可修改。

int main()
{
    int t, x1, x2, y1, y2;
    cin >> t;
    while (t--)
    {
        // 矩形1的左上角、右下角
        cin >> x1 >> y1 >> x2 >> y2;
        CRectangle rect1(x1, y1, x2, y2);
        // 矩形2的左上角、右下角
        cin >> x1 >> y1 >> x2 >> y2;
        CRectangle rect2(x1, y1, x2, y2);
        // 输出矩形1的坐标及面积
        cout << "矩形1:" << rect1 << " " << (int)rect1 << endl;
        // 输出矩形2的坐标及面积
        cout << "矩形2:" << rect2 << " " << (int)rect2 << endl;
        if (rect1 == rect2)
        {
            cout << "矩形1和矩形2相等" << endl;
        }
        else if (rect2 > rect1)
        {
            cout << "矩形2包含矩形1" << endl;
        }
        else if (rect1 > rect2)
        {
            cout << "矩形1包含矩形2" << endl;
        }
        else if (rect1 * rect2)
        {
            cout << "矩形1和矩形2相交" << endl;
        }
        else
        {
            cout << "矩形1和矩形2不相交" << endl;
        }
        cout << endl;
    }
    return 0;
}

输入

测试次数
每组测试数据如下:
矩形1的左上角、右下角坐标
矩形2的左上角、右下角坐标

输出

每组测试数据输出如下,中间以空行分隔:
矩形1的坐标和面积(具体格式见样例)
矩形2的坐标和面积(具体格式见样例)
矩形1和矩形2的关系(矩形1包含矩形2、矩形2包含矩形1、矩形1和矩阵2相等、矩形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 {
private:
	int x, y;
public:
	CPoint(int x = 0,int y=0):x(x),y(y){}

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

class CRectangle {
private:
	CPoint leftp, rightp;
public:
	CRectangle(int x1,int y1,int x2,int y2)
		:leftp(x1,y1),rightp(x2,y2){}

	// 重载大于运算符,用于判断一个点是否在矩形内
	bool operator>(CPoint& p) {
		return(p.getX() >= leftp.getX() && p.getX() <= rightp.getX()
			&& p.getY() <= leftp.getY() && p.getY() >= rightp.getY());
	}

	// 重载大于运算符,用于判断一个矩形是否包含另一个矩形
	bool operator > (CRectangle& rect) {
		return(*this > rect.leftp && *this > rect.rightp);
	}

	// 重载等于运算符,用于判断两个矩形是否相等
	bool operator==(CRectangle& rect) {
		return(leftp.getX() == rect.leftp.getX()
			&& leftp.getY() == rect.leftp.getY()
			&& rightp.getX() == rect.rightp.getX()
			&& rightp.getY() == rect.rightp.getY());
	}

	// 重载乘法运算符,用于判断两个矩形是否相交
	bool operator*(CRectangle& rect) {
		return !(rect.rightp.getX() < leftp.getX() ||
			rect.leftp.getX() > rightp.getX() ||
			rect.rightp.getY() > leftp.getY() ||
			rect.leftp.getY() < rightp.getY());
	}

	// 类型转换运算符,将矩形对象转换为其面积
	operator int() {
		return(rightp.getX() - leftp.getX()) * (leftp.getY() - rightp.getY());
	}

	// 重载输出运算符,用于输出矩形的左上角和右下角坐标
	friend ostream& operator<<(ostream& os, CRectangle& rect) {
		os << rect.leftp.getX() << ' ' << rect.leftp.getY() << ' '
			<< rect.rightp.getX() << ' ' << rect.rightp.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);
		// 输出矩形1的坐标及面积
		cout << "矩形1:" << rect1 << " " << (int)rect1 << endl;
		// 输出矩形2的坐标及面积
		cout << "矩形2:" << rect2 << " " << (int)rect2 << endl;
		if (rect1 == rect2)
		{
			cout << "矩形1和矩形2相等" << endl;
		}
		else if (rect2 > rect1)
		{
			cout << "矩形2包含矩形1" << endl;
		}
		else if (rect1 > rect2)
		{
			cout << "矩形1包含矩形2" << endl;
		}
		else if (rect1 * rect2)
		{
			cout << "矩形1和矩形2相交" << endl;
		}
		else
		{
			cout << "矩形1和矩形2不相交" << endl;
		}
		cout << endl;
	}
	return 0;
}

笔记

运算符重载:
operator> 运算符在判断矩形是否包含另一个矩形时,利用了包含点的逻辑,巧妙地实现了两个矩形之间的包含关系判断。

// 重载大于运算符,用于判断一个点是否在矩形内
bool operator>(CPoint& p) {
	return(p.getX() >= leftp.getX() && p.getX() <= rightp.getX()
		&& p.getY() <= leftp.getY() && p.getY() >= rightp.getY());
}

// 重载大于运算符,用于判断一个矩形是否包含另一个矩形
bool operator > (CRectangle& rect) {
	return(*this > rect.leftp && *this > rect.rightp);
}

类型转换:
将 CRectangle 对象转换为 int 类型,返回矩形的面积。这个转换运算符使得在 cout 语句中能够直接打印矩形的面积。

operator int() {
	return(rightp.getX() - leftp.getX()) * (leftp.getY() - rightp.getY());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值