#include <memory>
#include <string>
#include <sstream>
#include <cmath>
class Figure {
public:
virtual std::string Name() = 0;
virtual double Perimeter() = 0;
virtual double Area() = 0;
};
class Rect : public Figure {
public:
explicit Rect(int width, int height): width_(width), height_(height) {}
std::string Name() override {
return "RECT";
}
double Perimeter() override {
return (width_ + height_) * 2;
}
double Area() override {
return width_ * height_;
}
private:
int width_, height_;
};
class Triangle : public Figure {
public:
explicit Triangle(int a, int b, int c): a_(a), b_(b), c_(c) {}
std::string Name() override {
return "TRIANGLE";
}
double Perimeter() override {
return a_ + b_ + c_;
}
double Area() override {
double p = Perimeter() / 2;
return sqrt(p * (p - a_) * (p - b_) * (p - c_));
}
private:
int a_, b_, c_;
};
class Circle : public Figure {
public:
explicit Circle(int rad): r_(rad) {}
std::string Name() override {
return "CIRCLE";
}
double Perimeter() override {
const double PI = 3.14;
return 2 * PI * r_;
}
double Area() override {
const double PI = 3.14;
return PI * r_ * r_;
}
private:
int r_;
};
std::shared_ptr<Figure> CreateFigure(std::istringstream& param) {
std::string type;
param >> type;
std::shared_ptr<Figure> result;
if (type == "RECT") {
std::string w, h;
param >> w >> h;
return std::make_shared<Rect>(std::stoi(w), std::stoi(h));
}
if (type == "TRIANGLE") {
std::string a, b, c;
param >> a >> b >> c;
return std::make_shared<Triangle>(std::stoi(a),
std::stoi(b), std::stoi(c));
}
std::string r;
param >> r;
return std::make_shared<Circle>(std::stoi(r));
}