Kotlin. Циклы for, while, do-while, forEach, repeat()

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

Условное выражение if

В языке Kotlin ключевое слово if является выражением, т.е. оно возвращает значение. Это позволяет отказаться от тернарного оператора (условие ? условие истинно : условие ложно), поскольку выражению if вполне по силам его заменить.

// обычное использование var max = a if (a < b) max = b // с блоком else var max: Int if (a > b) max = a else max = b // в виде выражения val max = if (a > b) a else b

«Ветви» выражения if могут содержать несколько строк кода, при этом последнее выражение является значением блока:

val max = if (a > b) { print(«возвращаем a») a } else { print(«возвращаем b») b }

Если вы используете конструкцию if в качестве выражения (например, возвращая его значение или присваивая его переменной), то использование ветки else является обязательным.

См. использование if.

Цикл repeat

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.

Читайте также:  5 функциональных и простых сканеров QR и штрих-кодов для Андроид

В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while, здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.

var i, n: integer;   begin write (‘Количество знаков: ‘); readln (n);   i := 1; repeat write (‘(*) ‘); i := i + 1 until i > n;   readln end.

В примере, даже если n будет равно 0, одна звездочка все равно будет напечатана.

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

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

while (true) { if (checkSomething()) { break; } }

Если мы просто хотим остановить ход выполнения текущей итерации, но не выйти из цикла, а перейти к блоку проверки условий, то должны использовать оператор continue:

while (true) { if (checkSomething()) { continue; } }

Операторы continue и break могут использоваться со всеми вариантами циклов FOR и WHILE.

Примеры кода решений задач с вложенными циклами

Пример №1.1: Repeat/until + For: работа с пользователем до его указания на завершение программы

Предположим, что вы работаете с пользователем раз за разом выполняя похожие действия до тех пор, пока пользователь не введёт какую-то команду, показывающую, что пора заканчивать работу.

В этом случае ожидание очередной команды от пользователя, а также реакцию на неё имеет смысл поместить в тело цикла. Пусть при этом в ответ на команду нам тоже нужно делать что-то, что решается с помощью цикла — вот мы и получили первый пример схемы, где без вложенных циклов не обойтись.

Читайте также:  Google Play не поддерживается на вашем устройстве — как исправить

В качестве конкретного пример рассмотрим решение задачи:

Пользователь вводит целые положительные числа, большие $5$. Пока он не введёт число $22$ в ответ на каждое введённое число выводите все целые числа от $1$ до этого числа, если же пользователь ввёл ноль, то объявите о завершении работы программы.

Решение:

var a,i:integer; begin repeat // внешний цикл writeln(‘vvedite chislo >5:’); readln(a); for i:=1 to a do // (вложенный цикл) выводим все числа до a write(i, ‘ ‘); writeln(); // перенос строки until (a = 22); // конец тела внешнего цикла writeln(‘zaversheno!’); readln(); end.

Прокомментируем это решение:

  1. В качестве внешнего цикла мы выбрали repeat/until, чтобы проверять условие уже после ввода значения пользователем.
  2. В качестве внутреннего цикла мы выбрали for — ведь каждый раз будет известно число, до которого надо выводить меньшие числа. Можно было бы использовать и любой другой цикл, но for в таких случаях использовать грамотнее и красивее.
  3. минусом выбора repeat/until внешним циклом является то, что эта программа, в случае если пользователь введёт число $22$, все равно выведет ряд чисел, а только потом завершится.

Последний пункт вызывает желание (да-да, программирование должно вас увлекать 😉 переписать код так, чтобы в случае, если пользователь ввёл $22$ ряд чисел не выводился.

Пример №1.2 (продолжение): While + For: работа с пользователем до его указания на завершение программы

Это пример является продолжением предыдущего и одновременной иллюстрацией ситуации, где цикл For вложен в While:

var a,i:integer; begin writeln(‘vvedite chislo >5:’); readln(a); while (a <> 22) do begin // начало тела внешнего цикла for i:=1 to a do // (вложенный цикл) выводим все числа до a write(i, ‘ ‘); writeln(); // перенос строки writeln(‘vvedite chislo >5:’); // очередной раз запрашиваем число в цикле readln(a); end; // конец тела внешнего цикла writeln(‘zaversheno!’); readln(); end.

Читайте также:  Google представил обновленный флагман Pixel 2

Как работает эта программа:

  1. Сначала, ещё до цикла мы просим пользователя ввести число первый раз, если это число = 22, то цикл вообще не начнётся и программа будет завершена без вывода ряда.
  2. Если пользователь вводит число не равное 22, то цикл начнётся, так как число уже известно, то в витке цикла мы сначала выведем значения до введённого числа, а только потом в конце витка запросим очередное число.

Переменные цикла в глобальную область видимости

Обычно переменные, определенные внутри локального пространства имен, недоступны снаружи. Как только блок кода завершает свое выполнение, локальное пространство имен уничтожается вместе со всеми его переменными. Но это не так с циклом for.

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

Переменные цикла в глобальную область видимости

global_var = «global» for c in range(1,3): x = 10 global_var = «for variable» print(c) # variable is defined in the for loop print(x) # variable is defined in the for loop print(global_var) # global variable