#include #include #include #include #include #include #include #include using std::string; using std::make_shared; class Figure { public: explicit Figure(const string& type) : t(type) {} virtual string Name() const = 0; virtual double Perimeter() const = 0; virtual double Area() const = 0; const string t; }; class Triangle : public Figure { private: int a, b, c; public: Triangle(const int& a, const int& b, const int& c) : Figure("TRIANGLE"), a(a), b(b), c(c) {} string Name() const { return t; } double Perimeter() const { return a + b + c; } double Area() const { double p = Perimeter() / 2; return sqrt(p * (p - a) * (p - b) * (p - c)); } }; class Rect : public Figure { private: int a, b; public: Rect(const int& a, const int& b) : Figure("RECT"), a(a), b(b) {} string Name() const { return t; } double Perimeter() const { return 2 * (a + b); } double Area() const { return a * b; } }; class Circle : public Figure { private: int r; public: explicit Circle(const int& r) : Figure("CIRCLE"), r(r) {} string Name() const { return t; } double Perimeter() const { return r * 6.28; } double Area() const { return r * r * 3.14; } }; std::shared_ptr
CreateFigure(std::istringstream& stream) { string figure; stream >> figure; if (figure == "TRIANGLE") { int a, b, c; stream >> a >> b >> c; std::shared_ptr
res; res = make_shared(a, b, c); return res; } else if (figure == "RECT") { int a, b; stream >> a >> b; std::shared_ptr
res; res = make_shared(a, b); return res; } else if (figure == "CIRCLE") { int r; stream >> r; std::shared_ptr
res; res = make_shared(r); return res; } else { std::shared_ptr
res; return res; } }