Загрузка данных


#include <iostream>
#include <cmath>
#include <string>
#include <windows.h>

using namespace std;

#define RESET   "\033[0m"
#define BLUE    "\033[34m"
#define GREEN   "\033[32m"
#define RED     "\033[31m"

void enableColor() {
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD dwMode = 0;

    GetConsoleMode(hOut, &dwMode);
    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    SetConsoleMode(hOut, dwMode);

    HANDLE hErr = GetStdHandle(STD_ERROR_HANDLE);
    DWORD dwModeErr = 0;

    GetConsoleMode(hErr, &dwModeErr);
    dwModeErr |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    SetConsoleMode(hErr, dwModeErr);
}

void taskA() {
    cout << BLUE
         << "*************************************************************\n";
    cout << "* Вычисление площади треугольника по длинам трёх его сторон *\n";
    cout << "*************************************************************\n"
         << RESET;

    double a, b, c;

    cout << BLUE << "Введите длину первой стороны: " << RESET;
    cout << GREEN;
    cin >> a;
    cout << RESET;

    cout << BLUE << "Введите длину второй стороны: " << RESET;
    cout << GREEN;
    cin >> b;
    cout << RESET;

    cout << BLUE << "Введите длину третьей стороны: " << RESET;
    cout << GREEN;
    cin >> c;
    cout << RESET;

    if (a <= 0 || b <= 0 || c <= 0) {
        cout << BLUE << "Ошибка ввода входных данных\n"
             << RESET;

        cerr << RED
             << "Длины сторон должны быть положительными числами\n"
             << RESET;
        return;
    }

    if (a >= b + c || b >= a + c || c >= a + b) {
        cout << BLUE << "Ошибка ввода входных данных\n"
             << RESET;

        cerr << RED
             << "Треугольник со сторонами "
             << a << ", " << b << ", " << c
             << " не существует\n"
             << RESET;
        return;
    }

    double p = (a + b + c) / 2.0;

    double area = sqrt(
        p * (p - a) * (p - b) * (p - c)
    );

    cout << BLUE
         << "Площадь треугольника равна "
         << area << "\n"
         << RESET;
}

void taskB() {
    cout << BLUE
         << "*****************************************************************************\n";
    cout << "* Вычисление длины хорды окружности, лежащей на прямой, проходящей через    *\n";
    cout << "* две заданные точки                                                        *\n";
    cout << "*****************************************************************************\n"
         << RESET;

    double cx, cy, r;
    double x1, y1, x2, y2;

    cout << BLUE << "Введите координаты центра окружности: "
         << RESET;
    cout << GREEN;
    cin >> cx >> cy;
    cout << RESET;

    cout << BLUE << "Введите радиус окружности: "
         << RESET;
    cout << GREEN;
    cin >> r;
    cout << RESET;

    cout << BLUE << "Введите координаты первой точки: "
         << RESET;
    cout << GREEN;
    cin >> x1 >> y1;
    cout << RESET;

    cout << BLUE << "Введите координаты второй точки: "
         << RESET;
    cout << GREEN;
    cin >> x2 >> y2;
    cout << RESET;

    if (r <= 0) {
        cout << BLUE << "Ошибка ввода входных данных\n"
             << RESET;

        cerr << RED
             << "Радиус должен быть положительным\n"
             << RESET;
        return;
    }

    double dx = x2 - x1;
    double dy = y2 - y1;

    double len = sqrt(dx * dx + dy * dy);

    if (len < 1e-9) {
        cout << BLUE << "Ошибка ввода входных данных\n"
             << RESET;

        cerr << RED
             << "Точки прямой совпадают\n"
             << RESET;
        return;
    }

    double A = dy;
    double B = -dx;
    double C = dx * y1 - dy * x1;

    double dist =
        fabs(A * cx + B * cy + C)
        / sqrt(A * A + B * B);

    if (dist > r) {
        cout << BLUE << "Ошибка ввода входных данных\n"
             << RESET;

        cerr << RED
             << "Прямая не пересекает окружность\n"
             << RESET;
        return;
    }

    double chord =
        2.0 * sqrt(r * r - dist * dist);

    cout << BLUE
         << "Длина хорды равна "
         << chord << "\n"
         << RESET;
}

void taskC() {
    cout << BLUE
         << "****************************************************\n";
    cout << "* Вычисление длины средней линии трапеции          *\n";
    cout << "* по координатам четырёх её вершин                 *\n";
    cout << "****************************************************\n"
         << RESET;

    double x1, y1;
    double x2, y2;
    double x3, y3;
    double x4, y4;

    cout << BLUE
         << "Введите координаты первой вершины трапеции: "
         << RESET;
    cout << GREEN;
    cin >> x1 >> y1;
    cout << RESET;

    cout << BLUE
         << "Введите координаты второй вершины трапеции: "
         << RESET;
    cout << GREEN;
    cin >> x2 >> y2;
    cout << RESET;

    cout << BLUE
         << "Введите координаты третьей вершины трапеции: "
         << RESET;
    cout << GREEN;
    cin >> x3 >> y3;
    cout << RESET;

    cout << BLUE
         << "Введите координаты четвёртой вершины трапеции: "
         << RESET;
    cout << GREEN;
    cin >> x4 >> y4;
    cout << RESET;

    double dx1 = x2 - x1;
    double dy1 = y2 - y1;

    double dx2 = x3 - x2;
    double dy2 = y3 - y2;

    double dx3 = x4 - x3;
    double dy3 = y4 - y3;

    double dx4 = x1 - x4;
    double dy4 = y1 - y4;

    bool parallel1 =
        fabs(dx1 * dy3 - dy1 * dx3) < 1e-9;

    bool parallel2 =
        fabs(dx2 * dy4 - dy2 * dx4) < 1e-9;

    double a = sqrt(dx1 * dx1 + dy1 * dy1);
    double b = sqrt(dx2 * dx2 + dy2 * dy2);
    double c = sqrt(dx3 * dx3 + dy3 * dy3);
    double d = sqrt(dx4 * dx4 + dy4 * dy4);

    if (!(parallel1 ^ parallel2)) {
        cout << BLUE
             << "Ошибка ввода входных данных\n"
             << RESET;

        cerr << RED
             << "Четырёхугольник не является трапецией\n"
             << RESET;
        return;
    }

    double middleLine;

    if (parallel1)
        middleLine = (a + c) / 2.0;
    else
        middleLine = (b + d) / 2.0;

    cout << BLUE
         << "Длина средней линии равна "
         << middleLine << "\n"
         << RESET;
}

int main(int argc, char* argv[]) {
    setlocale(LC_ALL, "RU");

    enableColor();

    if (argc < 2) {
        cerr << RED
             << "Необходимо указать параметр: A, B или C\n"
             << RESET;
        return 1;
    }

    string task(argv[1]);

    if (task == "A") {
        taskA();
    }
    else if (task == "B") {
        taskB();
    }
    else if (task == "C") {
        taskC();
    }
    else {
        cerr << RED
             << "Неизвестная задача: "
             << task << "\n"
             << RESET;
        return 1;
    }

    return 0;
}