Загрузка данных


#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>

#ifdef _WIN32
#include <windows.h>
#endif

// =========================================================
// ВЫБОР КОМПИЛЯЦИИ В НАЧАЛЕ ПРОГРАММЫ (Условная компиляция)
// Раскомментируйте нужную задачу. Можно включить обе.
// =========================================================
#define COMPILE_TASK_1
// #define COMPILE_TASK_2
// =========================================================

// =========================================================
// ЗАДАЧА 1: Числа Фибоначчи (с использованием макросов)
// =========================================================
#ifdef COMPILE_TASK_1

// Рекурсивная функция
void printFibonacci(int a, int b) {
    if (a > 584) {
        printf("\n");
        return;
    }
    printf("%d ", a);
    printFibonacci(b, a + b);
}

// --- ЗАМЕНА ВЫЗОВА ФУНКЦИИ НА КОМАНДУ С ПОМОЩЬЮ ДИРЕКТИВЫ ---
// Вместо того чтобы писать printFibonacci(0, 1) в main, мы создаем макрос.
// Аргументы (0 и 1) заменяются параметрами макроса.
#define RUN_FIBONACCI_SEQUENCE printFibonacci(0, 1)

#endif

// =========================================================
// ЗАДАЧА 2: Игра "Сапёр" (с использованием макросов)
// =========================================================
#ifdef COMPILE_TASK_2

#define SIZE 5

int field[SIZE][SIZE];
int revealed[SIZE][SIZE];
int targetValue;

void printBoard() {
    printf("\nТекущее поле (X - закрыто, число - открыто):\n");
    printf("   ");
    for (int i = 0; i < SIZE; i++) printf("%d ", i);
    printf("\n");
    
    for (int i = 0; i < SIZE; i++) {
        printf("%d: ", i);
        for (int j = 0; j < SIZE; j++) {
            if (revealed[i][j] == 1) {
                printf("%d ", field[i][j]);
            } else {
                printf("X ");
            }
        }
        printf("\n");
    }
    printf("\n");
}

void openNeighbors(int r, int c) {
    if (r < 0 || r >= SIZE || c < 0 || c >= SIZE) return;
    if (revealed[r][c] == 1) return;
    if (field[r][c] == targetValue) {
        revealed[r][c] = 1;
        openNeighbors(r - 1, c);
        openNeighbors(r + 1, c);
        openNeighbors(r, c - 1);
        openNeighbors(r, c + 1);
    }
}

// --- ЗАМЕНА ВЫЗОВОВ ФУНКЦИЙ НА КОМАНДЫ С ПОМОЩЬЮ ДИРЕКТИВ ---
// Заменяем вызовы на макросы, чтобы соответствовать требованию.
#define INIT_GAME() srand(time(NULL))
#define PRINT_BOARD() printBoard()
#define CHECK_NEIGHBORS(r, c) openNeighbors(r, c)

void runTask2() {
    INIT_GAME(); // Использование макроса вместо srand(time(NULL))
    
    printf("--- Задача 2: Игра 'Сапёр' ---\n");
    printf("Введите число для поиска (от 0 до 127): ");
    if (scanf("%d", &targetValue) != 1) return;

    for (int i = 0; i < SIZE; i++) {
        for (int j = 0; j < SIZE; j++) {
            field[i][j] = rand() % 128;
            revealed[i][j] = 0;
        }
    }
    
    PRINT_BOARD(); // Использование макроса

    int row, col;
    int totalTargets = 0;
    for (int i = 0; i < SIZE; i++) 
        for (int j = 0; j < SIZE; j++) 
            if (field[i][j] == targetValue) totalTargets++;

    if (totalTargets == 0) {
        printf("На поле нет числа %d. Игра окончена.\n", targetValue);
        return;
    }
    printf("На поле %d клеток со значением %d.\n", totalTargets, targetValue);

    while (1) {
        printf("Введите координаты (строка и столбец): ");
        if (scanf("%d %d", &row, &col) != 2) {
            while(getchar() != '\n'); 
            continue;
        }

        if (row < 0 || row >= SIZE || col < 0 || col >= SIZE) {
            printf("Координаты вне диапазона.\n");
            continue;
        }
        if (revealed[row][col] == 1) {
            printf("Клетка уже открыта.\n");
            continue;
        }

        if (field[row][col] == targetValue) {
            printf("Совпадение! Открываем соседние клетки.\n");
            CHECK_NEIGHBORS(row, col); // Использование макроса с аргументами
        } else {
            printf("Мимо! Значение: %d\n", field[row][col]);
            revealed[row][col] = 1;
        }

        PRINT_BOARD(); // Использование макроса

        int currentOpened = 0;
        for (int i = 0; i < SIZE; i++) 
            for (int j = 0; j < SIZE; j++) 
                if (revealed[i][j] == 1 && field[i][j] == targetValue) currentOpened++;

        if (currentOpened == totalTargets) {
            printf("\nПОЗДРАВЛЯЕМ! Вы открыли все клетки!\n");
            break;
        }
    }
}
#endif

// =========================================================
// ГЛАВНАЯ ФУНКЦИЯ
// =========================================================
int main() {
    #ifdef _WIN32
        SetConsoleCP(65001);       
        SetConsoleOutputCP(65001); 
    #endif
    setlocale(LC_ALL, "ru_RU.UTF-8");

    printf("========================================\n");
    
    // Вызов задач через макросы (команды)
    #ifdef COMPILE_TASK_1
        printf("--- Задача 1: Последовательность Фибоначчи ---\n");
        printf("Результат: ");
        RUN_FIBONACCI_SEQUENCE; // <-- Вызов команды (макроса)
        printf("\n");
    #endif

    #ifdef COMPILE_TASK_2
        runTask2();
    #endif

    printf("========================================\n");
    printf("Нажмите Enter для выхода...");
    getchar(); getchar(); 
    return 0;
}