Advertisement
Vernon_Roche

Задание 1 С++ (Лабораторная работа 2)

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