JavaRush /Курсы /Kotlin SELF /Вложенные if, многоуровневая логика

Вложенные if, многоуровневая логика

Kotlin SELF
3 уровень , 2 лекция
Открыта

1. Базовый синтаксис вложенного if

В реальной жизни редко встретишь ситуацию, когда решение принимается только по одному критерию. Обычно приходится проверять сразу несколько условий, и они часто зависят друг от друга. Например, чтобы попасть на концерт, недостаточно быть просто взрослым — иногда нужно быть ещё и в списке приглашённых. Вот тут на сцену выходит так называемая многоуровневая логика, и помогают нам в этом вложенные операторы if.

Вложенные условия — это когда один if живёт внутри другого. Представьте себе коробку в коробке: если первая коробка открылась (условие выполнилось), тогда смотрим, что внутри и, возможно, открываем вторую. С точки зрения кода и логики это очень мощный инструмент.

Начнём с простого:

if (условиеА)
{
    // действия, если условиеА — true (истина)
    if (условиеБ)
    {
        // действия, если оба условия истинны
    }
}
Вложенный if внутри другого if

Если вам это напоминает матрёшку — вы всё понимаете правильно! Вложенный if внутри внешнего будет выполняться только если внешний сработал.

Пример: проход в клуб

Давайте разовьём наше учебное приложение, где пользователь ранее вводил имя и возраст. Теперь добавим второй уровень проверки: допустим, чтобы попасть в закрытый клуб, нужно быть старше 21 года и иметь пригласительный код.

fun main() {
    print("Введите ваше имя: ")
    val name = readln()

    print("Введите ваш возраст: ")
    val age = readln().toInt()

    if (age >= 21) {
        print("Введите пригласительный код: ")
        val code = readln()

        if (code == "VIP2026") {
            println("Добро пожаловать, $name, в VIP-клуб!")
        } else {
            println("Извините, неверный код. Доступ запрещён.")
        }
    } else {
        println("Извините, вход только с 21 года!")
    }
}

Обратите внимание: внутренний if проверяет код только если возраст уже прошёл проверку. Это экономит ресурсы (и не нервирует охранника).

2. Сколько уровней вложенности допустимо?

Технически — сколько угодно. Но по факту — чем больше вложенных уровней, тем сложнее читать и поддерживать такой код. На практике редко используют вложенность больше 23 уровней. Если возникают ситуации с «лесенками» из 4 и более вложенных if, стоит задуматься: возможно, есть способ упростить логику или вынести часть проверки в отдельные функции (а это тема отдельной лекции!).

Вложенность условий: иллюстрация

3. Вложенные if и else: ловушки и нюансы

Ошибка новичков: небрежное оформление фигурных скобок.

Когда вы пишете вложенные условия, особенно при использовании else, Kotlin строго следует правилам синтаксиса. Если не добавить фигурные скобки {}, то к if или else относится только первая строка после них. Это частый источник досадных багов.

Пример с потенциальной ошибкой:

if (age >= 21)
    if (code == "VIP2026")
        println("Добро пожаловать!");
else
    println("Неверный код.");

Многие ожидают, что else относится к проверке возраста, но на самом деле оно относится к ближайшему перед ним if (проверке кода приглашения). Из-за этого сообщения могут показываться не так, как ожидалось. Лучше всегда использовать скобки — даже если внутри только одна строка!

Чтобы не было недопонимания, покажу ещё раз. Компилятор воспринимает код выше вот так:

if (age >= 21)
{    
    if (code == "VIP2026")
       println("Добро пожаловать!");
else
    println("Неверный код.");
}

Важно! Ещё раз: Если в конструкции if-else не расставлены фигурные скобки, else относится к предыдущему (ближайшему к нему) if-у.

4. Альтернативы: else if во вложенных условиях

Иногда внутри внешнего if хочется не только проверить одно дополнительное условие, но и предусмотреть альтернативу. Например, если пригласительный код не подошёл, можно предложить купить билет. Это делается вложенной конструкцией else if/else:

fun main() {
    print("Введите ваш возраст: ")
    val age = readln().toInt()

    if (age >= 21) {
        print("Введите пригласительный код: ")
        val code = readln()

        if (code == "VIP2026") {
            println("Добро пожаловать в клуб!")
        } else if (code == "GUEST") {
            println("Гостевой режим: доступ только до 23:00.")
        } else {
            println("Увы, доступ невозможен.")
        }
    } else {
        println("Вход только с 21 года.")
    }
}

В этом примере мы сделали вложенный выбор между тремя сценариями: VIP-код, гостевой код и отказ.

5. Практика: калькулятор скидки с многоуровневой логикой

Давайте напишем такое приложение: пользователю начисляется скидка в магазине на основе возраста и наличия клубной карты.

  • Если возраст пользователя больше или равен 60 — скидка 15%.
  • Если возраст меньше, но у пользователя есть клубная карта — скидка 7%.
  • В остальных случаях скидки нет.

Как это оформить?

fun main() {
    print("Введите ваш возраст: ")
    val age = readln().toInt()

    var discount = 0.0

    if (age >= 60) {
        discount = 0.15
    } else {
        print("Есть ли у вас клубная карта (да/нет)? ")
        val hasCard = readln()

        if (hasCard == "да") {
            discount = 0.07
        }
    }

    println("Ваша скидка: ${discount * 100}%")
}

Здесь мы использовали вложенный if внутри ветки else. Если возраст не подошёл, только тогда спрашиваем про карту.

1
Задача
Kotlin SELF, 3 уровень, 2 лекция
Недоступна
Дуэль чисел
Дуэль чисел
1
Задача
Kotlin SELF, 3 уровень, 2 лекция
Недоступна
Пропуск в чат
Пропуск в чат
1
Задача
Kotlin SELF, 3 уровень, 2 лекция
Недоступна
Термометр настроения
Термометр настроения
1
Задача
Kotlin SELF, 3 уровень, 2 лекция
Недоступна
Проверка экзамена
Проверка экзамена
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ