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;
    }
    
  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/denggelin/p/5882256.html
Copyright © 2011-2022 走看看