🎯 Kotlin

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

Цикл for в Kotlin

Что такое цикл и зачем он нужен?

Представь, что тебе нужно написать на доске 10 раз одну и ту же фразу: "Я молодец!". Ты можешь писать её вручную 10 раз, но это долго и скучно. А что, если бы у тебя была волшебная ручка, которая сама повторяет действие нужное количество раз? В программировании такую "волшебную ручку" называют циклом.

Цикл for — это конструкция, которая позволяет выполнять один и тот же блок кода несколько раз подряд. Мы сами указываем, сколько раз это нужно сделать или по каким значениям нужно "пройтись".

Где это может пригодиться?

  • Вывести на экран числа от 1 до 10
  • Повторить фразу 5 раз (как в задаче с банкоматом)
  • Посчитать сумму всех чисел от 1 до N
  • Сымитировать подъём лифта по этажам

Основной синтаксис цикла for

В Kotlin цикл for чаще всего используется вместе с диапазоном (range). Диапазон — это последовательность чисел от одного до другого. Записывается он через две точки: 1..5 (числа 1, 2, 3, 4, 5).

Базовая структура цикла выглядит так:

for (переменная in диапазон) {
    // код, который выполняется для каждого значения
}

Как это работает? Переменная по очереди принимает каждое значение из диапазона. Для каждого значения выполняется код внутри фигурных скобок.

Пример 1: Выведем числа от 1 до 5.

fun main() {
    for (i in 1..5) {
        println(i)
    }
}

Результат в консоли:

1
2
3
4
5

Пример 2: Выведем фразу "Привет!" 3 раза.

fun main() {
    for (i in 1..3) {
        println("Привет!")
    }
}

Результат в консоли:

Привет!
Привет!
Привет!

Разные виды диапазонов

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

  • 1..10 — от 1 до 10 включительно
  • 5..1 — так писать нельзя! Диапазон должен идти от меньшего к большему
  • 5 downTo 1 — от 5 до 1 (убывающий диапазон)
  • 1..10 step 2 — от 1 до 10 с шагом 2 (будет: 1, 3, 5, 7, 9)
  • 10 downTo 1 step 3 — от 10 до 1 с шагом 3 (будет: 10, 7, 4, 1)

Пример 3: Выведем числа от 10 до 1 в обратном порядке.

fun main() {
    for (i in 10 downTo 1) {
        println(i)
    }
}

Пример 4: Выведем только чётные числа от 2 до 10.

fun main() {
    for (i in 2..10 step 2) {
        println(i)
    }
}

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

Давай посмотрим, как цикл for помогает решать задачи, похожие на те, что тебе предстоят.

Задача "Лифт": Вы зашли в лифт на нулевом этаже и нажали кнопку 5-го этажа. Лифт показывает каждый этаж, мимо которого проезжает. Нужно вывести все этажи от 1 до 5.

fun main() {
    val targetFloor = 5 // Этаж, на который нужно подняться
    for (floor in 1..targetFloor) {
        println("Лифт проезжает этаж №$floor")
    }
    println("Вы приехали на $targetFloor этаж!")
}

Результат:

Лифт проезжает этаж №1
Лифт проезжает этаж №2
Лифт проезжает этаж №3
Лифт проезжает этаж №4
Лифт проезжает этаж №5
Вы приехали на 5 этаж!

Задача "Банкомат": Банкомат просит повторить фразу "Код подтверждён" 3 раза. Напишем программу, которая выводит эту фразу нужное количество раз.

fun main() {
    val repeatCount = 3 // Сколько раз нужно повторить
    for (i in 1..repeatCount) {
        println("Код подтверждён")
    }
}

Результат:

Код подтверждён
Код подтверждён
Код подтверждён

Задача "Кибербезопасность": Нужно проверить 5 файлов на вирусы и вывести номер каждого проверяемого файла.

fun main() {
    val totalFiles = 5
    for (fileNumber in 1..totalFiles) {
        println("Проверяю файл №$fileNumber... Вирусов не найдено.")
    }
    println("Проверка завершена!")
}

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

  1. Забывают фигурные скобки. Если в цикле только одна команда, скобки можно опустить, но для начинающих лучше всегда их ставить — так код понятнее и безопаснее.
  2. Путают переменную цикла. Переменная (например, i) существует только внутри цикла. Не пытайся использовать её после завершения цикла — это вызовет ошибку.
  3. Неправильный диапазон. Если написать 5..1, цикл не выполнится ни разу, потому что диапазон пустой. Используй downTo для обратного порядка.
  4. Путают .. и until. 1..5 включает 5, а 1 until 5 — не включает 5 (будет 1, 2, 3, 4). Для начинающих проще использовать ...
  5. Забывают про шаг. Если нужно вывести только чётные числа, не пиши for (i in 1..10) и проверку внутри — используй step 2.

Итоговый пример: "День рождения"

Представь, что ты принёс в класс 15 конфет и хочешь раздать их одноклассникам по одной. В классе 10 учеников. Напишем программу, которая показывает, кому и сколько конфет досталось.

fun main() {
    val totalCandies = 15
    val classmates = 10
    
    var candiesLeft = totalCandies
    
    println("Начинаем раздавать конфеты!")
    
    for (student in 1..classmates) {
        if (candiesLeft > 0) {
            println("Ученик №$student получил 1 конфету. Осталось: ${candiesLeft - 1}")
            candiesLeft--
        } else {
            println("Ученик №$student остался без конфеты. Конфеты закончились!")
        }
    }
    
    println("Раздача завершена! Осталось конфет: $candiesLeft")
}

Результат (фрагмент):

Начинаем раздавать конфеты!
Ученик №1 получил 1 конфету. Осталось: 14
Ученик №2 получил 1 конфету. Осталось: 13
...
Ученик №10 получил 1 конфету. Осталось: 5
Раздача завершена! Осталось конфет: 5

Обрати внимание: мы использовали переменную candiesLeft, которая меняется с каждым шагом цикла. Это очень полезный приём — внутри цикла можно не только выводить данные, но и считать что-то, накапливать результат или проверять условия.

Цикл for — твой верный помощник, когда нужно сделать что-то много раз. Чем больше ты будешь практиковаться, тем быстрее научишься выбирать правильный диапазон и шаг для решения любой задачи!