Условные конструкции
Что такое условные конструкции
Условные конструкции позволяют программе выполнять разный код в зависимости от условий.
int age = 17;
if (age >= 18) {
printf("Совершеннолетний\n");
} else {
printf("Несовершеннолетний\n");
}
Конструкция if
Самая простая форма условного выполнения.
Базовый синтаксис
#include <stdio.h>
int main() {
int temperature = 25;
if (temperature > 30) {
printf("Жарко! Включаем кондиционер\n");
}
if (temperature < 10) {
printf("Холодно! Включаем отопление\n");
}
if (temperature >= 18 && temperature <= 25) {
printf("Комфортная температура\n");
}
return 0;
}
Блоки кода
- Одна инструкция
- Несколько инструкций
int score = 95;
// Без фигурных скобок - только одна инструкция
if (score >= 90)
printf("Отличная работа!\n");
// Лучше всегда использовать скобки для ясности
if (score >= 90) {
printf("Отличная работа!\n");
}
int balance = 500;
int cost = 300;
// Фигурные скобки обязательны для нескольких инструкций
if (balance >= cost) {
balance -= cost;
printf("Покупка совершена\n");
printf("Остаток: %d рублей\n", balance);
}
Конструкция if-else
Выполняет один блок кода, если условие истинно, и другой — если ложно.
#include <stdio.h>
int main() {
int password = 1234;
int userInput = 1234;
if (userInput == password) {
printf("✓ Пароль верный\n");
printf("Добро пожаловать в систему!\n");
} else {
printf("✗ Неверный пароль\n");
printf("Доступ запрещен\n");
}
return 0;
}
Множественные условия (if-else if-else)
Проверка нескольких условий по порядку.
Система оценок
#include <stdio.h>
int main() {
int points = 87;
printf("Набрано баллов: %d\n", points);
printf("Оценка: ");
if (points >= 90) {
printf("Отлично (A)\n");
} else if (points >= 80) {
printf("Хорошо (B)\n");
} else if (points >= 70) {
printf("Удовлетворительно (C)\n");
} else if (points >= 60) {
printf("Зачет (D)\n");
} else {
printf("Незачет (F)\n");
}
return 0;
}
Определение времени года
- По месяцам
- Детальная проверка
#include <stdio.h>
int main() {
int month = 7; // Июль
if (month == 12 || month == 1 || month == 2) {
printf("Зима\n");
} else if (month >= 3 && month <= 5) {
printf("Весна\n");
} else if (month >= 6 && month <= 8) {
printf("Лето\n");
} else if (month >= 9 && month <= 11) {
printf("Осень\n");
} else {
printf("Неверный номер месяца\n");
}
return 0;
}
int day = 15;
int month = 3;
if (month < 1 || month > 12) {
printf("Ошибка: неверный месяц\n");
} else if (day < 1 || day > 31) {
printf("Ошибка: неверный день\n");
} else {
printf("Дата корректна: %d.%d\n", day, month);
if ((month == 3 && day >= 20) || month == 4 || month == 5 || (month == 6 && day < 21)) {
printf("Время года: Весна\n");
}
}
Конструкция switch
Эффективная замена длинной цепочки if-else для проверки одной переменной на разные значения.
Базовый switch
#include <stdio.h>
int main() {
int dayNumber = 3;
printf("День недели #%d: ", dayNumber);
switch (dayNumber) {
case 1:
printf("Понедельник\n");
break;
case 2:
printf("Вторник\n");
break;
case 3:
printf("Среда\n");
break;
case 4:
printf("Четверг\n");
break;
case 5:
printf("Пятница\n");
break;
case 6:
printf("Суббота\n");
break;
case 7:
printf("Воскресенье\n");
break;
default:
printf("Неверный номер дня\n");
break;
}
return 0;
}
Группировка случаев
- Проваливание между case
- Простой калькулятор
#include <stdio.h>
int main() {
char grade = 'B';
printf("Оценка %c: ", grade);
switch (grade) {
case 'A':
case 'a':
printf("Отлично! Поздравляем!\n");
break;
case 'B':
case 'b':
printf("Хорошо! Продолжайте в том же духе\n");
break;
case 'C':
case 'c':
printf("Удовлетворительно\n");
break;
case 'D':
case 'd':
case 'F':
case 'f':
printf("Нужно подтянуть знания\n");
break;
default:
printf("Неизвестная оценка\n");
}
return 0;
}
#include <stdio.h>
int main() {
int num1 = 10;
int num2 = 3;
char operation = '/';
printf("%d %c %d = ", num1, operation, num2);
switch (operation) {
case '+':
printf("%d\n", num1 + num2);
break;
case '-':
printf("%d\n", num1 - num2);
break;
case '*':
printf("%d\n", num1 * num2);
break;
case '/':
if (num2 != 0) {
printf("%.2f\n", (float)num1 / num2);
} else {
printf("Ошибка: деление на ноль!\n");
}
break;
default:
printf("Неизвестная операция\n");
}
return 0;
}
Вложенные условия
Условия внутри других условий для сложной логики.
#include <stdio.h>
int main() {
int age = 25;
int hasLicense = 1;
int hasInsurance = 0;
printf("Проверка права вождения:\n");
if (age >= 18) {
printf("✓ Возраст подходит\n");
if (hasLicense) {
printf("✓ Права есть\n");
if (hasInsurance) {
printf("✓ Страховка оформлена\n");
printf("Результат: Можно садиться за руль!\n");
} else {
printf("✗ Нет страховки\n");
printf("Результат: Нужно оформить страховку\n");
}
} else {
printf("✗ Нет водительских прав\n");
printf("Результат: Нужно получить права\n");
}
} else {
printf("✗ Слишком молод\n");
printf("Результат: Подождите до 18 лет\n");
}
return 0;
}
Тернарный оператор
Сокращенная форма if-else для простых случаев.
Синтаксис
условие ? значение_если_истина : значение_если_ложь
Примеры использования
- Базовое использование
- Присваивание значений
- Вложенные тернарники
#include <stdio.h>
int main() {
int age = 16;
// Обычный if-else
if (age >= 18) {
printf("Статус: Взрослый\n");
} else {
printf("Статус: Несовершеннолетний\n");
}
// Тернарный оператор
printf("Статус: %s\n", age >= 18 ? "Взрослый" : "Несовершеннолетний");
return 0;
}
int score = 75;
int bonus = score > 80 ? 10 : 0; // Бонус только при высоком счете
printf("Счет: %d, бонус: %d\n", score, bonus);
// Выбор максимального значения
int a = 15, b = 23;
int max = a > b ? a : b;
printf("Максимальное из %d и %d: %d\n", a, b, max);
int temperature = 22;
// Вложенные тернарные операторы (использовать осторожно!)
printf("Погода: %s\n",
temperature > 25 ? "Жарко" :
temperature > 15 ? "Тепло" :
temperature > 5 ? "Прохладно" : "Холодно");
Практические примеры
Система входа в систему
#include <stdio.h>
int main() {
char username[] = "admin";
char password[] = "12345";
char inputUser[] = "admin";
char inputPass[] = "12345";
int userMatch = 1; // Упрощено для примера
int passMatch = 1; // В реальности используйте strcmp()
if (userMatch && passMatch) {
printf("🟢 Вход выполнен успешно\n");
printf("Добро пожаловать, %s!\n", username);
} else {
printf("🔴 Ошибка входа\n");
if (!userMatch) {
printf("Неверное имя пользователя\n");
}
if (!passMatch) {
printf("Неверный пароль\n");
}
}
return 0;
}
Банковские операции
#include <stdio.h>
int main() {
float balance = 1500.50;
float withdrawal = 800.00;
int accountType = 2; // 1 = обычный, 2 = премиум
printf("Баланс: %.2f руб.\n", balance);
printf("Запрос на снятие: %.2f руб.\n", withdrawal);
// Проверка лимитов в зависимости от типа счета
float dailyLimit;
if (accountType == 1) {
dailyLimit = 1000.00;
printf("Тип счета: Обычный\n");
} else if (accountType == 2) {
dailyLimit = 5000.00;
printf("Тип счета: Премиум\n");
} else {
dailyLimit = 500.00;
printf("Тип счета: Базовый\n");
}
printf("Дневной лимит: %.2f руб.\n", dailyLimit);
// Проверка возможности операции
if (withdrawal > balance) {
printf("❌ Недостаточно средств на счете\n");
} else if (withdrawal > dailyLimit) {
printf("❌ Превышен дневной лимит\n");
} else {
balance -= withdrawal;
printf("✅ Операция выполнена успешно\n");
printf("Новый баланс: %.2f руб.\n", balance);
}
return 0;
}
Конструкция switch-case
Эффективная альтернатива для множественного выбора.
Меню программы
#include <stdio.h>
int main() {
int choice = 2;
printf("=== ГЛАВНОЕ МЕНЮ ===\n");
printf("1. Новая игра\n");
printf("2. Загрузить игру\n");
printf("3. Настройки\n");
printf("4. Выход\n");
printf("Ваш выбор: %d\n\n", choice);
switch (choice) {
case 1:
printf("🎮 Запуск новой игры...\n");
printf("Создание персонажа\n");
break;
case 2:
printf("💾 Загрузка сохраненной игры...\n");
printf("Найдено 3 сохранения\n");
break;
case 3:
printf("⚙️ Открытие настроек...\n");
printf("Графика | Звук | Управление\n");
break;
case 4:
printf("👋 Выход из игры\n");
printf("До свидания!\n");
break;
default:
printf("❌ Неверный выбор\n");
printf("Выберите пункт от 1 до 4\n");
}
return 0;
}
Обработка символьных команд
- Текстовые команды
- Проваливание без break
#include <stdio.h>
int main() {
char command = 'S';
int gameRunning = 1;
printf("Команда: %c\n", command);
switch (command) {
case 'W':
case 'w':
printf("⬆️ Движение вперед\n");
break;
case 'S':
case 's':
printf("⬇️ Движение назад\n");
break;
case 'A':
case 'a':
printf("⬅️ Движение влево\n");
break;
case 'D':
case 'd':
printf("➡️ Движение вправо\n");
break;
case 'Q':
case 'q':
printf("🚪 Выход из игры\n");
gameRunning = 0;
break;
default:
printf("❓ Неизвестная команда\n");
}
printf("Игра активна: %s\n", gameRunning ? "Да" : "Нет");
return 0;
}
int month = 6;
int days;
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days = 31;
break;
case 4: case 6: case 9: case 11:
days = 30;
break;
case 2:
days = 28; // Упрощено, без учета високосного года
break;
default:
days = 0;
printf("Неверный номер месяца\n");
}
if (days > 0) {
printf("В месяце #%d: %d дней\n", month, days);
}
Логические условия
Сложные проверки
#include <stdio.h>
int main() {
int hour = 14;
int isWeekend = 0;
int isHoliday = 0;
// Определяем режим работы
if ((hour >= 9 && hour < 18) && !isWeekend && !isHoliday) {
printf("🏢 Офис открыт\n");
printf("Рабочее время: 9:00 - 18:00\n");
} else if (isWeekend) {
printf("🏠 Выходной день\n");
printf("Офис закрыт\n");
} else if (isHoliday) {
printf("🎉 Праздничный день\n");
printf("Офис закрыт\n");
} else {
printf("🌙 Нерабочее время\n");
printf("Офис закрыт до 9:00\n");
}
return 0;
}
Проверка диапазонов
#include <stdio.h>
int main() {
int speed = 75; // км/ч
int speedLimit = 60;
printf("Скорость: %d км/ч\n", speed);
printf("Ограничение: %d км/ч\n", speedLimit);
if (speed <= speedLimit) {
printf("✅ Скорость в норме\n");
} else if (speed <= speedLimit + 20) {
printf("⚠️ Превышение скорости\n");
printf("Штраф: 500 рублей\n");
} else if (speed <= speedLimit + 40) {
printf("🚨 Серьезное превышение\n");
printf("Штраф: 1500 рублей\n");
} else {
printf("🚔 Критическое превышение\n");
printf("Лишение прав на 6 месяцев\n");
}
return 0;
}
Частые ошибки
Типичные проблемы
// ❌ Забыть break в switch
switch (grade) {
case 'A':
printf("Отлично\n");
// Забыли break! Выполнится и следующий case
case 'B':
printf("Хорошо\n");
break;
}
// ❌ Путаница = и ==
if (x = 5) { // Присваивание вместо сравнения!
// ❌ Неправильная проверка диапазона
if (10 < x < 20) { // Не работает как ожидается
// Правильно:
if (x > 10 && x < 20) {
// ❌ Отсутствие фигурных скобок
if (condition)
printf("Первая строка\n");
printf("Вторая строка\n"); // Выполнится всегда!
Важные моменты
- В
switchможно использовать только целочисленные типы и символы - Всегда добавляйте
breakв конце каждогоcase - Используйте
defaultдля обработки неожиданных значений - Фигурные скобки делают код понятнее, даже если не обязательны
Лучшие практики
Советы по стилю
// ✅ Хороший стиль
if (age >= 18) {
printf("Совершеннолетний\n");
} else {
printf("Несовершеннолетний\n");
}
// ✅ Проверка на валидность сначала
if (denominator == 0) {
printf("Ошибка: деление на ноль\n");
} else {
float result = numerator / denominator;
printf("Результат: %.2f\n", result);
}
// ✅ Используйте константы вместо магических чисел
const int ADULT_AGE = 18;
if (age >= ADULT_AGE) {
// понятнее чем if (age >= 18)
}
Условные конструкции — основа логики программ, позволяющая создавать интерактивные и адаптивные приложения.