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


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

// =========================================================
// ВЫБОР ЗАДАЧИ В НАЧАЛЕ ПРОГРАММЫ (Условная компиляция)
// Раскомментируйте нужную строку. Можно включить обе.
// =========================================================
#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);
}

// ЗАМЕНА ВЫЗОВА ФУНКЦИИ НА КОМАНДУ С ПОМОЩЬЮ ДИРЕКТИВЫ
// Аргументы 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();
    
    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() {
    // Настройка кодировки для корректного отображения русского языка
    // Для Linux/macOS
    setlocale(LC_ALL, "ru_RU.UTF-8");
    // Для Windows (если не сработает, попробуйте "Russian")
    #ifdef _WIN32
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
    #endif

    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;
}