Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int *coords = NULL; // глобальный массив координат
- int coords_count = 0; // количество считанных чисел
- // Функция записи строки в файл (аналог append_char_to_file)
- void append_char_to_file(const char *str) {
- FILE *file = fopen("output.txt", "ab");
- if (file == NULL) {
- fprintf(stderr, "Ошибка открытия файла output.txt для записи.\n");
- exit(EXIT_FAILURE);
- }
- fputs(str, file);
- fclose(file);
- }
- // Функция, возвращающая "линии" квадрата, заданного четырьмя числами
- // Результат: массив из 8 чисел: [min(x1, x2), max(x1, x2), y1, y2, min(y1, y2), max(y1, y2), x1, x2]
- void get_square_lines(const int square[4], int lines[8]) {
- int x1 = square[0], y1 = square[1], x2 = square[2], y2 = square[3];
- lines[0] = (x1 < x2) ? x1 : x2;
- lines[1] = (x1 > x2) ? x1 : x2;
- lines[2] = y1;
- lines[3] = y2;
- lines[4] = (y1 < y2) ? y1 : y2;
- lines[5] = (y1 > y2) ? y1 : y2;
- lines[6] = x1;
- lines[7] = x2;
- }
- // Функция для получения максимальных значений x и y из глобального массива coords.
- // x-координаты находятся на чётных позициях, y – на нечётных.
- void get_max_coords(int *max_x, int *max_y) {
- if (coords_count < 2) return;
- *max_x = coords[0];
- *max_y = coords[1];
- for (int i = 0; i < coords_count; i += 2) {
- if (coords[i] > *max_x)
- *max_x = coords[i];
- }
- for (int i = 1; i < coords_count; i += 2) {
- if (coords[i] > *max_y)
- *max_y = coords[i];
- }
- }
- // Функция проверки точки. Если точка удовлетворяет условию для двух квадратов – выводится "*",
- // если для одного – "#", иначе – " ".
- void check_coord(int point[2]) {
- int counter = 0;
- int lines[8];
- // Проходим по массиву координат с шагом 4
- for (int i = 0; i < coords_count; i += 4) {
- if (i + 3 >= coords_count)
- break; // если оставшихся элементов меньше 4, то выходим
- int square[4] = { coords[i], coords[i+1], coords[i+2], coords[i+3] };
- get_square_lines(square, lines);
- // Первое условие:
- // проверяем, что координата y точки равна одному из значений lines[2] или lines[3]
- // и что x точки лежит в диапазоне [lines[0], lines[1]]
- int cond1 = ((point[1] == lines[2] || point[1] == lines[3]) &&
- (point[0] >= lines[0] && point[0] <= lines[1]));
- // Второе условие:
- // проверяем, что координата x точки равна одному из значений lines[6] или lines[7]
- // и что y точки лежит в диапазоне [lines[4], lines[5]]
- int cond2 = ((point[0] == lines[6] || point[0] == lines[7]) &&
- (point[1] >= lines[4] && point[1] <= lines[5]));
- if (cond1 || cond2) {
- counter++;
- if (counter == 2) {
- append_char_to_file("*");
- return;
- }
- }
- }
- if (counter)
- append_char_to_file("#");
- else
- append_char_to_file(" ");
- }
- int main(int argc, char *argv[]) {
- if (argc < 2) {
- fprintf(stderr, "Использование: %s input_file\n", argv[0]);
- return EXIT_FAILURE;
- }
- // Чтение входного файла
- FILE *f = fopen(argv[1], "r");
- if (f == NULL) {
- fprintf(stderr, "Ошибка открытия входного файла.\n");
- return EXIT_FAILURE;
- }
- char buffer[4096];
- if (fgets(buffer, sizeof(buffer), f) == NULL) {
- fprintf(stderr, "Ошибка чтения из файла.\n");
- fclose(f);
- return EXIT_FAILURE;
- }
- fclose(f);
- // Подсчёт количества чисел (разделённых пробелами)
- int count = 0;
- char *token = strtok(buffer, " \t\n\r");
- while (token != NULL) {
- count++;
- token = strtok(NULL, " \t\n\r");
- }
- // Выделяем память для массива координат
- coords = (int *)malloc(count * sizeof(int));
- if (coords == NULL) {
- fprintf(stderr, "Ошибка выделения памяти.\n");
- return EXIT_FAILURE;
- }
- coords_count = count;
- // Для повторного разбора строки заново читаем файл
- f = fopen(argv[1], "r");
- if (f == NULL) {
- fprintf(stderr, "Ошибка повторного открытия входного файла.\n");
- free(coords);
- return EXIT_FAILURE;
- }
- if (fgets(buffer, sizeof(buffer), f) == NULL) {
- fprintf(stderr, "Ошибка повторного чтения файла.\n");
- fclose(f);
- free(coords);
- return EXIT_FAILURE;
- }
- fclose(f);
- // Разбор строки и заполнение массива координат
- token = strtok(buffer, " \t\n\r");
- int index = 0;
- while (token != NULL && index < count) {
- coords[index++] = atoi(token);
- token = strtok(NULL, " \t\n\r");
- }
- // Получаем максимальные значения координат
- int max_x, max_y;
- get_max_coords(&max_x, &max_y);
- // Очищаем (создаём) файл output.txt
- FILE *out = fopen("output.txt", "w");
- if (out != NULL)
- fclose(out);
- // Основной цикл: перебор точек от (0,0) до (max_x, max_y)
- int point[2];
- for (int x = 0; x <= max_x; x++) {
- for (int y = 0; y <= max_y; y++) {
- point[0] = x;
- point[1] = y;
- check_coord(point);
- }
- append_char_to_file("\n");
- }
- free(coords);
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement