【东华大学oj】27 面积和(面向对象)

27 面积和

作者: Turbo时间限制: 1S章节: 多态

问题描述 :

实验目的:多态的应用

实验内容:

定义类Point,包括:

两个私有数据成员:int x, int y,它们分别表示一个点的x和y座标。

构造函数:

Point(int x, int y),即传两个参数,构造一个点对象。

注意,本题要求Point类不得定义缺省构造函数,也就是只定义以上所说的构造函数。

虚成员函数:

double getArea ()    //获取该图形的面积

bool isIn(Point p)   //判断传入的点是否在该图形之内(不包括边界),如果在内部返回true,否则返回false

定义一个Rectangle类,继承Point类,基类对象的x和y表示长方形左上角的坐标。

Rectangle类包括:

两个私有数据成员:int width, int height,它们分别表示长方形的横向的宽度和纵向的高度。

构造函数:

Rectangle(int x, int y, int width, int height)。

成员函数:

 实现double getArea ()  和bool isIn(Point p) 函数。

定义一个Circle类,继承Point类,基类对象的x和y表示圆心的坐标。

Circle类包括:

一个私有数据成员: double r,表示圆的半径。

构造函数:

Circle(double x, double y, double r)

 成员函数:

 实现double getArea ()  和bool isIn(Point p) 函数。计算圆的面积时,PI=3.14。

使用以下main函数测试。测试内容为:首先输入一个点p的信息,然后输入若干长方形及圆形,Point类型的ppArr指针数组里的元素指向这些对象。最后遍历ppArr数组,判断p位于哪些对象之内,然后计算这些对象的面积之和并输出。

main函数如下:

int main()

{

   int topLeftX, topLeftY, width, height;

   int px, py;

   int op, radius, count=0;

   Point *ppArr[100];  //声明一个指针数组,最多存放100个Point对象的指针

   double totalArea = 0;

   cin>>px>>py;

   Point p(px, py);

   while (cin >> op)

    {

        switch (op)

        {

            case 1:

            {//往数组里添加元素,指向长方形对象

             cin>>topLeftX>>topLeftY>>width>>height;

                 ppArr[count++] = new Rectangle(topLeftX, topLeftY, width, height);

                 break;

            }

            case 2:

            {//往数组里添加元素,指向圆形对象

                 cin>>px>>py>>radius;

                 ppArr[count++] = new Circle(px, py, radius);

                 break;

            }

        }

    }

    for(int i=0; i<count; i++)

    {//遍历ppArr数组,判断p位于哪些对象之内,然后计算这些对象的面积之和

        if (ppArr[i]-> isIn(p))

            totalArea += ppArr[i]->getArea();

    }

    cout<<totalArea<<endl;

    return 0;

}

输入说明 :

第一行输入两个整数,表示点p的x和y座标

其后若干行,每行为一个对象的信息,具体如下:

首先输入一个整数1或2,

如果输入1,表示本行后面将输入4个整数,分别表示长方形左上角x和y座标及长方形宽度、高度。

如果输入2,表示本行后面将输入3个整数,分别表示圆形的圆心x和y座标及半径。

所有输入均为整数,中间以空格分隔。

输出说明 :

输出计算结果,类型为一个double型数。

#include <iostream>
#include <iomanip>
#include <cstring>
#define PI 3.14
using namespace std;

class Point
{
private :
    int x,y;
public :
    Point(int x,int y):x(x),y(y) {}

    int getx()
    {
        return x;
    }
    int gety()
    {
        return y;
    }
virtual double getArea ()
{

}
virtual bool isIn(Point p){};
};

class Rectangle:public Point
{
private:
    int width;int height;
public:
    Rectangle(int x, int y, int width, int height):width(width),height(height),Point(x,y)
    {

    }


    double getArea( )
    {
        int area=width*height;
        return area;

    }

    bool isIn(Point p)
    {

        if(p.getx()<this->getx()+width&&p.getx()>this->getx()&&p.gety()>this->gety()&&p.gety()<this->gety()+height)
        {
            return true;

        }
        else return false;
    }

};

class Circle:public Point
{
private:
    double r;
public:
    Circle(double x,double y,double r):Point(x,y),r(r) {}
    double getArea()
    {
        double area=PI*r*r;
        return area;
    }
    bool isIn(Point p)
    {
        double len=p.getx()*p.getx()+p.gety()*p.gety();
        if(len<r*r) return true;
        else return false;
    }
};

int main()

{

    int topLeftX, topLeftY, width, height;

    int px, py;

    int op, radius, count=0;

    Point *ppArr[100];  //声明一个指针数组,最多存放100个Point对象的指针

    double totalArea = 0;



    cin>>px>>py;

    Point p(px, py);



    while (cin >> op)

    {

        switch (op)

        {

        case 1:

        {
            //往数组里添加元素,指向长方形对象

            cin>>topLeftX>>topLeftY>>width>>height;

            ppArr[count++] = new Rectangle(topLeftX, topLeftY, width, height);

            break;

        }

        case 2:

        {
            //往数组里添加元素,指向圆形对象

            cin>>px>>py>>radius;

            ppArr[count++] = new Circle(px, py, radius);

            break;

        }

        }

    }



    for(int i=0; i<count; i++)

    {
        //遍历ppArr数组,判断p位于哪些对象之内,然后计算这些对象的面积之和

        if (ppArr[i]-> isIn(p))

            totalArea += ppArr[i]->getArea();

    }

    cout<<totalArea<<endl;

    return 0;

}

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ixll625

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值