#include <string>
#include <cmath>
#include <memory>
using std::string;
using std::cout;
using std::vector;
using std::cin;
using std::endl;
using std::fixed;
class Figure {
public:
virtual string Name() const = 0;
virtual double Perimeter() const = 0;
virtual double Area() const = 0;
};
class Triangle : public Figure {
public:
Triangle(double a, double b, double c) : a_(a), b_(b), c_(c) {}
string Name() {
return "TRIANGLE";
}
double Perimeter() {
return a_ + b_ + c_;
}
double Area() {
return sqrt(Perimeter() / 2 * (Perimeter() / 2 - a_)
* (Perimeter() / 2 - b_) * (Perimeter() / 2 - c_));
}
private:
const double a_;
const double b_;
const double c_;
};
class Rect : public Figure {
public:
Rect(double width, double height) :
width_(width), height_(height) {}
string Name() {
return "RECT";
}
double Perimeter() {
return (width_ + height_) * 2;
}
double Area() {
return width_ * height_;
}
private:
const double width_;
const double height_;
};
class Circle : public Figure {
public:
Circle(double r) : r_(r) {}
string Name() {
return "CIRCLE";
}
double Perimeter() {
return 2 * 3.14 * r_;
}
double Area() {
return 3.14 * r_ * r_;
}
private:
const double r_;
};
std::shared_ptr<Figure> CreateFigure(std::istream& input) {
string name;
input >> name;
if (name == "RECT") {
double width, height;
input >> width >> height;
return std::make_shared<Rect>(width, height);
}
else if (name == "TRIANGLE") {
double a, b, c;
input >> a >> b >> c;
return std::make_shared<Triangle>(a, b, c);
}
else if (name == "CIRCLE") {
double r;
input >> r;
return std::make_shared<Circle>(r);
}
return 0;
}