Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #define MINSIZE 3
- #define EPSILON 0.0000000000000001
- int main()
- {
- setlocale(LC_ALL, "ru");
- bool isCorrect;
- int numbOfVersh;
- int i;
- int k;
- double perimetr;
- std::cout << "Эта программа определяет периметр N - угольника по заданным вершинам.\n";
- std::cout << "Введите количество вершин многоугольника : ";
- do
- {
- isCorrect = true;
- std::cin >> numbOfVersh;
- if (std::cin.fail())
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- isCorrect = false;
- std::cerr << "Проверьте правильность ввода и повторите попытку.";
- }
- if (isCorrect && std::cin.get() != '\n')
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- std::cerr << "Проверьте правильность ввода и повторите попытку.";
- isCorrect = false;
- }
- if (isCorrect && numbOfVersh < MINSIZE) {
- std::cerr << "Многоугольник должен иметь хотябы 3 вершины. Повторите попытку.";
- isCorrect = false;
- }
- } while (!isCorrect);
- int* x = new int[numbOfVersh];
- int* y = new int[numbOfVersh];
- for (i = 0; i < numbOfVersh; i++)
- {
- do
- {
- do
- {
- std::cout << "Введите абсциссу " << i + 1 << " точки: ";
- isCorrect = true;
- std::cin >> x[i];
- if (std::cin.fail())
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- isCorrect = false;
- std::cerr << "Проверьте правильность ввода и повторите попытку.";
- }
- if (isCorrect && std::cin.get() != '\n')
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- std::cerr << "Проверьте правильность ввода и повторите попытку.";
- isCorrect = false;
- }
- } while (!isCorrect);
- do
- {
- std::cout << "Введите ординату " << i + 1 << " точки: ";
- isCorrect = true;
- std::cin >> y[i];
- if (std::cin.fail())
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- isCorrect = false;
- std::cerr << "Проверьте правильность ввода и повторите попытку.";
- }
- if (isCorrect && std::cin.get() != '\n')
- {
- std::cin.clear();
- while (std::cin.get() != '\n');
- std::cerr << "Проверьте правильность ввода и повторите попытку.";
- isCorrect = false;
- }
- } while (!isCorrect);
- for (k = 0; k < i; k++)
- {
- if ((isCorrect) && (abs(x[i] - x[k]) < EPSILON) && (abs(y[i] - y[k]) < EPSILON))
- {
- isCorrect = false;
- }
- std::cerr << "Координаты точки схожи с одной из предыдущих. Введите другие значения.";
- }
- if ((isCorrect) && (i > 1))
- {
- for (k = 0; k < i - 1; k++)
- {
- if (((y[k] - y[i - 1]) * (x[i] - x[i - 1]) == (x[k] - x[i - 1]) * (y[i] - y[i - 1])) && ((x[k] - x[i - 1]) * (x[i] - x[i - 1]) <= (x[i] - x[i - 1]) * (x[i] - x[i - 1])) && (0 <= (x[k] - x[i - 1]) * (x[i] - x[i - 1])) && ((y[i] - y[i - 1]) * (y[k] - y[i - 1]) <= (y[i] - y[i - 1]) * (y[i] - y[i - 1])) && (0 <= (y[k] - y[i - 1]) * (y[i] - y[i - 1])) || ((y[i] - y[k]) * (x[k + 1] - x[k]) == (x[i] - x[k]) * (y[k + 1] - y[k])) && ((x[i] - x[k]) * (x[k + 1] - x[k]) <= (x[k + 1] - x[k]) * (x[k + 1] - x[k])) && (0 <= (x[i] - x[k]) * (x[k + 1] - x[k])) && ((y[k + 1] - y[k]) * (y[i] - y[k]) <= (y[k + 1] - y[k]) * (y[k + 1] - y[k])) && (0 <= (y[i] - y[k]) * (y[k + 1] - y[k])))
- {
- isCorrect = false;
- }
- }
- if (isCorrect && (y[i - 2] - y[i - 1]) * (x[i] - x[i - 1]) == (x[i - 2] - x[i - 1]) * (y[i] - y[i - 1]))
- {
- isCorrect = false;
- }
- if (isCorrect && (i == numbOfVersh - 1))
- {
- for (k = 1; k < i; k++)
- {
- if (((y[k] - y[i]) * (x[0] - x[i]) == (x[k] - x[i]) * (y[0] - y[i])) && ((x[k] - x[i]) * (x[0] - x[i]) <= (x[0] - x[i]) * (x[0] - x[i])) && (0 <= (x[k] - x[i]) * (x[0] - x[i])) && ((y[0] - y[i]) * (y[k] - y[i]) <= (y[0] - y[i]) * (y[0] - y[i])) && (0 <= (y[k] - y[i]) * (y[0] - y[i])))
- {
- isCorrect = false;
- }
- }
- if ((y[1] - y[i]) * (x[0] - x[i]) == (x[1] - x[i]) * (y[0] - y[i]))
- {
- isCorrect = false;
- }
- }
- if (!isCorrect)
- {
- std::cerr << "При использовании этой точки многоугольник не получится. Выберите другие значения.";
- }
- }
- } while (!isCorrect);
- }
- perimetr = sqrt((x[1] - x[0]) * (x[1] - x[0]) + (y[1] - y[0]) * (y[1] - y[0]));
- for (i = 2; i < numbOfVersh; i++)
- {
- perimetr = perimetr + sqrt((x[i] - x[i - 1]) * (x[i] - x[i - 1]) + (y[i] - y[i - 1]) * (y[i] - y[i - 1]));
- }
- perimetr = perimetr + sqrt((x[0] - x[numbOfVersh - 1]) * (x[0] - x[numbOfVersh - 1]) + (y[0] - y[numbOfVersh - 1]) * (y[0] - y[numbOfVersh - 1]));
- std::cout << "Периметр многоугольника = " << perimetr; "% .3f";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement