#include #include #include #include #include #include #include using namespace std; class Figure { public: virtual string Name() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; }; class Triangle : public Figure { public: Triangle(const int& one, const int& two, const int& three) { a = one; b = two; c = three; } string Name() { return "TRIANGLE"; } double Perimeter() { return a + b + c; } double Area() { double p = (a + b + c) / 2.0; return sqrt(p * (p - a) * (p - b) * (p - c)); } private: int a, b, c; }; class Rect : public Figure { public: Rect(const int& one, const int& two) { a = one; b = two; } string Name() { return "RECT"; } double Perimeter() { return 2.0 * (a + b); } double Area() { return a * b; } private: int a, b; }; class Circle : public Figure { public: Circle(const int& one) { a = one; } string Name() { return "CIRCLE"; } double Perimeter() { return 2 * 3.14 * a; } double Area() { return 3.14 * a * a; } private: int a; }; shared_ptr
CreateFigure(istringstream& is) { string fig; is >> fig; if (fig == "RECT") { int a, b; is >> a >> ws >> b; return make_shared(a, b); } else if (fig == "TRIANGLE") { int a, b, c; is >> a >> ws >> b >> ws >> c; return make_shared(a, b, c); } else if (fig == "CIRCLE") { int a; is >> a; return make_shared(a); } } int main() { vector> figures; for (string line; getline(cin, line); ) { istringstream is(line); string command; is >> command; if (command == "ADD") { is >> ws; figures.push_back(CreateFigure(is)); } else if (command == "PRINT") { for (const auto& current_figure : figures) { cout << fixed << setprecision(3) << current_figure->Name() << " " << current_figure->Perimeter() << " " << current_figure->Area() << endl; } } } return 0; }