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;
}