1

在本单元作业【1】和作业【2】的基础上,创建一个MyRectangle类,并在main函数中创建类的实例。(10分)

题目难度: 难

题目内容:

Screen类:

与作业【2】要求完全相同。

如果你的作业【2】顺利通过,那么你可以直接使用作业【2】中Screen类的代码

MyRectangle类:

MyRectangle 代表的是一个矩形。我们用矩形左上角和右下角两个顶点的(x,y)坐标来表示它

1. MyRectangle类中的数据域有一个唯一与Screen类有关的成员,其类型为 Screen* 类型

  1. Screen* screen_;

2. MyRectangle类的带参构造函数接受5个参数,其中前4个是整型参数

1)按照顺序,整型参数分别为矩形的左上顶点的x1、y1坐标,以及右下顶点的x2、y2坐标。(在构造函数中,不检查坐标有效性,也就是说,哪怕坐标出现负值,也不理会它。而是在后面的Draw函数中再做有效性检查)

2)按照顺序,第5个参数为Screen类的对象指针

  1. //带参构造函数原型声明
  2. MyRectangle::MyRectangle(int x1, int y1, int x2, int y2, Screen* screen);

3. MyRectangle类的默认构造函数将【左上----右下】对角线两个点的坐标均设置为原点坐标(0,0)

  1. //默认构造函数原型声明
  2. 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()函数(不得更改)

  1. int main() {
  2. int width, height;
  3. cin >> width >> height;
  4. Screen  screen (width, height);
  5. int leftX, leftY, rightX, rightY;
  6. cin >> leftX >> leftY >> rightX >> rightY;
  7. MyRectangle myRectangle1 (leftX, leftY, rightX, rightY, &screen);
  8. MyRectangle* myRectangles = new MyRectangle[2];
  9. myRectangles[1].setCoordinations(10, 300, 700, 500);
  10. myRectangles[1].setScreen(screen);
  11. myRectangle1.Draw();
  12. for (int i = 0; i < 2; i++) {
  13. myRectangles[i].setScreen(screen);
  14. (myRectangles+i) -> Draw();
  15. }
  16. delete [] myRectangles;
  17. #ifdef DEBUG
  18. std::cin.get();
  19. #endif
  20. return 0;
  21. }

输入格式:

空格分隔的整数

输出格式:

字符串

或者

空格分隔的整数

输入样例:

800 600

30 20 300 200

输出样例:

screen

myrectangle

myrectangle

myrectangle

30 20 270 180

invalid myrectangle

10 300 690 200

时间限制:500ms内存限制:32000kb
 
#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;
}

网易云课堂_C++程序设计入门(上)_第4单元:物以类聚 – 对象和类_第4单元作业【3】- 在线编程(难度:难)的更多相关文章

  1. 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)

    第6单元作业[2]- 在线编程(难度:中) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...

  2. 网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【4】 - 在线编程(难度:难)

    第5单元作业[4] - 在线编程(难度:难) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系 ...

  3. 网易云课堂_C++程序设计入门(上)_第1单元:C++概览_第1单元作业 - 写代码 - 互评 (难度:易)

    第1单元作业 - 写代码 - 互评 (难度:易) 查看帮助 返回   提交作业(截止时间已过) 完成并提交作业     作业批改 互评训练   互评作业   自评作业     成绩公布 查看成绩 温 ...

  4. 网易云课堂_C++程序设计入门(上)_第2单元:丹青画松石– EGE图形库

    第2节:一个简单的EGE程序 #ifndef _GRAPHICS_H_ #define _GRAPHICS_H_ #ifndef __cplusplus #error You must use C++ ...

  5. 网易云课堂_C++程序设计入门(上)_第3单元:更上一层楼 – 超越C的语法_第3单元作业【3】-在线编程(难度:中;10分)

    1 本题要求实现两个重载的swap函数,每个swap函数都可交换3个整数a,b,c的值.将a的值存入b,b的值存入c,c的值存入a, 并且返回三个整数中最大的数的值.例如a,b,c的值为1,2,3,则 ...

  6. 网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目

    期末考试在线编程题目 返回考试   本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间 ...

  7. 网易云课堂_C++程序设计入门(下)_第7单元:出入虽同趣,所向各有宜 – 文件输入和输出_第7单元 - 作业2:编程互评

    第7单元 - 作业2:编程互评 查看帮助 返回   提交作业(剩余10天) 完成并提交作业     作业批改 互评训练   互评作业   自评作业     成绩公布 查看成绩   由于在线编程不支持 ...

  8. 网易云课堂_C++程序设计入门(下)_第11单元:工欲善其事必先利其器 - STL简介_第11单元 - 单元作业2:OJ编程 - list 与 deque

    第11单元 - 单元作业2:OJ编程 - list 与 deque 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之 ...

  9. 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

    第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

随机推荐

  1. Ice笔记-利用Ice::Application类简化Ice应用

    Ice笔记-利用Ice::Application类简化Ice应用 作者:ydogg,转载请申明. 在编写Ice相关应用时,无论是Client还是Server端,都必须进行一些必要的动作,如:Ice通信 ...

  2. POJ1988 并查集的使用

    Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 21157   Accepted: 7395 Ca ...

  3. HBase 6、用Phoenix Java api操作HBase

    开发环境准备:eclipse3.5.jdk1.7.window8.hadoop2.2.0.hbase0.98.0.2.phoenix4.3.0 1.从集群拷贝以下文件:core-site.xml.hb ...

  4. iOS Get方式带中文不能请求网络

    今天发现一个蛋疼的问题,使用ASIHTTPRequest Get方式请求数据时候带中文,iOS客户端不能正确进行网络请求. NSURL *url = [NSURL URLWithString:@htt ...

  5. UML图总结

    UML叙述 UML文档仅仅是设计与开发人员采用UML语言进行系统分析与设计的结果,并没有给出如何进行开发和采用何种开发流程,同样也不指导如何进行面向对象设计. UML文档描述了面向对象分析与设计的结果 ...

  6. 巧用DISPLAY_AWR函数与dba_hist_sqlstat结合查询SQL语句在指定节点指定时间范围内的历史执行计划

    1.问题        通过调用dbms_xplan包中DISPLAY_AWR函数(DBMS_XPLAN.DISPLAY_AWR)可以从AWR数据中查看到SQL语句的历史执行计划,但是,DISPLAY ...

  7. html image -- data:image/png;base64

    1,  data:image/png;base64 <!DOCTYPE HTML> <html> <head> <meta http-equiv=" ...

  8. squid服务搭建

    Squid配置1. 什么是squidsquid可以做代理也可以做缓存squid缓存不仅可以节省宝贵的带宽资源,也可以大大降低服务器的I/O.  squid不仅可以做正向代理,又可以做反向代理. 正向代 ...

  9. background小结

    CSS背景属性Background详解 本文详解了CSS的背景属性Background,包括CSS3中新增的背景属性.如果你是个CSS初学者,还可以查看之前介绍的CSS浮动属性和CSS透明属性详解. ...

  10. 使用XE5-PACTH破解Delphi-XE5时,出现检查文件大小失败的解决方法

    今天给自己的64位Win7电脑破解Delphi-XE5时,一直出现检查bds.exe尺寸大小失败的错误提示. 网上查了很久,Csdn上给了个破解的bds.exe,本人一直没什么Csdn积分,没得下,所 ...