/
0_0morfey
/
Figure2
Обзор
Документация
Войти
/
0_0morfey
/
Figure2
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.cpp
193 строки
7 KB
0_0morfey
13 фев 2026, 09:28
Верифицирован
13 фев 2026, 09:28
642e7e4
Код
Авторство
О чём код?
#include <iostream> #include <string> #include <stdexcept> #include <cmath> // Базовый класс для всех фигур class Figure { protected: std::string name; public: Figure(const std::string& name) : name(name) {} virtual void printInfo() const = 0; virtual ~Figure() = default; }; // Треугольник: 3 стороны, 3 угла 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("Треугольник"), a(a), b(b), c(c), A(A), B(B), C(C) {} double getA() const { return a; } double getB() const { return b; } double getC() const { return c; } double getAngleA() const { return A; } double getAngleB() const { return B; } double getAngleC() const { return C; } void printInfo() const override { std::cout << name << ":\n"; std::cout << " Стороны: a = " << a << " b = " << b << " c = " << c << "\n"; std::cout << " Углы: A = " << A << " B = " << B << " C = " << C << "\n"; } }; // Прямоугольный треугольник (угол C = 90°) class RightTriangle : public Triangle { public: RightTriangle(double a, double b) : Triangle(a, b, std::sqrt(a*a + b*b), std::atan(b / a) * 180.0 / M_PI, 90.0 - std::atan(b / a) * 180.0 / M_PI, 90.0) { name = "Прямоугольный треугольник"; } }; // Равнобедренный треугольник (a == c, A == C) class IsoscelesTriangle : public Triangle { public: IsoscelesTriangle(double base, double side) : Triangle(side, base, side, (180.0 - 2.0 * std::acos(base / (2.0 * side)) * 180.0 / M_PI) / 2.0, std::acos(base / (2.0 * side)) * 180.0 / M_PI, (180.0 - 2.0 * std::acos(base / (2.0 * side)) * 180.0 / M_PI) / 2.0) { if (side <= 0 || base <= 0) { throw std::invalid_argument("Длины сторон должны быть положительными"); } name = "Равнобедренный треугольник"; } }; // Равносторонний треугольник (все стороны и углы равны) class EquilateralTriangle : public Triangle { public: EquilateralTriangle(double side) : Triangle(side, side, side, 60.0, 60.0, 60.0) { if (side <= 0) { throw std::invalid_argument("Длина стороны должна быть положительной"); } name = "Равносторонний треугольник"; } }; // Четырёхугольник: 4 стороны, 4 угла 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("Четырёхугольник"), a(a), b(b), c(c), d(d), A(A), B(B), C(C), D(D) {} double getSideA() const { return a; } double getSideB() const { return b; } double getSideC() const { return c; } double getSideD() const { return d; } double getAngleA() const { return A; } double getAngleB() const { return B; } double getAngleC() const { return C; } double getAngleD() const { return D; } void printInfo() const override { std::cout << name << ":\n"; std::cout << " Стороны: a = " << a << " b = " << b << " c = " << c << " d = " << d << "\n"; std::cout << " Углы: A = " << A << " B = " << B << " C = " << C << " D = " << D << "\n"; } }; // Прямоугольник (a==c, b==d, все углы 90°) class Rectangle : public Quadrilateral { public: Rectangle(double width, double height) : Quadrilateral(width, height, width, height, 90.0, 90.0, 90.0, 90.0) { if (width <= 0 || height <= 0) { throw std::invalid_argument("Ширина и высота должны быть положительными"); } name = "Прямоугольник"; } }; // Квадрат (все стороны равны, все углы 90°) class Square : public Quadrilateral { public: Square(double side) : Quadrilateral(side, side, side, side, 90.0, 90.0, 90.0, 90.0) { if (side <= 0) { throw std::invalid_argument("Длина стороны должна быть положительной"); } name = "Квадрат"; } }; // Параллелограмм (a==c, b==d; A==C, B==D) class Parallelogram : public Quadrilateral { public: Parallelogram(double a, double b, double angleA, double angleB) : Quadrilateral(a, b, a, b, angleA, angleB, angleA, angleB) { if (a <= 0 || b <= 0) { throw std::invalid_argument("Длины сторон должны быть положительными"); } name = "Параллелограмм"; } }; // Ромб (все стороны равны; A==C, B==D) class Rhombus : public Quadrilateral { public: Rhombus(double side, double angleA, double angleB) : Quadrilateral(side, side, side, side, angleA, angleB, angleA, angleB) { if (side <= 0) { throw std::invalid_argument("Длина стороны должна быть положительной"); } name = "Ромб"; } }; // Функция для полиморфного вывода информации о фигуре void print_info(const Figure* figure) { figure->printInfo(); } int main() { try { // Создаём по одному экземпляру каждой фигуры с заданными параметрами Triangle tri(10.0, 20.0, 30.0, 50.0, 60.0, 70.0); RightTriangle rt(10.0, 20.0); IsoscelesTriangle it(20.0, 10.0); // base=20, side=10 EquilateralTriangle et(30.0); Quadrilateral quad(10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0); Rectangle rect(10.0, 20.0); Square sq(20.0); Parallelogram para(20.0, 30.0, 30.0, 40.0); Rhombus rh(30.0, 30.0, 40.0); // Выводим информацию в требуемом формате print_info(&tri); print_info(&rt); print_info(&it); print_info(&et); print_info(&quad); print_info(&rect); print_info(&sq); print_info(¶); print_info(&rh); } catch (const std::exception& e) { std::cerr << "Ошибка: " << e.what() << std::endl; return 1; } return 0; }