🎯 Kotlin

Условия (if/else/switch) в Kotlin 1.9: подробное руководство

Условные конструкции: if, else, when

Что такое условия и зачем они нужны?

Представь, что ты играешь в компьютерную игру. Если персонаж подбирает красное зелье — у него восстанавливается здоровье. Если синее — мана. А если жёлтое — он получает ускорение. Программа должна принимать решения в зависимости от ситуации. Именно для этого нужны условные конструкции.

В жизни мы постоянно делаем выбор: «Если на улице дождь, я возьму зонт. Иначе пойду без зонта». В программировании работает тот же принцип: мы задаём условие, и компьютер выполняет разные действия в зависимости от того, верно оно или нет.

Основной синтаксис: if и else

Самая простая конструкция выглядит так:

if (условие) {
    // код, который выполнится, если условие истинно
}

Условие — это выражение, которое может быть либо true (правда), либо false (ложь).

Пример 1: Проверка возраста для входа на аттракцион

fun main() {
    println("Сколько тебе лет?")
    val age = readln().toInt()

    if (age >= 14) {
        println("Проходи! Тебе можно на этот аттракцион.")
    }
}

Что здесь происходит? Мы считываем возраст. Если условие age >= 14 истинно (возраст 14 или больше), программа выведет сообщение. Если нет — ничего не произойдёт.

А что, если нужно сделать что-то и в обратном случае? Для этого есть else:

if (условие) {
    // если true
} else {
    // если false
}

Пример 2: Определяем, какое число больше

fun main() {
    println("Введи первое число:")
    val a = readln().toInt()
    println("Введи второе число:")
    val b = readln().toInt()

    if (a > b) {
        println("Первое число ($a) больше второго ($b)")
    } else {
        println("Первое число ($a) не больше второго ($b)")
    }
}

Обрати внимание: если числа равны, программа скажет, что первое не больше второго. Но это не совсем точно, правда? Для таких случаев пригодится цепочка условий.

Цепочка условий: if, else if, else

Когда вариантов больше двух, используют else if:

if (условие1) {
    // выполнится, если условие1 истинно
} else if (условие2) {
    // выполнится, если условие1 ложно, а условие2 истинно
} else {
    // выполнится, если все условия ложны
}

Пример 3: Правильное сравнение двух чисел

fun main() {
    println("Введи первое число:")
    val a = readln().toInt()
    println("Введи второе число:")
    val b = readln().toInt()

    if (a > b) {
        println("$a больше $b")
    } else if (a < b) {
        println("$a меньше $b")
    } else {
        println("$a равно $b")
    }
}

Теперь программа корректно обрабатывает все три случая!

Проверка чётности числа

Вернёмся к задаче Лизы с ракушками. Как понять, чётное число или нет? В Kotlin для этого есть оператор % (остаток от деления). Если число делится на 2 без остатка — оно чётное.

fun main() {
    println("Сколько ракушек ты нашла?")
    val shells = readln().toInt()

    if (shells % 2 == 0) {
        println("$shells — чётное число! Можно разложить парами.")
    } else {
        println("$shells — нечётное число. Одна ракушка останется без пары.")
    }
}

Множественный выбор: when (switch в Kotlin)

Когда нужно проверить одну переменную на множество значений, вместо длинной цепочки if удобнее использовать when. Это как переключатель: программа смотрит на значение и выбирает подходящий вариант.

when (переменная) {
    значение1 -> { /* действия */ }
    значение2 -> { /* действия */ }
    else -> { /* если ничего не подошло */ }
}

Пример 4: Возрастные зоны в парке аттракционов

fun main() {
    println("Сколько лет посетителю?")
    val age = readln().toInt()

    when (age) {
        in 0..3 -> println("Зона для малышей: карусельки и батут")
        in 4..7 -> println("Детская зона: горки и качели")
        in 8..12 -> println("Зона для школьников: американские горки")
        in 13..17 -> println("Подростковая зона: экстремальные аттракционы")
        in 18..100 -> println("Взрослая зона: всё включено!")
        else -> println("Возраст не определён. Обратитесь к администратору.")
    }
}

Обрати внимание на in 0..3 — это диапазон от 0 до 3 включительно. when сам проверит, попадает ли возраст в этот диапазон.

when можно использовать и с произвольными условиями, как if:

fun main() {
    println("Сколько у тебя баллов?")
    val score = readln().toInt()

    when {
        score >= 90 -> println("Отлично! Ты молодец!")
        score >= 70 -> println("Хорошо! Можно лучше.")
        score >= 50 -> println("Неплохо, но стоит подтянуть знания.")
        else -> println("Нужно больше заниматься.")
    }
}

Частые ошибки новичков

  • Забывают фигурные скобки. В Kotlin, если в блоке только одна команда, скобки можно опустить. Но новичкам лучше всегда их ставить — так код понятнее и меньше шансов ошибиться.
  • Путают = и ==. = — это присваивание (положить значение в переменную). == — это сравнение (проверить, равны ли значения). Ошибка: if (a = 5) вместо if (a == 5).
  • Забывают про else. Иногда программа должна сделать что-то в любом случае. Если не написать else, при ложном условии ничего не произойдёт, и пользователь может не понять, почему.
  • Сложные условия без скобок. Если условие состоит из нескольких частей (например, if (a > 0 && a < 10)), всегда используй скобки для ясности.
  • Не учитывают все варианты в when. Всегда добавляй else в конце when, даже если кажется, что он никогда не понадобится. Программа будет работать надёжнее.

Итоговый пример: Магазин сладостей

Давай решим задачу про скидки в магазине. Правила: если сумма покупки больше 1000 рублей — скидка 10%, если больше 5000 — скидка 20%, иначе скидки нет.

fun main() {
    println("Добро пожаловать в магазин сладостей!")
    println("Введите сумму вашей покупки в рублях:")
    val amount = readln().toDouble()

    var discount = 0.0  // переменная для скидки

    when {
        amount > 5000 -> {
            discount = 20.0
            println("У вас скидка 20%!")
        }
        amount > 1000 -> {
            discount = 10.0
            println("У вас скидка 10%!")
        }
        else -> {
            println("Скидка не предоставляется.")
        }
    }

    if (discount > 0) {
        val finalAmount = amount * (1 - discount / 100)
        println("Итоговая сумма со скидкой: ${"%.2f".format(finalAmount)} рублей")
    } else {
        println("Итоговая сумма: ${"%.2f".format(amount)} рублей")
    }
}

Что тут происходит? Сначала мы определяем размер скидки с помощью when. Затем, если скидка есть, вычисляем итоговую сумму. Обрати внимание на ${"%.2f".format(...)} — это форматирование числа до двух знаков после запятой, чтобы сумма выглядела красиво.

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