1
题目难度: 难
题目内容:
Screen类:
与作业【2】要求完全相同。
如果你的作业【2】顺利通过,那么你可以直接使用作业【2】中Screen类的代码
MyRectangle类:
MyRectangle 代表的是一个矩形。我们用矩形左上角和右下角两个顶点的(x,y)坐标来表示它
1. MyRectangle类中的数据域有一个唯一与Screen类有关的成员,其类型为 Screen* 类型
- Screen* screen_;
2. MyRectangle类的带参构造函数接受5个参数,其中前4个是整型参数
1)按照顺序,整型参数分别为矩形的左上顶点的x1、y1坐标,以及右下顶点的x2、y2坐标。(在构造函数中,不检查坐标有效性,也就是说,哪怕坐标出现负值,也不理会它。而是在后面的Draw函数中再做有效性检查)
2)按照顺序,第5个参数为Screen类的对象指针
- //带参构造函数原型声明
- MyRectangle::MyRectangle(int x1, int y1, int x2, int y2, Screen* screen);
3. MyRectangle类的默认构造函数将【左上----右下】对角线两个点的坐标均设置为原点坐标(0,0)
- //默认构造函数原型声明
- MyRectangle::MyRectangle();
4. MyRectangle类的所有构造函数均应使用cout输出字符串“myrectangle”并换行(使用cout::endl)
5. MyRectangle类中应提供setCoordinations()用于设置对角线的左侧及右侧顶点坐标;该函数共有4个形式参数。这些参数的含义及类型与“带参构造函数”的前4个参数相同。该函数将形式参数的值拷贝到类的私有数据域中。
6. MyRectangle类中应提供setScreen(Screen& screen)用于设置该类的实例所对应的Screen对象;
1)也就是说,setScreen函数会将引用参数 screen 这个对象的地址赋给MyRectangle类中的私有成员 screen_。
2)要注意:私有成员 screen_ 是对象指针类型,而setScreen的函数参数 screen 是对象引用类型
3)所以,必须要取 screen 的地址,然后将该地址赋值给私有成员 screen_
4)函数返回值类型由你自己决定
注: 如果你学有余力,可以尝试在这一步中,将函数原型变为 setScreen(const Screen& screen),尝试解决编译错误(提示:需要修改Screen类)
7. MyRectangle类的Draw()函数应检查坐标的有效性,确保矩形的顶点坐标是合理的、在前述屏幕的宽和高范围内是可见的(矩形框与屏幕框重合算是不可见、不合理);
1)如果上述坐标不合理,则在Draw()中用cout输出“invalid myrectangle”然后换行(用std::endl);
2)如果上述坐标合理,则在Draw()中用cout输出矩形的左上顶点的x、y坐标以及矩形的宽度和高度(一共4个数值,任意两个相邻数值间以1个空格分隔;第4个数值后面没有空格),然后换行(用std::endl)
8. 如有必要,则增加其他数据成员及函数成员
main() 函数:
需使用如下main()函数(不得更改)
- int main() {
- int width, height;
- cin >> width >> height;
- Screen screen (width, height);
- int leftX, leftY, rightX, rightY;
- cin >> leftX >> leftY >> rightX >> rightY;
- MyRectangle myRectangle1 (leftX, leftY, rightX, rightY, &screen);
- MyRectangle* myRectangles = new MyRectangle[2];
- myRectangles[1].setCoordinations(10, 300, 700, 500);
- myRectangles[1].setScreen(screen);
- myRectangle1.Draw();
- for (int i = 0; i < 2; i++) {
- myRectangles[i].setScreen(screen);
- (myRectangles+i) -> Draw();
- }
- delete [] myRectangles;
- #ifdef DEBUG
- std::cin.get();
- #endif
- return 0;
- }
输入格式:
空格分隔的整数
输出格式:
字符串
或者
空格分隔的整数
输入样例:
800 600
30 20 300 200
输出样例:
screen
myrectangle
myrectangle
myrectangle
30 20 270 180
invalid myrectangle
10 300 690 200
#include <iostream>
using namespace std;
class Screen
{
public:
int getWidth();
int getHeight();
int setWidth(int width); //return width
int setHeight(int height); //return height
public:
Screen(int width, int height);//有参构造函数
Screen();//Screen类的默认构造函数将屏幕宽和高分别设置为640和480
private:
int width_;//1. Screen类有两个私有的int型数据成员,分别代表屏幕的宽和高
int height_;//1. Screen类有两个私有的int型数据成员,分别代表屏幕的宽和高
private:
void exitWhenInvalidScreen(int width, int height);//检测屏幕的宽与高是否 符合逻辑
};
int Screen::getWidth()
{
return width_;
}
int Screen::getHeight()
{
return height_;
}
int Screen::setWidth(int width) //return width
{
width_ = width;
return width;
}
int Screen::setHeight(int height) //return height
{
height_ = height;
return height;
}
Screen::Screen(int width, int height)//有参构造函数
{
exitWhenInvalidScreen(width, height);//检测屏幕的宽与高是否 符合逻辑
std::cout << "screen" << std::endl;//Screen类的所有构造函数均应输出字符串“screen”并换行
width_ = width;
height_ = height;
}
Screen::Screen()//Screen类的默认构造函数将屏幕宽和高分别设置为640和480
{
std::cout << "screen" << std::endl;//Screen类的所有构造函数均应输出字符串“screen”并换行
width_ = 640;
height_ = 480;
}
void Screen::exitWhenInvalidScreen(int width, int height)//检测屏幕的宽与高是否 符合逻辑
{
if (width <= 0 || height <= 0)//2)宽度和高度必须大于0像素(不能等于0像素)
{
std::cout << "invalid screen size";//3)如果宽或者高不满足上述任一条件,则整个程序仅仅输出字符串"invalid screen size",然后退出程序
exit(0);
}
if (width > 1000 || height > 1000)//1)宽度和高度均不得大于1000像素(可以等于1000像素)
{
std::cout << "invalid screen size";//3)如果宽或者高不满足上述任一条件,则整个程序仅仅输出字符串"invalid screen size",然后退出程序
exit(0);
}
}
class MyRectangle//MyRectangle 代表的是一个矩形。我们用矩形左上角和右下角两个顶点的(x,y)坐标来表示它
{
public:
//带参构造函数原型声明
MyRectangle(int x1, int y1, int x2, int y2, Screen* screen);//2. MyRectangle类的带参构造函数接受5个参数,其中前4个是整型参数
//默认构造函数原型声明
MyRectangle();//3. MyRectangle类的默认构造函数将【左上----右下】对角线两个点的坐标均设置为原点坐标(0,0)
void setCoordinations(int x1, int y1, int x2, int y2);//5. MyRectangle类中应提供setCoordinations()用于设置对角线的左侧及右侧顶点坐标
void setScreen(Screen& screen);//6. MyRectangle类中应提供setScreen(Screen& screen)用于设置该类的实例所对应的Screen对象
void Draw();//7. MyRectangle类的Draw()函数应检查坐标的有效性
private:
int x1_;
int y1_;
int x2_;
int y2_;
Screen* screen_;//1. MyRectangle类中的数据域有一个唯一与Screen类有关的成员,其类型为 Screen* 类型
};
//带参构造函数原型声明
MyRectangle::MyRectangle(int x1, int y1, int x2, int y2, Screen* screen)//2. MyRectangle类的带参构造函数接受5个参数,其中前4个是整型参数
{
std::cout << "myrectangle" << std::endl;//4. MyRectangle类的所有构造函数均应使用cout输出字符串“myrectangle”并换行(使用cout::endl)
x1_ = x1;
y1_ = y1;
x2_ = x2;
y2_ = y2;
screen_ = screen;
}
//默认构造函数原型声明
MyRectangle::MyRectangle()//3. MyRectangle类的默认构造函数将【左上----右下】对角线两个点的坐标均设置为原点坐标(0,0)
{
std::cout << "myrectangle" << std::endl;//4. MyRectangle类的所有构造函数均应使用cout输出字符串“myrectangle”并换行(使用cout::endl)
x1_ = 0;
y1_ = 0;
x2_ = 0;
y2_ = 0;
}
void MyRectangle::setCoordinations(int x1, int y1, int x2, int y2)//5. MyRectangle类中应提供setCoordinations()用于设置对角线的左侧及右侧顶点坐标
{
x1_ = x1;
y1_ = y1;
x2_ = x2;
y2_ = y2;
}
void MyRectangle::setScreen(Screen& screen)//6. MyRectangle类中应提供setScreen(Screen& screen)用于设置该类的实例所对应的Screen对象
{
screen_ = &screen;
}
void MyRectangle::Draw()//7. MyRectangle类的Draw()函数应检查坐标的有效性
{
if ((x1_ > 0) && (x1_ < x2_) && (x2_ < screen_->getWidth()))
{
}
else
{
std::cout << "invalid myrectangle" << std::endl;
return;
}
if ((y1_ > 0) && (y1_ < y2_) && (y2_ < screen_->getHeight()))
{
}
else
{
std::cout << "invalid myrectangle" << std::endl;
return;
}
std::cout << x1_ << " " << y1_ << " " << x2_ - x1_ << " " << y2_ - y1_ << std::endl;
}
int main() {
int width, height;
cin >> width >> height;
Screen screen(width, height);
int leftX, leftY, rightX, rightY;
cin >> leftX >> leftY >> rightX >> rightY;
MyRectangle myRectangle1(leftX, leftY, rightX, rightY, &screen);
MyRectangle* myRectangles = new MyRectangle[2];
myRectangles[1].setCoordinations(10, 300, 700, 500);
myRectangles[1].setScreen(screen);
myRectangle1.Draw();
for (int i = 0; i < 2; i++) {
myRectangles[i].setScreen(screen);
(myRectangles + i)->Draw();
}
delete[] myRectangles;
#ifdef DEBUG
std::cin.get();
#endif
return 0;
}