24、面積和
問題描述 :
實驗目的:多型的應用
實驗內容:
定義類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;
}