#include <string>
#include <memory>
#include <cmath>
#include <sstream>
class Figure {
public:
virtual std::string Name() const = 0;
virtual double Perimeter() const = 0;
virtual double Area() const = 0;
};
class Triangle : public Figure {
public:
double a;
double b;
double c;
explicit Triangle(int a, int b, int c) : a(a), b(b), c(c) {
}
virtual const std::string Name() {return "Triangle";}
virtual const double Perimetet() {return (a + b + c);}
virtual const double Area() {
double p = (a + b + c) / 2;
double area = sqrt(p * (p - a) * (p - b) * (p - c));
return area;
}
};
class Rect : public Figure {
public:
double width;
double height;
explicit Rect(int width, int height) : width(width), height(height) {
}
virtual const std::string Name() {return "Rect";}
virtual const double Perimetet() {return (2 * (width + height));}
virtual const double Area() {return (width * height);}
};
class Circle : public Figure {
public:
double r;
explicit Circle(int r) : r(r) {
}
virtual const std::string Name() {return "Circle";}
virtual const double Perimetet() {return (6.28 * r);}
virtual const double Area() {return (3.14 + pow(r, 2));}
};
template <typename T>
T CreateFigure(std::istringstream& is) {
std::string command;
is >> command;
if (command == "RECT") {
double width;
double height;
is >> width >> height;
return std::make_shared<Rect>(width, height);
}
if (command == "TRIANGLE") {
double a;
double b;
double c;
is >> a >> b >> c;
return std::make_shared<Triangle>(a, b, c);
}
if (command == "CIRCLE") {
double r;
is >> r;
return std::make_shared<Circle>(r);
}
}