Загрузка данных
#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;
}