Загрузка данных
#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;
}