Перейти до основного вмісту

Цикли

Часте завдання програмування - багаторазове виконання однотипної дії. Наприклад, вивести клієнтів зі списку один за одним, або перебрати суми зарплат, і для кожної виконати однаковий код. Саме для таких цілей - багаторазового повторення однієї частини коду, використовуються цикли.

  • Цикл - керуюча конструкція у високорівневих мовах програмування, призначена для організації багаторазового виконання набору інструкцій.
  • Тіло циклу - послідовність інструкцій, призначена для багаторазового виконання.
  • Ітерація - одноразове виконання тіла циклу.
  • Умова виходу - вираз, що визначає, чи буде в черговий раз виконуватися ітерація, або цикл завершиться.
  • Лічильник - змінна, що зберігає поточний номер ітерації. Цикл не обов'язково містить лічильник, і він не повинен бути один, умова виходу з циклу може залежати від декількох змінних, що змінюються в циклі.

Цикл while

Цикл з передумовою — цикл, який виконується, доки правдива якась умова, зазначена до його початку. Ця умова перевіряється до виконання тіла циклу, тому тіло може не виконатися жодного разу, якщо умова від самого початку - хибна.

while (condition) {
// код, тіло циклу (statement)
}

Конструкція while створює цикл, який виконує блок коду, доки умова перевірки оцінюється як true.

  • condition, тобто умова, оцінюється перед кожною ітерацією циклу.
  • Якщо condition оцінюється як true, оператор while виконує statement.
  • Якщо condition оцінюється як false, виконання циклу переривається і скрипт продовжує виконувати інструкції після циклу while.

Блок-схема ілюструє цикл while.

while loop

Створимо лічильник.

let counter = 0;

while (counter < 10) {
console.log("counter: ", counter);
counter += 1;
}

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

let clientCounter = 18;
const maxClients = 25;

while (clientCounter < maxClients) {
console.log(clientCounter);
clientCounter += 1;
}

Цикл do...while

Цикл з постумовою - цикл, в якому умова перевіряється після виконання тіла циклу. З цього випливає, що тіло завжди виконується хоча б один раз.

do {
// statement
} while (condition);

Конструкція do...while створює цикл, який виконує блок коду доти, доки condition не поверне false.

На відміну від циклу while, цикл do...while завжди виконує statement мінімум один раз, перш ніж він оцінить condition.

Всередині циклу потрібно внести зміни в деяку змінну, щоб переконатися, що вираз дорівнює false після ітерацій. Інакше буде нескінченний цикл.

Блок-схема ілюструє цикл do-while

do...while loop
let password = "";

do {
password = prompt("Введіть пароль довший 4-х символів", "");
} while (password.length < 5);

console.log("Ввели пароль: ", password);

Цикл for

Цикл з лічильником - цикл, в якому певна змінна змінює своє значення із заданого початкового до кінцевого значення з деяким кроком, і для кожного значення цієї змінної тіло циклу виконується один раз.

В більшості процедурних мов програмування реалізується конструкцією for, в якій зазначається лічильник, необхідна кількість ітерацій і крок, з яким змінюється лічильник.

for (initialization; condition; post-expression) {
// statements
}

Алгоритм виконання циклу for:

  • Ініціалізація (initialization) - виконується один раз до початку циклу. Використовується для створення змінної-лічильника і зазначення її початкового значення.
  • Умова (condition) - вираз, що оцінюється перед кожною ітерацією (повторенням) циклу. Тіло циклу виконується тільки тоді, коли вираз приводиться до true. Цикл завершується, якщо значення буде false.
  • Тіло (statements) - набір інструкцій для виконання на кожному повторенні. Виконується, якщо вираз умови приводиться до true.
  • Пост-вираз (post-expression) - виконується в кінці кожного повторення циклу, до перевірки умови. Використовується для оновлення змінної-лічильника.

Змінні-лічильники, за традицією, називаються літерами i, j і k.

for (let i = 0; i <= 20; i += 5) {
console.log(i);
}

У прикладі оголошується змінна-лічильник i, ініціалізується значенням 0 і цикл виконується доти, доки i <= 20, тобто умова приводиться до true. Після кожної ітерації лічильник збільшується на 5.

Порахуємо суму чисел до певного значення.

const target = 3;
let sum = 0;

for (let i = 0; i <= target; i += 1) {
sum += i;
}

console.log(sum);

Згадаємо про операцію a % b і виведемо остачу від ділення за допомогою циклу.

const max = 10;
for (let i = 0; i < max; i += 1) {
console.log(`${max} % ${i} = `, max % i);
}

Оператор break

Перервати виконання циклу можна в будь-який момент. Для цього існує оператор break, який повністю припиняє виконання циклу і передає управління на рядок після його тіла.

Знайдемо число 3. Щойно виконається умова if, цикл припинить своє виконання (буде перерваний).

for (let i = 0; i <= 5; i += 1) {
console.log(i);

if (i === 3) {
console.log("Знайшли число 3, перериваємо виконання циклу");
break;
}
}

console.log("Лог після циклу");

Оператор continue

Перериває не увесь цикл, а тільки виконання поточної ітерації. Його використовують, якщо зрозуміло, що на поточній ітерації циклу більше немає що робити або взагалі не потрібно нічого робити, і час переходити до наступної ітерації.

Використовуємо цикл для введення тільки непарних чисел. Для парних i спрацьовує continue, виконання тіла припиняється і управління передається до наступної ітерації.

const number = 10;

for (let i = 0; i < number; i += 1) {
if (i % 2 === 0) {
continue;
}

console.log("Непарне i: ", i); // 1, 3, 5, 7, 9
}