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