Advertisement
Vernon_Roche

Задание 1 С++ (Лабораторная работа 2, вариант без функций)

Oct 8th, 2023 (edited)
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.     setlocale(LC_ALL, "Russian");
  9.     int n, npl, i;
  10.     double **coordinates, area, vpr1, vpr2, vpr3, vpr4;
  11.     bool isNotCorrect;
  12.     area = 0;
  13.     cout << "Программа считает площадь многоугольника по координатам его вершин.\n";
  14.     cout << "Введите количество вершин многоугольника (не более 10^6): ";
  15.     do {
  16.         isNotCorrect = true;
  17.         cin >> n;
  18.         if (cin.fail() || cin.get() != '\n') {
  19.             cout << "Ошибка ввода. Введите натуральное число.\n";
  20.             cin.clear();
  21.             while (cin.get() != '\n');
  22.         }
  23.         else if ((n <= 2) || (n > 1000000)) {
  24.             cout << "Ошибка ввода. Введите натуральное число в промежутке [3;10^6]\n";
  25.         }
  26.         else {
  27.             isNotCorrect = false;
  28.         }
  29.     } while (isNotCorrect);
  30.     npl = n + 1;
  31.     coordinates = new double* [npl];
  32.     for (int i = 0; i < npl; i++) {
  33.         coordinates[i] = new double[2];
  34.     }
  35.     do {
  36.         for (int k = 0; k < n; k++) {
  37.             do {
  38.                 do {
  39.                     isNotCorrect = true;
  40.                     cout << "Введите координату X" << k + 1 << ' ' << "в диапазоне (-10000; 10000):\n";
  41.                     cin >> coordinates[k][0];
  42.                     if (cin.fail() || cin.get() != '\n') {
  43.                         cout << "Ошибка ввода. Введите действительное число." << '\n';
  44.                         cin.clear();
  45.                         while (cin.get() != '\n');
  46.                     }
  47.                     else if ((abs(coordinates[k][0]) > 10000)) {
  48.                         cout << "Ошибка ввода. Введите координату точки в диапазоне (-10000; 10000)\n";
  49.                     }
  50.                     else {
  51.                         isNotCorrect = false;
  52.                     }
  53.                 } while (isNotCorrect);
  54.                 do {
  55.                     isNotCorrect = true;
  56.                     cout << "Введите координату Y" << k + 1 << ' ' << "в диапазоне (-10000; 10000):\n";
  57.                     cin >> coordinates[k][1];
  58.                     if (cin.fail() || cin.get() != '\n') {
  59.                         cout << "Ошибка ввода. Введите действительное число." << '\n';
  60.                         cin.clear();
  61.                         while (cin.get() != '\n');
  62.                     }
  63.                     else if ((abs(coordinates[k][1]) > 10000)) {
  64.                         cout << "Ошибка ввода. Введите координату точки в диапазоне (-10000; 10000)\n";
  65.                     }
  66.                     else {
  67.                         isNotCorrect = false;
  68.                     }
  69.                 } while (isNotCorrect);
  70.                 i = 1;
  71.                 while (!isNotCorrect && (i < k - 1)) {
  72.                     vpr1 = (coordinates[k][0] - coordinates[k - 1][0]) * (coordinates[i - 1][1] - coordinates[k - 1][1]) - (coordinates[i - 1][0] - coordinates[k - 1][0]) * (coordinates[k][1] - coordinates[k - 1][1]);
  73.                     vpr2 = (coordinates[k][0] - coordinates[k - 1][0]) * (coordinates[i][1] - coordinates[k - 1][1]) - (coordinates[i][0] - coordinates[k - 1][0]) * (coordinates[k][1] - coordinates[k - 1][1]);
  74.                     vpr3 = (coordinates[i][0] - coordinates[i - 1][0]) * (coordinates[k - 1][1] - coordinates[i - 1][1]) - (coordinates[k - 1][0] - coordinates[i - 1][0]) * (coordinates[i][1] - coordinates[i - 1][1]);
  75.                     vpr4 = (coordinates[i][0] - coordinates[i - 1][0]) * (coordinates[k][1] - coordinates[i - 1][1]) - (coordinates[k][0] - coordinates[i - 1][0]) * (coordinates[i][1] - coordinates[i - 1][1]);
  76.                     if (((!vpr1 && vpr2) || (vpr1 && !vpr2)) && ((!vpr3 && vpr4) || (vpr3 && !vpr4)) || (((vpr1 > 0 && vpr2 < 0) || (vpr1 < 0 && vpr2 > 0)) && ((vpr3 > 0 && vpr4 < 0) || (vpr3 < 0 && vpr4 > 0)))) {
  77.                         cout << "Вы ввели координаты вершин самопересекающегося многоугольника! Повторите ввод." << '\n';
  78.                         isNotCorrect = true;
  79.                     }
  80.                     i++;
  81.                 }
  82.             } while (isNotCorrect);
  83.         }
  84.         coordinates[n][0] = coordinates[0][0];
  85.         coordinates[n][1] = coordinates[0][1];
  86.         i = 2;
  87.         while (!isNotCorrect && (i < n - 1)) {
  88.             vpr1 = (coordinates[n][0] - coordinates[n - 1][0]) * (coordinates[i - 1][1] - coordinates[n - 1][1]) - (coordinates[i - 1][0] - coordinates[n - 1][0]) * (coordinates[n][1] - coordinates[n - 1][1]);
  89.             vpr2 = (coordinates[n][0] - coordinates[n - 1][0]) * (coordinates[i][1] - coordinates[n - 1][1]) - (coordinates[i][0] - coordinates[n - 1][0]) * (coordinates[n][1] - coordinates[n - 1][1]);
  90.             vpr3 = (coordinates[i][0] - coordinates[i - 1][0]) * (coordinates[n - 1][1] - coordinates[i - 1][1]) - (coordinates[n - 1][0] - coordinates[i - 1][0]) * (coordinates[i][1] - coordinates[i - 1][1]);
  91.             vpr4 = (coordinates[i][0] - coordinates[i - 1][0]) * (coordinates[n][1] - coordinates[i - 1][1]) - (coordinates[n][0] - coordinates[i - 1][0]) * (coordinates[i][1] - coordinates[i - 1][1]);
  92.             if (((!vpr1 && vpr2) || (vpr1 && !vpr2)) && ((!vpr3 && vpr4) || (vpr3 && !vpr4)) || (((vpr1 > 0 && vpr2 < 0) || (vpr1 < 0 && vpr2 > 0)) && ((vpr3 > 0 && vpr4 < 0) || (vpr3 < 0 && vpr4 > 0)))) {
  93.                 cout << "Вы ввели координаты вершин самопересекающегося многоугольника! Повторите ввод." << '\n';
  94.                 isNotCorrect = true;
  95.             }
  96.             i++;
  97.         }
  98.     } while (isNotCorrect);
  99.     for (int i = n; i > 0; i--) {
  100.         area = area + coordinates[i - 1][0] * coordinates[i][1] - coordinates[i - 1][1] * coordinates[i][0];
  101.     }
  102.     area = abs(area / 2);
  103.     cout << setprecision(5);
  104.     cout << "Площадь заданного многоугольника равна " << area << '\n';
  105.     return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement