#include <iostream>
#include <sstream>
#include <iomanip>
#include <memory>
#include <string>
#include <vector>
#include <cmath>
const float PI = 3.14;
class Figure {
public:
explicit Figure(const std::string &name) : name_(name) {}
virtual std::string Name() = 0;
virtual double Perimeter() = 0;
virtual double Area() = 0;
const std::string name_;
};
class Rect : public Figure {
public:
Rect(const std::string &name, const double &width, const double &height)
: Figure(name)
, width_(width)
, height_(height)
{}
std::string Name() override {
return name_;
}
double Perimeter() override {
return (width_ + height_) * 2;
}
double Area() override {
return width_ * height_;
}
private:
const double width_;
const double height_;
};
class Triangle : public Figure {
public:
Triangle(const std::string &name, double a, double b, double c)
: Figure(name)
, a(a)
, b(b)
, c(c)
{}
std::string Name() override {
return name_;
}
double Perimeter() override {
return a + b + c;
}
double Area() override {
double p = this->Perimeter() / 2;
return sqrt(p * (p - a) * (p - b) * (p - c));
}
private:
double a, b, c;
};
class Circle : public Figure {
public:
Circle(const std::string &name, double r) : Figure(name), radius(r) {}
std::string Name() override {
return name_;
}
double Perimeter() override {
return 2 * radius * PI;
}
double Area() override {
return PI * radius * radius;
}
private:
double radius;
};
std::shared_ptr<Figure> CreateFigure(std::istringstream &is) {
std::string figure_name;
is >> figure_name;
if (figure_name == "RECT") {
double w, h;
is >> w >> h;
return std::make_shared<Rect>(figure_name, w, h);
} else if (figure_name == "TRIANGLE") {
double a, b, c;
is >> a >> b >> c;
return std::make_shared<Triangle>(figure_name, a, b, c);
} else {
double r;
is >> r;
return std::make_shared<Circle>(figure_name, r);
}
}