Цикли — це алгоритмічні структури, призначені для багаторазового виконання набору інструкцій (тіла циклу).

Цикл while Звичний цикл з передумовою while працює в Kotlin як і в інших мовах: var x=1 while (x<20){ x=x+1 } Тобто спочатку перевіряється умова. Якщо умова вірна, то виконується тіло циклу. Цикл do-while У циклі do-while тіло циклу виконується хоча б раз. Після першого виконання, перевіряється умова, якщо вона вірна, то цикл виконується повторно. var y=10 do { y-- print("y=$y") } while (y>10) В даному випадку цикл виконається лише один раз і буде виведено число 9.

Цикл for Цикл for дозволяє здійснити перебір чисел в певному діапазоні і має вигляд: for (x in 1..15){ //код програми }

Якщо потрібно, щоб останній елемент не включався використовують замість .. ключове слово until: for (x in 1 until 100) println(x) // виведе числа від 1 до 99 Зверніть увагу, що якщо цикл складається з одного рядка, то фігурні дужки можна опустити.

Для перебору в зворотньому порядку використовується ключове слово downTo. for (x in 15 downTo 1) println(x) Якщо потрібно перебирати не з одиничним кроком, то можна використати ключове слово step для задання кроку перебору. for (x in 1..100 step 2) println(x) Існує можливість перебрати всі елементи масиву наступним чином: var myArray: Array<Byte> = arrayOf(1, 2, 3) for (item in myArray){ println("myArray has $item") } Можна перебрати масив використовуючи його індекси: var myArray: Array<Byte> = arrayOf(1, 2, 3) for (index in myArray.indices){ println("$index =${myArray[index]}")

Більш того, можна одночасно пройтися і по індексам і по значенням масиву: var myArray: Array<Byte> = arrayOf(1, 2, 3, 5) for ((index, item) in myArray.withIndex()){ println("[$index] =$item")

Return, continue, break В циклах можна використовувати ключові слова return, continue, break. Так, якщо ми маємо два цикли, вкладені один в оден, то return завершить виконання обох циклів і виконання функції, в якій є ці цикли: fun main() { for (i in 0 until 10) { for (j in 0 until 10) { if (j == 2) { return

println("i=$i, j=$j")

println ("кінець програми") // не буде виведено

Continue завершує поточну ітерацію циклу і переходить до наступної: for (i in 0 until 10){ for (j in 0 until 10){ if (j==2){ continue

println("i=$i, j=$j")

Як бачимо j=2 не друкується.

break - завершує поточний цикл і продовжується виконання зовнішнього циклу: for (i in 0 until 10){ for (j in 0 until 10){ if (j==2){ break

println("i=$i, j=$j")

Як бачимо після j=1, цикл з j не продовжується.

Дещо надати наглядності і змінити поведінку break та continue (не return) можна з допомогою міток: outer@for (i in 0 until 10){ inner@for (j in 0 until 10){ if (j==2){ break@inner // стандартне виконання break

println("i=$i, j=$j")

Результат буде такий же, як і без міток. Проте, якщо ми змінемо break@inner на break@outer то break завершить обидва цикли: outer@for (i in 0 until 10){ inner@for (j in 0 until 10){ if (j==2){ break@outer

println("i=$i, j=$j")

Функція repeat() Функція repeat() не належить офіційно до циклів, але по суті виконує їхню роль. repeat() дозволяє виконати один і той самий набір інструкцій вказану кількість раз: fun main() { repeat(10){ println("Привіт")

В даному випадку слово Привіт буде виведено на консоль 10 раз.

Ми можемо одержати номер ітерації починаючи з нуля так: fun main() { repeat(10){ println("$it Привіт")

Можна також так: repeat(4) { index -> println("Iteration number: $index")

Функція forEach() Ще одна функція, яка може замінити цикл - це функція forEach(). За допомогою неї можна перебрати значення масивів або ж колекцій: val fruits = arrayOf("Apple", "Banana", "Cherry")

// використання forEach з неявним параметром 'it' fruits.forEach { println("Fruit: $it")

// використання forEach з явним іменем параметру fruits.forEach {name -> println("Fruit2: $name")

//повторити інструкцію 5 разів можна так (0..4).forEach { println(it)