Advertisement
Guest User

g.c

a guest
Mar 10th, 2025
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int *coords = NULL;     // глобальный массив координат
  6. int coords_count = 0;   // количество считанных чисел
  7.  
  8. // Функция записи строки в файл (аналог append_char_to_file)
  9. void append_char_to_file(const char *str) {
  10.     FILE *file = fopen("output.txt", "ab");
  11.     if (file == NULL) {
  12.         fprintf(stderr, "Ошибка открытия файла output.txt для записи.\n");
  13.         exit(EXIT_FAILURE);
  14.     }
  15.     fputs(str, file);
  16.     fclose(file);
  17. }
  18.  
  19. // Функция, возвращающая "линии" квадрата, заданного четырьмя числами
  20. // Результат: массив из 8 чисел: [min(x1, x2), max(x1, x2), y1, y2, min(y1, y2), max(y1, y2), x1, x2]
  21. void get_square_lines(const int square[4], int lines[8]) {
  22.     int x1 = square[0], y1 = square[1], x2 = square[2], y2 = square[3];
  23.     lines[0] = (x1 < x2) ? x1 : x2;
  24.     lines[1] = (x1 > x2) ? x1 : x2;
  25.     lines[2] = y1;
  26.     lines[3] = y2;
  27.     lines[4] = (y1 < y2) ? y1 : y2;
  28.     lines[5] = (y1 > y2) ? y1 : y2;
  29.     lines[6] = x1;
  30.     lines[7] = x2;
  31. }
  32.  
  33. // Функция для получения максимальных значений x и y из глобального массива coords.
  34. // x-координаты находятся на чётных позициях, y – на нечётных.
  35. void get_max_coords(int *max_x, int *max_y) {
  36.     if (coords_count < 2) return;
  37.     *max_x = coords[0];
  38.     *max_y = coords[1];
  39.     for (int i = 0; i < coords_count; i += 2) {
  40.         if (coords[i] > *max_x)
  41.             *max_x = coords[i];
  42.     }
  43.     for (int i = 1; i < coords_count; i += 2) {
  44.         if (coords[i] > *max_y)
  45.             *max_y = coords[i];
  46.     }
  47. }
  48.  
  49. // Функция проверки точки. Если точка удовлетворяет условию для двух квадратов – выводится "*",
  50. // если для одного – "#", иначе – " ".
  51. void check_coord(int point[2]) {
  52.     int counter = 0;
  53.     int lines[8];
  54.     // Проходим по массиву координат с шагом 4
  55.     for (int i = 0; i < coords_count; i += 4) {
  56.         if (i + 3 >= coords_count)
  57.             break; // если оставшихся элементов меньше 4, то выходим
  58.         int square[4] = { coords[i], coords[i+1], coords[i+2], coords[i+3] };
  59.         get_square_lines(square, lines);
  60.         // Первое условие:
  61.         // проверяем, что координата y точки равна одному из значений lines[2] или lines[3]
  62.         // и что x точки лежит в диапазоне [lines[0], lines[1]]
  63.         int cond1 = ((point[1] == lines[2] || point[1] == lines[3]) &&
  64.                      (point[0] >= lines[0] && point[0] <= lines[1]));
  65.         // Второе условие:
  66.         // проверяем, что координата x точки равна одному из значений lines[6] или lines[7]
  67.         // и что y точки лежит в диапазоне [lines[4], lines[5]]
  68.         int cond2 = ((point[0] == lines[6] || point[0] == lines[7]) &&
  69.                      (point[1] >= lines[4] && point[1] <= lines[5]));
  70.         if (cond1 || cond2) {
  71.             counter++;
  72.             if (counter == 2) {
  73.                 append_char_to_file("*");
  74.                 return;
  75.             }
  76.         }
  77.     }
  78.     if (counter)
  79.         append_char_to_file("#");
  80.     else
  81.         append_char_to_file(" ");
  82. }
  83.  
  84. int main(int argc, char *argv[]) {
  85.     if (argc < 2) {
  86.         fprintf(stderr, "Использование: %s input_file\n", argv[0]);
  87.         return EXIT_FAILURE;
  88.     }
  89.  
  90.     // Чтение входного файла
  91.     FILE *f = fopen(argv[1], "r");
  92.     if (f == NULL) {
  93.         fprintf(stderr, "Ошибка открытия входного файла.\n");
  94.         return EXIT_FAILURE;
  95.     }
  96.     char buffer[4096];
  97.     if (fgets(buffer, sizeof(buffer), f) == NULL) {
  98.         fprintf(stderr, "Ошибка чтения из файла.\n");
  99.         fclose(f);
  100.         return EXIT_FAILURE;
  101.     }
  102.     fclose(f);
  103.  
  104.     // Подсчёт количества чисел (разделённых пробелами)
  105.     int count = 0;
  106.     char *token = strtok(buffer, " \t\n\r");
  107.     while (token != NULL) {
  108.         count++;
  109.         token = strtok(NULL, " \t\n\r");
  110.     }
  111.  
  112.     // Выделяем память для массива координат
  113.     coords = (int *)malloc(count * sizeof(int));
  114.     if (coords == NULL) {
  115.         fprintf(stderr, "Ошибка выделения памяти.\n");
  116.         return EXIT_FAILURE;
  117.     }
  118.     coords_count = count;
  119.  
  120.     // Для повторного разбора строки заново читаем файл
  121.     f = fopen(argv[1], "r");
  122.     if (f == NULL) {
  123.         fprintf(stderr, "Ошибка повторного открытия входного файла.\n");
  124.         free(coords);
  125.         return EXIT_FAILURE;
  126.     }
  127.     if (fgets(buffer, sizeof(buffer), f) == NULL) {
  128.         fprintf(stderr, "Ошибка повторного чтения файла.\n");
  129.         fclose(f);
  130.         free(coords);
  131.         return EXIT_FAILURE;
  132.     }
  133.     fclose(f);
  134.  
  135.     // Разбор строки и заполнение массива координат
  136.     token = strtok(buffer, " \t\n\r");
  137.     int index = 0;
  138.     while (token != NULL && index < count) {
  139.         coords[index++] = atoi(token);
  140.         token = strtok(NULL, " \t\n\r");
  141.     }
  142.  
  143.     // Получаем максимальные значения координат
  144.     int max_x, max_y;
  145.     get_max_coords(&max_x, &max_y);
  146.  
  147.     // Очищаем (создаём) файл output.txt
  148.     FILE *out = fopen("output.txt", "w");
  149.     if (out != NULL)
  150.         fclose(out);
  151.  
  152.     // Основной цикл: перебор точек от (0,0) до (max_x, max_y)
  153.     int point[2];
  154.     for (int x = 0; x <= max_x; x++) {
  155.         for (int y = 0; y <= max_y; y++) {
  156.             point[0] = x;
  157.             point[1] = y;
  158.             check_coord(point);
  159.         }
  160.         append_char_to_file("\n");
  161.     }
  162.  
  163.     free(coords);
  164.     return EXIT_SUCCESS;
  165. }
  166.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement