🎯 Kotlin

Цикл while и do-while в Kotlin 1.9: подробное руководство

Циклы while и do-while в Kotlin

Зачем нужны циклы?

Представь, что тебе нужно 100 раз написать в тетради: «Я буду учить программирование». Скучно и долго, правда? А теперь представь, что у робота-шахтёра есть задание: «Собирай кристаллы, пока в сумке не станет 100 единиц энергии». Робот не знает заранее, сколько кристаллов ему попадётся. Ему нужно повторять одно и то же действие пока не выполнится условие. Вот для таких случаев и нужны циклы while и do-while.

Цикл while

Цикл while работает очень просто: «Пока условие правдиво — делай действие». Если условие с самого начала ложное, цикл не выполнится ни разу.

Синтаксис:

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

Пример 1: Обратный отсчёт

Доктор Элара запускает машину времени с координаты n. Каждую секунду координата уменьшается на 1. Отсчёт идёт, пока координата не станет равна 0.

fun main() {
    println("Введите начальную координату n:")
    var n = readln().toInt()

    while (n > 0) {
        println("Текущая координата: $n")
        n-- // уменьшаем на 1
    }
    println("Время пошло в обратную сторону! Координата: $n")
}

Ввод: 5
Вывод:
Текущая координата: 5
Текущая координата: 4
Текущая координата: 3
Текущая координата: 2
Текущая координата: 1
Время пошло в обратную сторону! Координата: 0

Пример 2: Робот-шахтёр

Робот собирает кристаллы, пока энергия в сумке не станет ≥ 100. Каждый кристалл даёт случайное количество энергии (от 5 до 20).

fun main() {
    var energy = 0
    var crystals = 0

    while (energy < 100) {
        crystals++
        val crystalEnergy = (5..20).random()
        energy += crystalEnergy
        println("Кристалл #$crystals: +$crystalEnergy энергии. Всего: $energy")
    }
    println("Сумка полна! Собрано кристаллов: $crystals, энергия: $energy")
}

Цикл do-while

Цикл do-while — это младший брат while. Отличие в том, что он сначала делает действие, а потом проверяет условие. Поэтому тело цикла выполнится хотя бы один раз.

Синтаксис:

do {
    // код, который выполняется хотя бы один раз
} while (условие)

Пример: Юный садовод Алекс

Алекс посадил росток высотой 5 см. Каждый день росток увеличивается в 2 раза. Алекс хочет узнать, сколько дней пройдёт, пока росток не станет выше 50 см. Задача требует хотя бы одного измерения, поэтому используем do-while.

fun main() {
    var height = 5
    var day = 0

    do {
        day++
        height *= 2 // увеличиваем в 2 раза
        println("День $day: высота ростка $height см")
    } while (height <= 50)

    println("Росток достиг высоты $height см за $day дней!")
}

Вывод:
День 1: высота ростка 10 см
День 2: высота ростка 20 см
День 3: высота ростка 40 см
День 4: высота ростка 80 см
Росток достиг высоты 80 см за 4 дней!

Разбор типичных задач

Задача «Секретный агент»

Агенту поступают коды. Если код положительный — он его сохраняет. Если код равен 0 — миссия завершена. Нужно суммировать все положительные коды.

fun main() {
    var sum = 0
    println("Вводите коды (0 — конец миссии):")

    var code = readln().toInt()
    while (code != 0) {
        if (code > 0) {
            sum += code
        }
        code = readln().toInt()
    }
    println("Общая сумма положительных кодов: $sum")
}

Задача «Волшебная экспедиция»

Артефакт Силы светится с начальной яркостью 1. Каждую секунду яркость удваивается. Исследователь хочет дождаться, пока яркость не станет ≥ 1000, но не более 10 секунд (чтобы не ослепнуть).

fun main() {
    var brightness = 1
    var second = 0

    while (brightness < 1000 && second < 10) {
        second++
        brightness *= 2
        println("Секунда $second: яркость = $brightness")
    }

    if (brightness >= 1000) {
        println("Артефакт активирован! Яркость: $brightness")
    } else {
        println("Время вышло, яркость недостаточна: $brightness")
    }
}

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

1. Бесконечный цикл

Если забыть изменить переменную в условии, цикл будет работать вечно. Программа «зависнет».

// ОШИБКА: переменная i не меняется
var i = 1
while (i <= 5) {
    println("Привет!")
    // забыли: i++
}

Как исправить: Всегда меняй переменную внутри цикла (i++ или i--).

2. Неправильное условие

Путаница > и >=, < и <= может привести к лишнему шагу или его отсутствию.

// Хотели 5 шагов, а получится 4
var count = 0
while (count < 5) { // правильно <= 4 или < 5
    count++
}
println(count) // 4

3. Условие с самого начала ложно

Если условие в while ложно изначально, цикл не выполнится ни разу. Если нужно хотя бы одно выполнение — используй do-while.

Итоговый пример: Сбор урожая в Древнем лесу

Исследователь находит волшебные ягоды. Каждая ягода даёт от 1 до 10 единиц магии. Нужно собирать ягоды, пока общая магия не станет ≥ 50. Но если попадётся ядовитая ягода (код -1), сбор нужно немедленно прекратить.

fun main() {
    var magic = 0
    var berries = 0
    println("Начинаем сбор ягод (введи -1 для ядовитой ягоды):")

    var berry = readln().toInt()
    while (magic < 50 && berry != -1) {
        berries++
        magic += berry
        println("Ягода #$berries: +$berry магии. Всего: $magic")

        if (magic < 50) {
            berry = readln().toInt()
        }
    }

    if (berry == -1) {
        println("Ядовитая ягода! Сбор прекращён. Собрано магии: $magic")
    } else {
        println("Ура! Магии достаточно: $magic. Собрано ягод: $berries")
    }
}

Пример ввода: 7, 12, 5, 30
Вывод:
Начинаем сбор ягод (введи -1 для ядовитой ягоды):
Ягода #1: +7 магии. Всего: 7
Ягода #2: +12 магии. Всего: 19
Ягода #3: +5 магии. Всего: 24
Ягода #4: +30 магии. Всего: 54
Ура! Магии достаточно: 54. Собрано ягод: 4

Запомни:

  • while — «пока условие верно, делай»
  • do-while — «сделай, потом проверь»
  • Не забывай менять переменные внутри цикла
  • Проверяй граничные условия (строго < или <=)