Как написать программу C , чтобы координаты испытательные образцы в Язык программирования C ?
ограничение на количество вершин в файле = SIZE, определяем реальное количество вершин
максимальное значение х
максимальный у для заданного х, пихать надо массив со ВСЕМИ точками
элементы с четными индексами - иксы
берем все точки с необходимым иксом и ищем там самую большую
минимальный у для заданного х, пихать надо массив со ВСЕМИ точками
подсчет площади столбиками, дырки пропускает
тут в итоге будут ВСЕ точки
amount - количество промежуточных по горизонтали точек
вот этот кусок работает неправильно, тут мы кладем в массив arrcomplete все точки
Solution:
- #include <stdio.h>//находит максимум/минимум неправильно
- #define SIZE 100
- #define PNUM 16
- int find_arr_size (int* arr, int* arr_size) //ограничение на количество вершин в файле = SIZE, определяем реальное количество вершин
- {
- int i = 0;
- arr_size = SIZE;
- for (i = 0 ; i < SIZE ; i++)
- {
- if ((arr[i] == 0) && (arr[i+1] == 0) && (arr[i+2] == 0) && (arr[i+3] == 0))
- {
- arr_size = i - 1;
- break;
- }
- }
- return arr_size;
- }
- int findmaxx (int arr[], int arr_size) //максимальное значение х
- {
- int number, maximum, i;
- number = maximum = 0;
- for (i = 0 ; i < 2 * arr_size ; i++)
- {
- number = arr[i];
- if (i % 2 == 0)
- {
- if (number > maximum)
- {
- maximum = number;
- }
- }
- }
- return maximum;
- }
- int findminx (int arr[], int arr_size) //минимальное значение х
- {
- int number, minimum, i;
- number = minimum = 0;
- for (i = 0 ; i < 2 * arr_size ; i++)
- {
- number = arr[i];
- if (i % 2 == 0)
- {
- if (number < minimum)
- {
- minimum = number;
- }
- }
- }
- return minimum;
- }
- int findmaxy (int x, int arr[], int arr_size) //максимальный у для заданного х, пихать надо массив со ВСЕМИ точками
- {
- int number, maximum, i;
- number = maximum = 0;
- for (i = 0 ; i < 2 * arr_size ; i++)
- {
- if (i % 2 == 0) // элементы с четными индексами - иксы
- {
- if (arr[i] == x) // берем все точки с необходимым иксом и ищем там самую большую
- {
- number = arr[i+1];
- if (number > maximum)
- {
- maximum = number;
- }
- }
- }
- }
- return maximum;
- }
- int findminy (int x, int arr[], int arr_size) //минимальный у для заданного х, пихать надо массив со ВСЕМИ точками
- {
- int number, minimum, i;
- number = minimum = 0;
- for (i = 0 ; i < 2 * arr_size ; i++)
- {
- if (i % 2 == 0)
- {
- if (arr[i] == findmaxy(x, arr, arr_size))
- {
- number = arr[i+1];
- if (number < minimum)
- {
- minimum = number;
- }
- }
- }
- }
- return minimum;
- }
- int calculate_area (int arr[], int arr_size) //подсчет площади столбиками, дырки пропускает
- {
- int maxx = findmaxx(arr, arr_size);
- int minx = findminx(arr, arr_size);
- int i;
- int area = 0;
- for (i = 0; i < (maxx-minx)+1 ; i++)
- {
- area += findmaxy(i, arr, arr_size) - findminy(i, arr, arr_size);
- }
- return area;
- }
- int main()
- {
- FILE *figure;
- figure = fopen("figure.txt", "r");
- int arr[SIZE] = {0};
- int arr_size = 0;
- int i, j, k, s;
- i = 0;
- int arrcomplete[PNUM] = {0}; // тут в итоге будут ВСЕ точки
- int ymax, ymin, amount, number; //amount - количество промежуточных по горизонтали точек
- ymax = ymin = amount = 0;
- while (fscanf(figure, "%d", &arr[i]) != EOF) //получили координаты вершин
- {
- //printf("%d ", arr[i]);
- i++;
- }
- fclose(figure);
- arr_size = find_arr_size(arr, arr_size); //знаем количество вершин
- i = j = k = s = 0;
- printf("\n started");
- //вот этот кусок работает неправильно, тут мы кладем в массив arrcomplete все точки
- for (i = 0; i < 2 * arr_size ; i++)
- {
- //printf("i=%d ", i);
- for (j = 0 ; j < 2 * arr_size ; j++)
- {
- //printf("j=%d ", j);
- if ((arr[i] == arr[j]) && (arr[i] % 2 == 1) && (arr[j] % 2 == 1) && (arr[i-1] != arr[j-1])) // все пары точек с одинаковыми У
- {
- if (arr[i-1] > arr[j-1]) //для каждой пары смотрим, у кого х больше
- {
- ymax = arr[i-1];
- ymin = arr[j-1];
- }
- else
- {
- ymax = arr[j-1];
- ymin = arr[i-1];
- }
- for (k = 0 ; k < (ymax - ymin) ; k++) //прогоняем все иксы в этом промежутке, включая сами точки
- {
- number = k + ymin; //х точки пробегает от ymin до ymax
- for (s = 0 ; s < PNUM ; s++) //проверяем, нет ли такой точки уже
- {
- if (arrcomplete[s] == number) //если есть, зануляем данный х (просто так х никогда не равен -1)
- {
- number = -1;
- }
- if (number != -1) //новая точка! увеличиваем кол-во точек и записываем эту
- {
- arrcomplete[amount] = number;
- amount++;
- //printf("FOUND");
- }
- }
- }
- printf("\ny: %d xs: %d %d", arr[i], arr[i-1], arr[j-1]); //
- }
- }
- }
- printf("\n ended");
- printf("\nAMOUNT: %d", amount); // для тестируемой фигуры это число всех точек 42
- printf("\narea: %d", calculate_area(arrcomplete, arr_size + amount)); //уже для всего массива. должна быть 38
- return 0;
- }
- //координаты тестовой фигуры:
- /*
- 0 5
- 0 0
- 3 2
- 3 5
- 5 2
- 5 4
- 5 0
- 5 1
- 8 1
- 8 2
- 8 4
- 8 6
- 9 4
- 9 2
- 12 6
- 12 4
- */