#include <iomanip>
#include <string>
#include <cmath>
#include <memory>
#include <iostream>
using std::string;
using std::make_shared;
using std::shared_ptr;
using std::stoi;
using std::istringstream;
class Figure {
public:
virtual string Name() const {
return "Figure";
}
virtual int Perimeter() const {
return 0;
}
virtual int Area() const {
return 0;
}
};
class Rect : public Figure {
public:
Rect(int w, int h):
w(w), h(h) {}
string Name() const override {
return "Rect";
}
int Perimeter() const override {
return 2*(w + h);
}
int Area() const override {
return w * h;
}
private:
int w, h;
};
class Circle : public Figure {
public:
explicit Circle(int r):
r(r) {}
string Name() const override {
return "Circle";
}
int Perimeter() const override {
return 3.14 * 2 * r;
}
int Area() const override {
return 3.14 * pow(r, 2);
}
private:
int r;
};
class Triangle : public Figure {
public:
Triangle(int a, int b, int c):
a(a), b(b), c(c) {}
string Name() const override {
return "Triangle";
}
int Perimeter() const override {
return a + b + c;
}
int Area() const override {
float p = static_cast<float>(this->Perimeter()) / 2;
int area = sqrt(p*(p-a)*(p-b)*(p-c));
return area;
}
private:
int a, b, c;
};
shared_ptr<Figure> CreateFigure(istringstream& is) {
string figure;
is >> figure;
if (figure == "RECT") {
string w, h;
is >> w >> h;
return make_shared<Rect>(stoi(w), stoi(h));
}
if (figure == "TRIANGLE") {
string a, b, c;
is >> a >> b >> c;
return make_shared<Triangle>(stoi(a), stoi(b), stoi(c));
}
string r;
is >> r;
return make_shared<Circle>(stoi(r));
}