1. 程式人生 > 其它 >24、面積和

24、面積和

技術標籤:DHUのOJc++面向物件系列學習筆記+題解

問題描述 :

實驗目的:多型的應用

實驗內容:

定義類Point,包括:

兩個私有資料成員:intx,inty,它們分別表示一個點的x和y座標。

建構函式:

Point(intx,inty),即傳兩個引數,構造一個點物件。

注意,本題要求Point類不得定義預設建構函式,也就是隻定義以上所說的建構函式。

虛成員函式:

doublegetArea()//獲取該圖形的面積

boolisIn(Pointp)//判斷傳入的點是否在該圖形之內(不包括邊界),如果在內部返回true,否則返回false

定義一個Rectangle類,繼承Point類,基類物件的x和y表示長方形左上角的座標。

Rectangle類包括:

兩個私有資料成員:intwidth,intheight,它們分別表示長方形的橫向的寬度和縱向的高度。

建構函式:

Rectangle(intx,inty,intwidth,intheight)。

成員函式:

實現doublegetArea()和boolisIn(Pointp)函式。

定義一個Circle類,繼承Point類,基類物件的x和y表示圓心的座標。

Circle類包括:

一個私有資料成員:doubler,表示圓的半徑。

建構函式:

Circle(doublex,doubley,doubler)

成員函式:

實現doublegetArea()和boolisIn(Pointp)函式。計算圓的面積時,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型數。

輸入範例 :

1 1
1 0 0 2 2
2 1 0 2
1 1 0 3 4
2 0 0 1

輸出範例 :

16.56

解題程式碼:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#include<set>
using namespace std;
class Point{
private:
    int x;
    int y;
public:
    Point(int a,int b)
    {
        x=a;
        y=b;
    }
    friend class Rectangle;
    friend class Circle;
    virtual bool isIn(Point &p){};
    virtual double getArea(){};
};
class Rectangle:public Point{
private:
    int width,height;
public:
    Rectangle(int x, int y, int width, int height):Point(x,y)
    {
        Rectangle::width=width;
        Rectangle::height=height;
    }
    virtual double getArea ()
    {
        return width*(double)height;
    }
    virtual bool isIn(Point &p)
    {
        bool ok1=0,ok2=0;
        if(p.x>x && p.x<x+width)
            ok1=1;
        else ok1=0;
        if(p.y>y && p.y<y+height)
            ok2=1;
        else ok2=0;
        return (ok1&&ok2);
    }
};
class Circle:public Point{
private:
    double r;
public:
    Circle(double x, double y, double r):Point(x,y)
    {
        Circle::r=r;
    }
    virtual double getArea ()
    {
        return 3.14*r*r;
    }
    virtual bool isIn(Point &p)
    {
        bool ok1=0,ok2=0;
        if(((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y))<=r*r)
           ok1=1;
           else
            ok1=0;
        return ok1;
    }
};
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;

}