zoukankan      html  css  js  c++  java
  • 网易云课堂_C++程序设计入门(上)_第4单元:物以类聚 – 对象和类_第4单元作业【3】- 在线编程(难度:难)

    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.   
    6.   int leftX, leftY, rightX, rightY;
    7.   cin >> leftX >> leftY >> rightX >> rightY;
    8.   MyRectangle myRectangle1 (leftX, leftY, rightX, rightY, &screen);
    9.   MyRectangle* myRectangles = new MyRectangle[2];
    10.   
    11.   myRectangles[1].setCoordinations(10, 300, 700, 500);
    12.   myRectangles[1].setScreen(screen);
    13.     
    14.   myRectangle1.Draw();
    15.   for (int i = 0; i < 2; i++) {
    16.     myRectangles[i].setScreen(screen);
    17.     (myRectangles+i) -> Draw();
    18.   }
    19.     
    20.   delete [] myRectangles;
    21.    
    22. #ifdef DEBUG
    23.   std::cin.get();
    24. #endif
    25.   return 0;
    26. }

    输入格式:

    空格分隔的整数

    输出格式:

    字符串

    或者

    空格分隔的整数

    输入样例:

    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;
    }
    
  • 相关阅读:
    电力三维基础信息平台
    基于三维GIS技术的输电线路地理信息系统的设计与实现
    linux学习笔记(1)
    linux学习笔记(4)
    linux学习笔记(8)
    linux学习笔记(6)
    linux学习笔记(3)
    linux 学习笔记(2)
    linux学习笔记(7)
    ASCII码表完整版
  • 原文地址:https://www.cnblogs.com/denggelin/p/5882256.html
Copyright © 2011-2022 走看看