题目描述
假设坐标采用二维平面坐标。
定义点类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());
}