#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) {
}
std::string Name() override {return "Triangle";}
double Perimetet() override {return (a + b + c);}
double Area() override {
double p = (a + b + c) / 2;
double area = sqrt(p * (p - a) * (p - b) * (p - c));
return area;
}
};
class Rect : public Figure {
private:
double width;
double height;
public:
explicit Rect(double w, double h) : width(w), height(h) {
}
std::string Name() override {return "Rect";}
double Perimetet() override {return (2 * (width + height));}
double Area() override {return (width * height);}
};
class Circle : public Figure {
public:
double r;
explicit Circle(int r) : r(r) {
}
std::string Name() override {return "Circle";}
double Perimetet() override {return (6.28 * r);}
double Area() override {return (3.14 + pow(r, 2));}
};
// template <typename T>
std::shared_ptr<Rect> 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);
/*}
return 0;
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);
}*/
}