#pragma once
class Figure {
public:
virtual std::string Name() = 0;
virtual double Perimeter() = 0;
virtual double Area() = 0;
};
class Rect : public Figure {
public:
Rect(int w, int h) : width(w), height(h) {}
std::string Name() override {
return "RECT";
}
double Perimeter() override {
return ((width + height) * 2);
}
double Area() override {
return (width * height);
}
private:
double width, height;
};
class Treangle : public Figure {
public:
Treangle(int a, int b, int c): A(a), B(b), C(c) {}
std::string Name() override {
return "TREANGLE";
}
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));
}
private:
double A, B, C;
};
class Circle : public Figure {
public:
Circle(int r) : R(r) {}
std::string Name() override {
return "CIRCLE";
}
double Perimeter() override {
return 2 * P * R;
}
double Area() override {
return P * R * R;
}
private:
double R;
double P = 3.14;
};
auto CreateFigure(std::istringstream & is) {
std::string figure_name;
is >> figure_name;
is >> std::ws;
if (figure_name == "RECT") {
int a, b;
is >> a;
is >> std::ws;
is >> b;
std::shared_ptr<Figure>figure;
{
std::shared_ptr<Rect>rect = std::make_shared<Rect>(a, b);
figure = rect;
}
return figure;
}
else if (figure_name == "TRIANGLE") {
int a, b, c;
is >> a;
is >> std::ws;
is >> b;
is >> std::ws;
is >> c;
std::shared_ptr<Figure>figure;
{
std::shared_ptr<Treangle>treatangle = std::make_shared<Treangle>(a, b, c);
figure = treatangle;
}
return figure;
}
else if (figure_name == "CIRCLE") {
int r;
is >> r;
std::shared_ptr<Figure>figure;
{
std::shared_ptr<Circle>circle = std::make_shared<Circle>(r);
figure = circle;
}
return figure;
}
}