#include #include #include #include class Figure { public: virtual std::string Name() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; }; class Rect : public Figure { public: explicit Rect(int width, int height): width_(width), height_(height) {} std::string Name() override { return "RECT"; } double Perimeter() override { return (width_ + height_) * 2; } double Area() override { return width_ * height_; } private: int width_, height_; }; class Triangle : public Figure { public: explicit Triangle(int a, int b, int c): a_(a), b_(b), c_(c) {} std::string Name() override { return "TRIANGLE"; } double Perimeter() override { return a_ + b_ + c_; } double Area() override { double p = Perimeter() / 2; return sqrt(p * (p - a_) * (p - b_) * (p - c_)); } private: int a_, b_, c_; }; class Circle : public Figure { public: explicit Circle(int rad): r_(rad) {} std::string Name() override { return "CIRCLE"; } double Perimeter() override { const double PI = 3.14; return 2 * PI * r_; } double Area() override { const double PI = 3.14; return PI * r_ * r_; } private: int r_; }; std::shared_ptr
CreateFigure(std::istringstream& param) { std::string type; param >> type; std::shared_ptr
result; if (type == "RECT") { std::string w, h; param >> w >> h; return std::make_shared(std::stoi(w), std::stoi(h)); } if (type == "TRIANGLE") { std::string a, b, c; param >> a >> b >> c; return std::make_shared(std::stoi(a), std::stoi(b), std::stoi(c)); } std::string r; param >> r; return std::make_shared(std::stoi(r)); }