Урок 7. Циклы
E-code
Болтовня ничего не стоит. Покажите мне код. Linus Torvalds
Каждый наш день частично может напоминать "день сурка": мы просыпаемся, идём на работу или учёбу, приходим обратно и в кроватку. И так до выходных. Так кто сказал, что день программы отличается от дня человека? Для себя сегодня мы изменим привычный ход событий и посмотрим на "день сурка" программы, а именно - на циклы.
Циклы
День начинающего программиста простым не назовёшь, то нужно выводить данные в консоль, то вводить, то создавать под это всё переменные и так далее. Предположим, что наш программист - собачник. И вот он решил посчитать своих собак. И что теперь, сидеть и для каждой из них писать println-ы? За деньги да, а так, конечно нет. На помощь утопающему приходят циклы. Рассмотрим на примере цикла for.
Цикл for
Выполним задачу нашего программиста за него. Цикл разделён на условие и блок выполнения (тело цикла).

Поскольку у нас в теле только одна операция двойные скобки {} можно опустить. Посмотрим на итог.

Разберём написанное. for - ключевое слово, обозначение нашего цикла. Внутри скобок указано наше условие, где i - просто переменная-счётчик (она-то и принимает значения 1,2,3,4,5), in - ключевое слово, принимающее описанный дальше диапазон 1..5.
Сначала i=1, затем она выводится на экран с помощью println, дальше i=2 и она снова выводится на экран. После вывода на экран числа 5 условие цикла выполнилось полностью и программа закончила выполнение цикла.
Таким образом можно сделать вывод, что
Цикл - блок кода, который выполняется повторно несколько раз в зависимости от условия.
Стоит обязательно оговориться, что i - val-переменная цикла for, то есть в теле цикла её изменить не получится.
Собачки хотят кушать, но не все, каждая вторая не хочет, да и кормёжка происходит в обратном порядке. А ещё желательно посчитать сколько питомцев покормил наш программист. Как же быть? Мы не оставим собачек в беде. Для наших целей понадобятся ключевые слова downTo, step и новая переменная.

Аналогично условным конструкциям для выполнения нескольких действий тело облачается в двойные скобки {}. downTo помогает сформировать наш интервал, который идёт по нисходящей (как моя самооценка), step (шаг) - "перескакивать" ненужные по условию выше значения.
А что в итоге?

Также можно использовать команду repeat() для заданного числа повторений.


Цикл forEach
Для массивов и коллекций (об этом мы поговорим позже) существует цикл forEach. Его можно применять для каждого элемента последовательности.

В данном цикле мы выводим на экран каждый элемент массива последовательно.

Цикл while
Циклы for и forEach хороши, если нужно выполнять код для каждого элемента последовательности. Цикл while хорош, если нам нужно обратить внимание не на саму последовательность, а на само условие цикла. Чтобы всё это понять, нам помогут котлетки.

Дословно получается: пока kotletki больше 0 мы будем выводить наше сообщение, как только оно стало равным 0 (условие, что у нас есть котлеты, не соблюдается и становится ложным), наш цикл завершился. Обязательно нужно убавлять значение, иначе наш цикл не закончится.
Мы точно съели три котлеты?

Цикл do-while
Представим ситуацию, что после работы или учёбы вам надо покормить кота. Собаки кончились.

Это обязательное условие, вы должны покормить кота хотя бы 1 раз (и так бы поступил на вашем месте каждый), то есть выполнит, как минимум, одну итерацию . Разработчики Kotlin это предусмотрели и решили сделать ещё один вид цикла do-while.
Итерация - повторение чего-либо. В нашем случае, выполнение тела цикла.
Он выполнится хотя бы 1 раз в любом случае, даже если начальное условие не будет соответствовать истинности. Тело цикла переносится в блок do.


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

Посмотрим сразу итог.

Continue пропустил остальную часть тела цикла, но стоит держать в голове, что кот съел вторую котлету (skyshano было равно 2-м по условию, а если бы мы написали skyshano после блока "запивания", то кот пил бы вечно, то есть был бы создан бесконечный цикл, потому что часть кода с прибавлением переменной просто бы всегда пропускалась continue). Break не просто пропустил часть кода, когда количество съеденных котлет достигло 5, но и полностью завершил цикл, хотя у нас в тот момент было ещё много котлет.

Вложенные циклы и массивы
Вот теперь шутки точно кончились (мема не будет). В прошлой статье мы вставляли в один массив другие массивы. Продолжим эту тенденцию с циклами.

Наш вывод в консоли.

Программа выполняет код главного (верхнего) цикла, достигает вложенного цикла (тот, что внутри), выполняет код вложенного, и после этого продолжается выполнение главного цикла. Цикл завершится, когда выполнится главный цикл.
По возможности стоит избегать вложенных циклов, потому что они негативно влияют на производительность программы.
Это не значит, что мы не можем применять вложенные циклы. Всё зависит от ситуации, а бывают случаи, когда именно вложенные циклы являются лучшим вариантом. Другой пример: они могут помочь вывести на экран и даже изменить значения двумерного массива.

Посмотрим на вывод. Главный цикл "перебирает" сами массивы внутри массива, а внутренний цикл - значения этих массивов.

Что дальше?
Далее мы познакомимся с функциями. Без них не обходится ни одна серьёзная программа, потому и ценность следующей статьи возрастает в разы.
Дорогой читатель, надеюсь моя статья оказалась полезной для тебя!
Ты всегда можешь следить за нашим творчеством на этом канале.
Спасибо за проявленный интерес!