Цикл while в Kotlin

While – не единственный, но наверное самый универсальный цикл в большинстве языков программирования. С его помощью можно сделать все, что делается с помощью других циклов, хотя не всегда так же эффективно. С другой стороны, в ряде случаев без цикла while не обойтись.

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

Слово while – это ключевое слово, команда языка программирования, также как val, var, if-else. Однако цикл, как и условный оператор, – не одиночная слово-команда, он имеет более сложную конструкцию со скобками, в которой выделяют заголовок и тело.

Рассмотрим программу, которая выводит на экран числа от 1 до 10-ти.

fun main() {
    var n = 1
 
    while (n <= 10) {
        print(n)
        print(" ")
        n = n + 1
    }
}

Вывод десяти натуральных чисел с помощью цикла while на языке программирования Kotlin

В заголовке цикла while в круглых скобках проверяется условие – n <= 10. Если данное логическое выражение возвращает истину, будет выполняться тело цикла, заключенное в фигурные скобки. Это похоже на условный оператор if. Однако в случае цикла после последнего выражения тела поток выполнения не выходит из цикла за закрывающую фигурную скобку, а снова возвращается к заголовку и снова проверяет условие.

Если бы в нашем примере в теле цикла переменная n не меняла своего значения, то выражение n <= 10 всегда оставалось бы истинным, и цикл не смог бы завершиться самостоятельно. В программировании подобное называется зацикливанием.

Блок-схема цикла while изображается примерно так:

Блок-схема цикла while

Рассмотрим программу, выводящую на экран десять случайный чисел.

import kotlin.random.Random
 
fun main() {
    var n = 0
 
    while (n < 10) {
        print(Random.nextInt(100))
        print(" ")
        n += 1
    }
}

Вывод десяти случайных чисел с помощью цикла while

Значение переменной n здесь не выводится на экран, она нужна нам исключительно для работы цикла, играет роль счетчика. Выражение n += 1 это сокращенная запись выражения n = n + 1, когда к значению n добавляется единица, и новое значение присваивается той же переменной.

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

fun main() {
    var s = readLine()
 
    while (s != "Hello")
        s = readLine()
 
    println(s + " World!")
}

Проверка правильности ввода с помощью цикла while

В этой программе нам абсолютно неизвестно, сколько раз выполнится тело цикла. Количество повторов цикла зависит от того, что вводит пользователь. Тело цикла вообще может ни разу не выполниться, если пользователь сразу введет правильное слово. В этом случае проверка s != "Hello" вернет false.

В Kotlin есть еще одна форма цикла while, когда проверка условия находится после тела. Такая форма называется циклом с постусловием. Обычный цикл while – это цикл с предусловием.

Перепишем приведенную выше программу, используя do-while (цикл с постусловием).

fun main() {
    var s: String?
 
    do {
        s = readLine()
    } while (s != "Hello")
 
    println(s + " World!")
}

Ее особенностью является то, что тело цикла обязательно выполняется хотя бы один раз. Иногда это бывает необходимо.

Операторы break и continue

Бывают ситуации, когда необходимо досрочно выйти из тела цикла. При этом выход может происходить в заголовок цикла, где снова будет проверяться условие, или за пределы цикла, когда работа цикла полностью завершается. Для этих целей в языках программирования используются операторы continue и break.

import kotlin.math.sqrt
 
fun main() {
    var i = 0
 
    while (i < 5) {
        val n = readLine()!!.toDouble()
        if (n < 0)
            continue
        println(sqrt(n))
        i++
    }
}

Пример использования оператора continue в теле цикла while

В приведенной программе вычисляется квадратный корень из пяти введенных положительных чисел. Если было введено отрицательное число, что проверяется в теле while с помощью вложенного if, то происходит переход к заголовку while с помощью команды continue. При этом квадратный корень не вычисляется, а значение переменной i не меняется.

Выражение i++ увеличивает значение i на единицу (оператор ++ называется инкрементом). Это еще один вариант сокращенной записи выражения i = i + 1.

Если заменить continue на break, то цикл досрочно, не дожидаясь пяти положительных чисел, завершит свою работу, если вы введете хотя бы одно отрицательное число.

Практическая работа:

Усовершенствуйте программу из предыдущего урока, позволив пользователю выполнять арифметические вычисления до тех пор, пока вместо первого числа он не введет слово "stop".

PDF-версия курса с ответами к практическим работам

Приложение для Android "Kotlin. Курс"

Комментарии

fun main() {
    while (true) {
        val num = readLine()
        if (num == "stop")
            break
        val num1 = num?.toInt() ?:0
        val num2 = readLine()?.toInt() ?: 0
        when(readLine()) {
            "+" -> println(num1 + num2)
            "-" -> println(num1 - num2)
            "*" -> println(num1 * num2)
            "/" -> println(num1 / num2)
        }
    }
}