#include <string>
#include <memory>
using std::string;
using std::make_shared;
class Figure {
public:
explicit Figure(const string& type) : t(type) {}
virtual string Name() const = 0;
virtual double Perimeter() const = 0;
virtual double Area() const = 0;
const string t;
};
class Triangle : Figure {
private:
int a, b, c;
public:
Triangle(const int& a, const int& b, const int& c) :
Figure("TRIANGLE"), a(a), b(b), c(c) {}
string Name() {
return t;
}
double Perimeter() {
return static_cast<float>(a + b + c);
}
double Area() {
double p = Perimeter() / 2;
return sqrt(p * (p - a) * (p - b) * (p - c));
}
};
class Rect : Figure {
private:
int a, b;
public:
Rect(const int& a, const int& b) : Figure("TRIANGLE"), a(a), b(b) {}
string Name() {
return t;
}
double Perimeter() {
return 2 * (a + b);
}
double Area() {
return a * b;
}
};
class Circle : Figure {
private:
int r;
public:
explicit Circle(const int& r) : Figure("TRIANGLE"), r(r) {}
string Name() {
return t;
}
double Perimeter() {
return r * 6.28;
}
double Area() {
return r * r * 3.14;
}
};
std::shared_ptr<Figure> CreateFigure(std::istringstream stream) {
std::shared_ptr<Figure> res;
string figure;
stream >> figure;
if (figure == "TRIANGLE") {
int a, b, c;
stream >> a >> b >> c;
res = make_shared<Triangle>(a, b, c);
} else if (figure == "RECT") {
int a, b;
stream >> a >> b;
res = make_shared<Rect>(a, b);
} else if (figure == "CIRCLE") {
int r;
stream >> r;
res = make_shared<Circle>(r);
}
return res;
}