Advertisement
LisunovaMaryna

pizdzec_neiki c++

Nov 14th, 2023
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.37 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #define MINSIZE 3
  4. #define EPSILON 0.0000000000000001
  5.  
  6. int main()
  7. {
  8.     setlocale(LC_ALL, "ru");
  9.     bool isCorrect;
  10.     int numbOfVersh;
  11.     int i;
  12.     int k;
  13.     double perimetr;
  14.  
  15.     std::cout << "Эта программа определяет периметр N - угольника по заданным вершинам.\n";
  16.     std::cout << "Введите количество вершин многоугольника : ";
  17.     do
  18.     {
  19.         isCorrect = true;
  20.         std::cin >> numbOfVersh;
  21.         if (std::cin.fail())
  22.         {
  23.             std::cin.clear();
  24.             while (std::cin.get() != '\n');
  25.             isCorrect = false;
  26.             std::cerr << "Проверьте правильность ввода и повторите попытку.";
  27.         }
  28.         if (isCorrect && std::cin.get() != '\n')
  29.         {
  30.             std::cin.clear();
  31.             while (std::cin.get() != '\n');
  32.             std::cerr << "Проверьте правильность ввода и повторите попытку.";
  33.             isCorrect = false;
  34.         }
  35.         if (isCorrect && numbOfVersh < MINSIZE) {
  36.             std::cerr << "Многоугольник должен иметь хотябы 3 вершины. Повторите попытку.";
  37.             isCorrect = false;
  38.         }
  39.     } while (!isCorrect);
  40.  
  41.     int* x = new int[numbOfVersh];
  42.     int* y = new int[numbOfVersh];
  43.  
  44.     for (i = 0; i < numbOfVersh; i++)
  45.     {
  46.         do
  47.         {
  48.             do
  49.             {
  50.                 std::cout << "Введите абсциссу " << i + 1 << " точки: ";
  51.                 isCorrect = true;
  52.                 std::cin >> x[i];
  53.                 if (std::cin.fail())
  54.                 {
  55.                     std::cin.clear();
  56.                     while (std::cin.get() != '\n');
  57.                     isCorrect = false;
  58.                     std::cerr << "Проверьте правильность ввода и повторите попытку.";
  59.                 }
  60.                 if (isCorrect && std::cin.get() != '\n')
  61.                 {
  62.                     std::cin.clear();
  63.                     while (std::cin.get() != '\n');
  64.                     std::cerr << "Проверьте правильность ввода и повторите попытку.";
  65.                     isCorrect = false;
  66.                 }
  67.             } while (!isCorrect);
  68.             do
  69.             {
  70.                 std::cout << "Введите ординату " << i + 1 << " точки: ";
  71.                 isCorrect = true;
  72.                 std::cin >> y[i];
  73.                 if (std::cin.fail())
  74.                 {
  75.                     std::cin.clear();
  76.                     while (std::cin.get() != '\n');
  77.                     isCorrect = false;
  78.                     std::cerr << "Проверьте правильность ввода и повторите попытку.";
  79.                 }
  80.                 if (isCorrect && std::cin.get() != '\n')
  81.                 {
  82.                     std::cin.clear();
  83.                     while (std::cin.get() != '\n');
  84.                     std::cerr << "Проверьте правильность ввода и повторите попытку.";
  85.                     isCorrect = false;
  86.                 }
  87.             } while (!isCorrect);
  88.  
  89.             for (k = 0; k < i; k++)
  90.             {
  91.                 if ((isCorrect) && (abs(x[i] - x[k]) < EPSILON) && (abs(y[i] - y[k]) < EPSILON))
  92.                 {
  93.                     isCorrect = false;
  94.                 }
  95.                 std::cerr << "Координаты точки схожи с одной из предыдущих. Введите другие значения.";
  96.             }
  97.  
  98.             if ((isCorrect) && (i > 1))
  99.             {
  100.                 for (k = 0; k < i - 1; k++)
  101.                 {
  102.                     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])))
  103.                     {
  104.                         isCorrect = false;
  105.                     }
  106.                 }
  107.                 if (isCorrect && (y[i - 2] - y[i - 1]) * (x[i] - x[i - 1]) == (x[i - 2] - x[i - 1]) * (y[i] - y[i - 1]))
  108.                 {
  109.                     isCorrect = false;
  110.                 }
  111.                 if (isCorrect && (i == numbOfVersh - 1))
  112.                 {
  113.                     for (k = 1; k < i; k++)
  114.                     {
  115.                         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])))
  116.                         {
  117.                             isCorrect = false;
  118.                         }
  119.                     }
  120.                     if ((y[1] - y[i]) * (x[0] - x[i]) == (x[1] - x[i]) * (y[0] - y[i]))
  121.                     {
  122.                         isCorrect = false;
  123.                     }
  124.                 }
  125.                 if (!isCorrect)
  126.                 {
  127.                     std::cerr << "При использовании этой точки многоугольник не получится. Выберите другие значения.";
  128.                 }
  129.             }
  130.         } while (!isCorrect);
  131.     }
  132.     perimetr = sqrt((x[1] - x[0]) * (x[1] - x[0]) + (y[1] - y[0]) * (y[1] - y[0]));
  133.     for (i = 2; i < numbOfVersh; i++)
  134.     {
  135.         perimetr = perimetr + sqrt((x[i] - x[i - 1]) * (x[i] - x[i - 1]) + (y[i] - y[i - 1]) * (y[i] - y[i - 1]));
  136.     }
  137.     perimetr = perimetr + sqrt((x[0] - x[numbOfVersh - 1]) * (x[0] - x[numbOfVersh - 1]) + (y[0] - y[numbOfVersh - 1]) * (y[0] - y[numbOfVersh - 1]));
  138.     std::cout << "Периметр многоугольника = " << perimetr; "% .3f";
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement