С Программа для координирует испытательных образцов

Как написать программу C , чтобы координаты испытательные образцы в Язык программирования C ?

ограничение на количество вершин в файле = SIZE, определяем реальное количество вершин
максимальное значение х
максимальный у для заданного х, пихать надо массив со ВСЕМИ точками
элементы с четными индексами - иксы
берем все точки с необходимым иксом и ищем там самую большую
минимальный у для заданного х, пихать надо массив со ВСЕМИ точками
подсчет площади столбиками, дырки пропускает
тут в итоге будут ВСЕ точки
amount - количество промежуточных по горизонтали точек
вот этот кусок работает неправильно, тут мы кладем в массив arrcomplete все точки


Solution:

  1. #include <stdio.h>//находит максимум/минимум неправильно
  2. #define SIZE 100
  3. #define PNUM 16
  4.  
  5. int find_arr_size (int* arr, int* arr_size) //ограничение на количество вершин в файле = SIZE, определяем реальное количество вершин
  6. {
  7.     int i = 0;
  8.     arr_size = SIZE;
  9.     for (= 0 ; i < SIZE ; i++)
  10.     {
  11.         if ((arr[i] == 0) && (arr[i+1] == 0) && (arr[i+2] == 0) && (arr[i+3] == 0))
  12.         {
  13.             arr_size = i - 1;
  14.             break;
  15.         }
  16.     }
  17.     return arr_size;
  18. }
  19. int findmaxx (int arr[], int arr_size) //максимальное значение х
  20. {
  21.     int number, maximum, i;
  22.     number = maximum = 0;
  23.     for (= 0 ; i < 2 * arr_size ; i++)
  24.     {
  25.         number = arr[i];
  26.         if (% 2 == 0)
  27.         {
  28.             if (number > maximum)
  29.                 {
  30.                     maximum = number;
  31.                 }
  32.         }
  33.     }
  34.     return maximum;
  35. }
  36. int findminx (int arr[], int arr_size) //минимальное значение х
  37. {
  38.     int number, minimum, i;
  39.     number = minimum = 0;
  40.     for (= 0 ; i < 2 * arr_size ; i++)
  41.     {
  42.         number = arr[i];
  43.         if (% 2 == 0)
  44.         {
  45.             if (number < minimum)
  46.                 {
  47.                     minimum = number;
  48.                 }
  49.         }
  50.     }
  51.     return minimum;
  52. }
  53. int findmaxy (int x, int arr[], int arr_size) //максимальный у для заданного х, пихать надо массив со ВСЕМИ точками
  54. {
  55.     int number, maximum, i;
  56.     number = maximum = 0;
  57.     for (= 0 ; i < 2 * arr_size ; i++)
  58.     {
  59.         if (% 2 == 0) // элементы с четными индексами - иксы
  60.         {
  61.             if (arr[i] == x) // берем все точки с необходимым иксом и ищем там самую большую
  62.                 {
  63.                     number = arr[i+1];
  64.                     if (number > maximum)
  65.                     {
  66.                         maximum = number;
  67.                     }
  68.                 }
  69.         }
  70.     }
  71.     return maximum;
  72. }
  73. int findminy (int x, int arr[], int arr_size) //минимальный у для заданного х, пихать надо массив со ВСЕМИ точками
  74. {
  75.     int number, minimum, i;
  76.     number = minimum = 0;
  77.     for (= 0 ; i < 2 * arr_size ; i++)
  78.     {
  79.         if (% 2 == 0)
  80.         {
  81.             if (arr[i] == findmaxy(x, arr, arr_size))
  82.                 {
  83.                     number = arr[i+1];
  84.                     if (number < minimum)
  85.                     {
  86.                         minimum = number;
  87.                     }
  88.                 }
  89.         }
  90.     }
  91.     return minimum;
  92. }
  93. int calculate_area (int arr[], int arr_size) //подсчет площади столбиками, дырки пропускает
  94. {
  95.     int maxx = findmaxx(arr, arr_size);
  96.     int minx = findminx(arr, arr_size);
  97.     int i;
  98.     int area = 0;
  99.     for (= 0; i < (maxx-minx)+1 ; i++)
  100.     {
  101.         area += findmaxy(i, arr, arr_size) - findminy(i, arr, arr_size);
  102.     }
  103.     return area;
  104. }
  105. int main()
  106. {
  107.     FILE *figure;
  108.     figure = fopen("figure.txt", "r");
  109.     int arr[SIZE] = {0};
  110.     int arr_size = 0;
  111.     int i, j, k, s;
  112.     i = 0;
  113.     int arrcomplete[PNUM] = {0}; // тут в итоге будут ВСЕ точки
  114.     int ymax, ymin, amount, number; //amount - количество промежуточных по горизонтали точек
  115.     ymax = ymin = amount = 0;
  116.  
  117.     while (fscanf(figure, "%d", &arr[i]) != EOF) //получили координаты вершин
  118.     {
  119.         //printf("%d ", arr[i]);
  120.         i++;
  121.     }
  122.     fclose(figure);
  123.     arr_size = find_arr_size(arr, arr_size); //знаем количество вершин
  124.     i = j = k = s = 0;
  125.     printf("\n started");
  126.  
  127.     //вот этот кусок работает неправильно, тут мы кладем в массив arrcomplete все точки
  128.     for (= 0; i < 2 * arr_size ; i++)
  129.     {
  130.         //printf("i=%d ", i);
  131.         for (= 0 ; j < 2 * arr_size ; j++)
  132.         {
  133.             //printf("j=%d ", j);
  134.             if ((arr[i] == arr[j]) && (arr[i] % 2 == 1) && (arr[j] % 2 == 1) && (arr[i-1] != arr[j-1])) // все пары точек с одинаковыми У
  135.             {
  136.                 if (arr[i-1] > arr[j-1]) //для каждой пары смотрим, у кого х больше
  137.                 {
  138.                     ymax = arr[i-1];
  139.                     ymin = arr[j-1];
  140.                 }
  141.                 else
  142.                 {
  143.                     ymax = arr[j-1];
  144.                     ymin = arr[i-1];
  145.                 }
  146.                 for (= 0 ; k < (ymax - ymin) ; k++) //прогоняем все иксы в этом промежутке, включая сами точки
  147.                 {
  148.                     number = k + ymin; //х точки пробегает от ymin до ymax
  149.                     for (= 0 ; s < PNUM ; s++) //проверяем, нет ли такой точки уже
  150.                     {
  151.                         if (arrcomplete[s] == number) //если есть, зануляем данный х (просто так х никогда не равен -1)
  152.                         {
  153.                             number = -1;
  154.                         }
  155.                         if (number != -1) //новая точка! увеличиваем кол-во точек и записываем эту
  156.                         {
  157.                             arrcomplete[amount] = number;
  158.                             amount++;
  159.                             //printf("FOUND");
  160.                         }
  161.                     }
  162.                 }
  163.                 printf("\ny: %d xs: %d %d", arr[i], arr[i-1], arr[j-1]); //
  164.             }
  165.         }
  166.     }
  167.     printf("\n ended");
  168.     printf("\nAMOUNT: %d", amount); // для тестируемой фигуры это число всех точек 42
  169.  
  170.     printf("\narea: %d", calculate_area(arrcomplete, arr_size + amount)); //уже для всего массива. должна быть 38
  171.  
  172.     return 0;
  173. }
  174. //координаты тестовой фигуры:
  175. /*
  176. 0 5
  177. 0 0
  178. 3 2
  179. 3 5
  180. 5 2
  181. 5 4
  182. 5 0
  183. 5 1
  184. 8 1
  185. 8 2
  186. 8 4
  187. 8 6
  188. 9 4
  189. 9 2
  190. 12 6
  191. 12 4
  192. */


Learn More :