Цикл 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— «сделай, потом проверь»- Не забывай менять переменные внутри цикла
- Проверяй граничные условия (строго < или <=)