#include <iostream>
#include <string>
#include <memory>
#include <sstream>
#include <cstring>
class Figure {
public:
virtual std::string Name() = 0;
virtual double Perimeter() = 0;
virtual double Area() = 0;
};
class Triangle : public Figure {
double a = 0;
double b = 0;
double c = 0;
public:
Triangle(double a, double b, double c) {
this->a = a;
this->b = b;
this->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));
}
};
class Rect : public Figure {
public:
double width = 0;
double height = 0;
Rect(double width, double height) {
this->width = width;
this->height = height;
}
std::string Name() override {
return "RECT";
}
double Perimeter() override {
return (width + height) * 2;
}
double Area() override {
return width * height;
}
};
class Circle : public Figure {
public:
double radius = 0;
explicit Circle(double radius) {
this->radius = radius;
}
std::string Name() override {
return "CIRCLE";
}
double Perimeter() override {
return 2 * 3.14 * radius;
}
double Area() override {
return 3.14 * radius * radius;
}
};
static std::shared_ptr<Figure> CreateFigure(std::istringstream &request1) {
auto request = request1.str();
request = request.erase(0, request.find(' ') + 1);
int pos = request.find(' ');
auto type = request.substr(0, pos);
request.erase(0, pos + 1);
if (strcmp(type.c_str(), "RECT") == 0) {
pos = request.find(' ');
int width = std::stoi(request.substr(0, pos));
request.erase(0, pos + 1);
int height = std::stoi(request);
std::shared_ptr<Rect> ptr1(new Rect(width, height));
return ptr1;
} else if (strcmp(type.c_str(), "CIRCLE") == 0) {
int radius = std::stoi(request);
std::shared_ptr<Circle> ptr1(new Circle(radius));
return ptr1;
} else if (strcmp(type.c_str(), "TRIANGLE") == 0) {
pos = request.find(' ');
int a = std::stoi(request.substr(0, pos));
request.erase(0, pos + 1);
pos = request.find(' ');
int b = std::stoi(request.substr(0, pos));
request.erase(0, pos + 1);
int c = std::stoi(request);
std::shared_ptr<Triangle> ptr1(new Triangle(a, b, c));
return ptr1;
}
return nullptr;
}