#pragma once #include #include #include double pi = 3.14; class Figure { public: virtual std::string Name() const = 0; virtual double Area() const = 0; virtual double Perimeter() const = 0; }; class Triangle : public Figure { public: double a; double b; double c; Triangle(double a1, double b1, double c1) : a(a1), b(b1), c(c1) {} std::string Name() const { return "TRIANGLE"; } 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 { public: double w; double h; Rect(double w1, double h1) : w(w1), h(h1) {} string Name() const { return "RECT"; } double Area() const { return w * h; } double Perimeter() const { return 2 * (w + h); } }; class Circle : public Figure { public: double r; explicit Circle(double r1) : r(r1) {} string Name() const { return "CIRCLE"; } double Area() const { return pi * pow(r, 2); } double Perimeter() const { return 2 * pi * r; } }; std::shared_ptr
CreateFigure(std::istringstream& is) { string kof; is >> kof; if (kof == "RECT") { double w, h; is >> w >> h; return make_shared(w, h); } else if (kof == "TRIANGLE") { double a; double b; double c; is >> a >> b >> c; return make_shared(a, b, c); } else { double r; is >> r; return make_shared(r); } }