#include #include #include #include #include #include #include const float PI = 3.14; class Figure { public: explicit Figure(const std::string &name) : name_(name) {} virtual std::string Name() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; const std::string name_; }; class Rect : public Figure { public: Rect(const std::string &name, const double &width, const double &height) : Figure(name) , width_(width) , height_(height) {} std::string Name() override { return name_; } double Perimeter() override { return (width_ + height_) * 2; } double Area() override { return width_ * height_; } private: const double width_; const double height_; }; class Triangle : public Figure { public: Triangle(const std::string &name, double a, double b, double c) : Figure(name) , a(a) , b(b) , c(c) {} std::string Name() override { return name_; } double Perimeter() override { return a + b + c; } double Area() override { double p = this->Perimeter() / 2; return sqrt(p * (p - a) * (p - b) * (p - c)); } private: double a, b, c; }; class Circle : public Figure { public: Circle(const std::string &name, double r) : Figure(name), radius(r) {} std::string Name() override { return name_; } double Perimeter() override { return 2 * radius * PI; } double Area() override { return PI * radius * radius; } private: double radius; }; std::shared_ptr
CreateFigure(std::istringstream &is) { std::string figure_name; is >> figure_name; if (figure_name == "RECT") { double w, h; is >> w >> h; return std::make_shared(figure_name, w, h); } else if (figure_name == "TRIANGLE") { double a, b, c; is >> a >> b >> c; return std::make_shared(figure_name, a, b, c); } else { double r; is >> r; return std::make_shared(figure_name, r); } }