/
0_0morfey
/
Figure3
Обзор
Документация
Войти
/
0_0morfey
/
Figure3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.cpp
215 строк
7 KB
0_0morfey
13 фев 2026, 09:35
Верифицирован
13 фев 2026, 09:35
cdc3667
Код
Авторство
О чём код?
#include <iostream> #include <string> #include <vector> #include <cmath> const double EPS = 1e-6; // погрешность для сравнения углов и сторон // Базовый класс Figure class Figure { protected: std::string name; int sidesCount; public: Figure(const std::string& name, int sidesCount) : name(name), sidesCount(sidesCount) {} virtual void printInfo() const { std::cout << name << ":\n"; std::cout << " Правильная: " << (isCorrect() ? "Да" : "Нет") << "\n"; std::cout << " Количество сторон: " << sidesCount << "\n"; } virtual bool isCorrect() const { return true; // у базовой фигуры нет ограничений } virtual ~Figure() = default; }; //Треугольник (3 стороны, сумма углов = 180°) class Triangle : public Figure { protected: double a, b, c; double A, B, C; public: Triangle(double a, double b, double c, double A, double B, double C) : Figure("Треугольник", 3), a(a), b(b), c(c), A(A), B(B), C(C) {} void printInfo() const override { Figure::printInfo(); std::cout << " Стороны: a=" << a << " b=" << b << " c=" << c << "\n"; std::cout << " Углы: A=" << A << " B=" << B << " C=" << C << "\n"; } bool isCorrect() const override { if (a <= 0 || b <= 0 || c <= 0) return false; if (A <= 0 || B <= 0 || C <= 0) return false; if (std::abs(A + B + C - 180.0) > EPS) return false; // Проверка неравенства треугольника if (a + b <= c || a + c <= b || b + c <= a) return false; return true; } }; //Прямоугольный треугольник (угол C = 90°) class RightTriangle : public Triangle { public: RightTriangle(double a, double b, double c, double A, double B) : Triangle(a, b, c, A, B, 90.0) { name = "Прямоугольный треугольник"; } bool isCorrect() const override { if (!Triangle::isCorrect()) return false; return std::abs(C - 90.0) < EPS; } }; //Равнобедренный треугольник (a == c, A == C) class IsoscelesTriangle : public Triangle { public: IsoscelesTriangle(double a, double b, double c, double A, double B, double C) : Triangle(a, b, c, A, B, C) { name = "Равнобедренный треугольник"; } bool isCorrect() const override { if (!Triangle::isCorrect()) return false; return (std::abs(a - c) < EPS) && (std::abs(A - C) < EPS); } }; //Равносторонний треугольник (все стороны равны, все углы = 60°) class EquilateralTriangle : public Triangle { public: EquilateralTriangle(double side) : Triangle(side, side, side, 60.0, 60.0, 60.0) { name = "Равносторонний треугольник"; } bool isCorrect() const override { return Triangle::isCorrect(); // все условия уже заложены в конструктор } }; //Четырёхугольник (4 стороны, сумма углов = 360°) class Quadrilateral : public Figure { protected: double a, b, c, d; double A, B, C, D; public: Quadrilateral(double a, double b, double c, double d, double A, double B, double C, double D) : Figure("Четырёхугольник", 4), a(a), b(b), c(c), d(d), A(A), B(B), C(C), D(D) {} void printInfo() const override { Figure::printInfo(); std::cout << " Стороны: a=" << a << " b=" << b << " c=" << c << " d=" << d << "\n"; std::cout << " Углы: A=" << A << " B=" << B << " C=" << C << " D=" << D << "\n"; } bool isCorrect() const override { if (a <= 0 || b <= 0 || c <= 0 || d <= 0) return false; if (A <= 0 || B <= 0 || C <= 0 || D <= 0) return false; if (std::abs(A + B + C + D - 360.0) > EPS) return false; return true; } }; //Прямоугольник (a==c, b==d, все углы 90°) class Rectangle : public Quadrilateral { public: Rectangle(double a, double b) : Quadrilateral(a, b, a, b, 90.0, 90.0, 90.0, 90.0) { name = "Прямоугольник"; } bool isCorrect() const override { if (!Quadrilateral::isCorrect()) return false; return (std::abs(a - c) < EPS) && (std::abs(b - d) < EPS); } }; //Квадрат (все стороны равны, все углы 90°) class Square : public Quadrilateral { public: Square(double side) : Quadrilateral(side, side, side, side, 90.0, 90.0, 90.0, 90.0) { name = "Квадрат"; } bool isCorrect() const override { return Quadrilateral::isCorrect(); // условия уже в конструкторе } }; //Параллелограмм (a==c, b==d; A==C, B==D) class Parallelogram : public Quadrilateral { public: Parallelogram(double a, double b, double A, double B) : Quadrilateral(a, b, a, b, A, B, A, B) { name = "Параллелограмм"; } bool isCorrect() const override { if (!Quadrilateral::isCorrect()) return false; return (std::abs(a - c) < EPS) && (std::abs(b - d) < EPS) && (std::abs(A - C) < EPS) && (std::abs(B - D) < EPS); } }; //Ромб (все стороны равны; A==C, B==D) class Rhombus : public Quadrilateral { public: Rhombus(double side, double A, double B) : Quadrilateral(side, side, side, side, A, B, A, B) { name = "Ромб"; } bool isCorrect() const override { if (!Quadrilateral::isCorrect()) return false; return (std::abs(a - b) < EPS) && (std::abs(b - c) < EPS) && (std::abs(c - d) < EPS) && (std::abs(A - C) < EPS) && (std::abs(B - D) < EPS); } }; //Функция для полиморфного вывода информации void showFigure(const Figure* fig) { fig->printInfo(); std::cout << "\n"; } int main() { std::vector<const Figure*> figures; //Создаём фигуры figures.push_back(new Figure("Фигура", 0)); figures.push_back(new Triangle(10.0, 20.0, 30.0, 50.0, 60.0, 70.0)); figures.push_back(new RightTriangle(10.0, 20.0, 30.0, 50.0, 40.0)); figures.push_back(new RightTriangle(10.0, 20.0, 22.36, 26.57, 63.43)); // правильная figures.push_back(new IsoscelesTriangle(10.0, 20.0, 10.0, 50.0, 80.0, 50.0)); // правильная figures.push_back(new EquilateralTriangle(30.0)); figures.push_back(new Quadrilateral(10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0)); figures.push_back(new Rectangle(10.0, 20.0)); figures.push_back(new Square(20.0)); figures.push_back(new Parallelogram(20.0, 30.0, 30.0, 150.0)); // исправлено: B = 180 - A figures.push_back(new Rhombus(30.0, 30.0, 150.0)); // исправлено: B = 180 - A // Выводим информацию о каждой фигуре for (const auto& fig : figures) { showFigure(fig); } // Освобождаем память for (auto fig : figures) { delete fig; } return 0; }