#include <iostream>
#include <memory>
#include <cmath>
#include <string>
using std::string;
using std::shared_ptr;
using std::istringstream;
class Figure {
public:
virtual string Name() = 0;
virtual double Perimeter() = 0;
virtual double Area() = 0;
};
class Rect: public Figure {
public:
double a, b;
Rect(double a, double b) {
this->a = a;
this->b = b;
}
string Name() override {
return "RECT";
}
double Perimeter() override {
return 2.0*a+2.0*b;
}
double Area() override {
return a*b;
}
};
class Triangle: public Figure {
double a, b, c;
public:
Triangle(double a, double b, double c) : a(a), b(b), c(c) {}
string Name() override {
return "TRIANGLE";
}
double Perimeter() override {
return a+b+c;
}
double Area() override {
double p = (a+b+c)/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
};
class Circle: public Figure {
double r;
public:
explicit Circle(double r) : r(r) {}
string Name() override {
return "CIRCLE";
}
double Perimeter() override {
return 2*3.14*r;
}
double Area() override {
return 3.14*r*r;
}
};
shared_ptr<Figure> CreateFigure(istringstream &is) {
string figure;
double a, b, c;
is >> figure >> a;
switch (figure[0]) {
case 'R':
is >> b;
return shared_ptr<Figure>(new Rect(a, b));
break;
case 'T':
is >> b >> c;
return shared_ptr<Figure>(new Triangle(a, b, c));
break;
case 'C':
return shared_ptr<Figure>(new Circle(a));
break;
default:
return shared_ptr<Figure>(nullptr);
}
}