#include <memory>
#include <sstream>
#include <string>
const double PI = 3.14;
class Figure {
public:
explicit Figure(const std::string& type)
: Type(type) {
}
virtual std::string Name() = 0;
virtual double Perimeter() = 0;
virtual double Area() = 0;
const std::string Type;
};
class Rect : public Figure {
public:
Rect(const int& width, const int& height)
: Figure("RECT"),
perimeter(2 * width + 2 * height),
area(width * height) {
}
std::string Name() override {
return Type;
}
double Perimeter() override {
return perimeter;
}
double Area() override {
return area;
}
private:
double perimeter;
double area;
};
class Triangle : public Figure {
public:
Triangle(const int& x, const int& y, const int& z)
: Figure("TRIANGLE") {
perimeter = x + y + z;
double h_p = perimeter / 2;
area = sqrt(h_p * (h_p - x) * (h_p - y) * (h_p - z));
}
std::string Name() override {
return Type;
}
double Perimeter() override {
return perimeter;
}
double Area() override {
return area;
}
private:
double perimeter;
double area;
};
class Circle : public Figure {
public:
explicit Circle(const int& radius)
: Figure("CIRCLE"),
perimeter(2 * PI * radius),
area(PI * radius * radius) {
}
std::string Name() override {
return Type;
}
double Perimeter() override {
return perimeter;
}
double Area() override {
return area;
}
private:
double perimeter;
double area;
};
std::shared_ptr<Figure> CreateFigure(std::istringstream& is) {
std::string name;
is >> name;
if (name == "RECT") {
int width, height;
is >> width >> height;
return std::make_shared<Rect>(width, height);
} else if (name == "TRIANGLE") {
int x, y, z;
is >> x >> y >> z;
return std::make_shared<Triangle>(x, y, z);
} else {
int radius;
is >> radius;
return std::make_shared<Circle>(radius);
}
}