#include<string>
#include<iostream>
#include<fstream>
#include<vector>
#include<iomanip>
#include<sstream>
#include<cmath>
#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 : public 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() const {
return t;
}
double Perimeter() const {
return a + b + c;
}
double Area() const {
double p = Perimeter() / 2;
return sqrt(p * (p - a) * (p - b) * (p - c));
}
};
class Rect : public Figure {
private:
int a, b;
public:
Rect(const int& a, const int& b) : Figure("RECT"), a(a), b(b) {}
string Name() const {
return t;
}
double Perimeter() const {
return 2 * (a + b);
}
double Area() const {
return a * b;
}
};
class Circle : public Figure {
private:
int r;
public:
explicit Circle(const int& r) : Figure("CIRCLE"), r(r) {}
string Name() const {
return t;
}
double Perimeter() const {
return r * 6.28;
}
double Area() const {
return r * r * 3.14;
}
};
std::shared_ptr<Figure> CreateFigure(std::istringstream stream) {
string figure;
stream >> figure;
if (figure == "TRIANGLE") {
int a, b, c;
stream >> a >> b >> c;
std::shared_ptr<Figure> res;
res = make_shared<Triangle>(a, b, c);
return res;
} else if (figure == "RECT") {
int a, b;
stream >> a >> b;
std::shared_ptr<Figure> res;
res = make_shared<Rect>(a, b);
return res;
} else if (figure == "CIRCLE") {
int r;
stream >> r;
std::shared_ptr<Figure> res;
res = make_shared<Circle>(r);
return res;
} else {
std::shared_ptr<Figure> res;
return res;
}
}