#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>
#include <vector>
#define PI 3.1416
using namespace std;
class Shape//定义抽象基类
{
public:
Shape() {}//构造函数
virtual double GetArea() const =0;//纯虚函数
virtual ~Shape() {}//虚析构函数
};
double TotalArea(const vector<Shape *> & p)//求面积和
{
double total=0;
for(int i=0;i<p.size();i++)
total+=p[i]->GetArea();
return total;
}
class Circle : public Shape//圆继承基类shape
{
private:
double radius;//半径
public:
Circle(double r) : radius(r) {}//构造函数,初始化半径
virtual double GetArea() const//返回圆的面积
{
return radius * radius * PI;
}
};
class Rectangle : public Shape//长方形继承基类shape
{
private:
double height;//定义长
double width;//定义宽
public:
Rectangle(double h, double w) : height(h), width(w) {}//构造函数,初始化长和宽
virtual double GetArea() const//返回长方形的面积
{
return height * width;
}
};
class Triangle : public Shape//三角形继承基类shape
{
private:
double a, b, c;//定义边长
double p;//海伦公式
public:
Triangle(double A, double B, double C) : a(A), b(B), c(C)//构造函数,初始化边长
{
p = (a + b + c) / 2;
}
virtual double GetArea() const//返回三角形的面积
{
return sqrt(p * (p - a) * (p - b) * (p - c));
}
};
int main()
{
string order;//预处理命令
vector<Shape * > p;//抽象基类指针
double radius, height, width, a, b, c;//定义基本变量
while (cin >> order) {
char Ord;//实际命令
if (order == "circle")
Ord = 'c';
if (order == "rectangle")
Ord = 'r';
if (order == "triangle")
Ord = 't';
switch (Ord) {
case 'c':
cin >> radius;
p.push_back(new Circle(radius));
break;
case 'r':
cin >> height >> width;
p.push_back(new Rectangle(height, width));
break;
case 't':
cin >> a >> b >> c;
p.push_back(new Triangle(a, b, c));
break;
default:
break;
}
}
cout.precision(4);
cout << fixed << TotalArea(p) << endl;
for(int i=0;i<p.size();i++)
delete p[i];
return 0;
}
10-06
10-06
10-06