#pragma once #include #include #include class Figure { public: virtual std::string Name() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; }; class Rect : public Figure { public: double h, w; std::string name = "RECT"; Rect(double width, double height) { h = height; w = width; } std::string Name() { return name; } double Perimeter() { return (h + w) * 2; } double Area() { return h * w; } }; class Triangle : public Figure { public: double a, b, c; std::string name = "TRIANGLE";; Triangle(double a_t, double b_t, double c_t) { a = a_t; b = b_t; c = c_t; } std::string Name() { return name; } double Perimeter() { return a + b + c; } double Area() { double pol_p = Perimeter() / 2; return sqrt(pol_p * (pol_p - a) * (pol_p - b) * (pol_p - c)); } }; class Circle : public Figure { public: double r; const double pi = 3.14; std::string name = "CIRCLE"; explicit Circle(double rad) { r = rad; } std::string Name() { return name; } double Perimeter() { return 2 * pi * r; } double Area() { return pi * pow(r, 2); } }; std::shared_ptr
CreateFigure(std::istringstream &is) { std::string figure; int64_t a, b, c; is >> figure; if (figure == "RECT") { is >> a >> b; return std::make_shared(a, b); } else if (figure == "TRIANGLE") { is >> a >> b >> c; return std::make_shared(a, b, c); } else if (figure == "CIRCLE") { is >> a; return std::make_shared(a); } else { return std::make_shared(0, 0); } }