#include #include #include using std::string; using std::cout; using std::vector; using std::cin; using std::endl; using std::fixed; class Figure { public: virtual string Name() const = 0; virtual double Perimeter() const = 0; virtual double Area() const = 0; }; class Triangle : public Figure { public: Triangle(double a, double b, double c) : a_(a), b_(b), c_(c) {} string Name() { return "TRIANGLE"; } double Perimeter() { return a_ + b_ + c_; } double Area() { return sqrt(Perimeter() / 2 * (Perimeter() / 2 - a_) * (Perimeter() / 2 - b_) * (Perimeter() / 2 - c_)); } private: const double a_; const double b_; const double c_; }; class Rect : public Figure { public: Rect(double width, double height) : width_(width), height_(height) {} string Name() { return "RECT"; } double Perimeter() { return (width_ + height_) * 2; } double Area() { return width_ * height_; } private: const double width_; const double height_; }; class Circle : public Figure { public: explicit Circle(double r) : r_(r) {} string Name() { return "CIRCLE"; } double Perimeter() { return 2 * 3.14 * r_; } double Area() { return 3.14 * r_ * r_; } private: const double r_; }; std::shared_ptr
CreateFigure(std::istream& input) { string name; input >> name; if (name == "RECT") { double width, height; input >> width >> height; return std::make_shared(width, height); } else if (name == "TRIANGLE") { double a, b, c; input >> a >> b >> c; return std::make_shared(a, b, c); } else if (name == "CIRCLE") { double r; input >> r; return std::make_shared(r); } return 0; }