Цикл 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 в круглых скобках проверяется условие – n <= 10. Если данное логическое выражение возвращает истину, будет выполняться тело цикла, заключенное в фигурные скобки. Это похоже на условный оператор if. Однако в случае цикла после последнего выражения тела поток выполнения не выходит из цикла за закрывающую фигурную скобку, а снова возвращается к заголовку и снова проверяет условие.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Напишите программу, которая запрашивает с ввода два числа, знак операции (+, -, * или /) и выполняет над числами указанную операцию. Для приведения строкового типа к числовому воспользуйтесь строковыми функциями toInt() или toDouble() и подобными.

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

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


Kotlin с нуля. Курс для начинающих




Все разделы сайта