Цикли та повторення.

У мовах програмування для управління потоком виконання коду недостатньо лише умовних виразів (if-else, switch). У багатьох сценаріях необхідно виконувати певний блок коду повторно. Саме тут у гру вступають цикли (loops). Цикли дозволяють виконувати кодові блоки доти, доки виконується певна умова, або ж до досягнення визначеної кількості повторень.

Якщо привести приклад із реального життя, уявіть, що ви щойно закінчили навчання й подаєте заявки на роботу. Для кожної заявки вам не потрібно придумувати нову причину.

Потрібна робота? Так.

{

Тоді подавайте заявку.

Знайшли роботу? Ні.

Продовжуйте.

Знайшли роботу? Так.

}

Зупиняєте подання заявок.

Логіка проста. Головне — правильно писати код.

Що таке цикл (Loop)?

Цикл виконує один і той самий блок коду, доки умова true або протягом визначеної кількості повторень. Наприклад, під час зчитування записів із файлу ми продовжуємо читати, доки залишаються записи. Якщо потрібно обробити кожен елемент масиву, цикл повторюється стільки разів, скільки є елементів у масиві.

Інакше кажучи, якщо пастуху сказати рахувати овець, які виходять із загону, то цикл триватиме доти, доки виходять вівці (умова true). Якщо овець немає, або це не вівці, то спрацьовує інший сценарій.

Або поки ви не знайдете роботу. Сподіваюся, зрозуміло.

Цикл While

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

  • Якщо умова з самого початку false, тіло циклу не виконається жодного разу.
  • Такий тип циклу корисний у випадках, коли заздалегідь невідомо, скільки ітерацій потрібно виконати.

Подивимося на приклад: у циклі while дитина запитує: «Ми вже приїхали?». Результат нашого коду — це відповідь на це запитання. Поки «Ми вже приїхали?» = true (тобто ще ні), цикл триватиме.

boolean notThereYet = true;  

while (notThereYet) {  
 // Тіло циклу  
 // Наприклад: читання книги, сварка з братом тощо  
 // Виконується дія, яка змінить умову...  
 // notThereYet = ... ;  
}  
System.out.println("Цикл закінчився. Ми вийшли з машини!");

Ще один приклад: чи ви безробітний? True.

while (безробітний) {виконується цикл пошуку роботи}. До тих пір, поки умова не стане False.

Цикл Do-while

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

boolean condition = false;  
do {  
 // Цей блок виконається щонайменше один раз  
 System.out.println("Ви побачите це щонайменше один раз!");  
} while (condition);
  • Оскільки умова перевіряється в кінці, тіло циклу виконується хоча б один раз. Якщо умова стає false, цикл завершується.
  • Особливо корисний, коли певна дія має бути виконана мінімум один раз.

Наприклад, якщо ви хочете перемогти когось у грі в нарди:

do {

грати партію

}

while (виграв?).

Якщо виграли, умова стає true, і цикл завершується.

Основна відмінність від циклу while: у while спершу перевіряється умова, а у do спочатку виконується дія. Ось і вся логіка. Просто треба звикнути до синтаксису.

Цикл For

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

for (початок; умова; збільшення/зменшення) {  
 // Тіло циклу  
}

Приклад:

for (int i = 1; i < 5; i++) {  
 System.out.print("Значення i: " + i + " ");  
}  
// Цикл виконується для i = 1, 2, 3, 4
  • Починається з i = 1, цикл продовжується, поки i < 5, при кожній ітерації i збільшується на 1.
  • Коли i стає 5, умова 5 < 5 стає false, і цикл завершується.

Якщо навести приклад із реального життя, уявіть, що ви на дієті й маєте право з’їсти 5 шматочків хліба за день.

int i = 0 — це кількість шматочків хліба на початку дня.

i < 5 — це умова, яка визначає максимальну кількість шматочків, які ви можете з’їсти.

i++ — це записування кожного шматочка хліба після того, як ви його з’їли.

Коли ви їсте шматочок, лічильник працює як 0, 1, 2, 3, 4, але після 4 ви припиняєте їсти (загалом виходить 5 шматочків, включаючи 0).

Цикл For-each (Покращений for)

Цикл for-each у Java використовується для перебирання кожного елемента у масиві (array) або колекції (collection). Синтаксис:

for (Тип тимчасоваЗмінна : масивАбоКолекція) {  
 // Дія для кожного елемента  
}

Приклад:

String[] names = {"Мехмет", "Боран", "Ахмет"};  
 for (String name : names) {  
 System.out.println(name);  
}
  • Під час першої ітерації name = "Мехмет", під час другої — name = "Боран", під час третьої — name = "Ахмет".
  • Коли всі елементи масиву закінчуються, цикл завершується.

Або ж уявімо такий приклад:

String[] building = {"Мехмет", "Боран", "Ахмет"};  
 for (String neighbor : building) {  
 System.out.println(neighbor);  
}

У цьому прикладі, якщо вас запитають: «З ким ти живеш у будівлі?», цикл «загляне» у список мешканців зверху вниз і надрукує їхні імена.

Завершення циклу за допомогою Break

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

int passMark = 12;  
boolean passed = false;  
int[] scores = {4, 6, 2, 8, 12, 35, 9};  
for (int unitScore : scores) {  
 if (unitScore >= passMark) {  
 passed = true;  
 break; // Завершує цикл  
 }  
}  
System.out.println("Чи хтось склав іспит? " + passed);
  • Цикл триватиме, доки не знайде значення 12 у scores. Коли умова 12 >= 12 виконується, викликається break, і цикл завершується. Значення 35 та 9 не перевіряються.

Уявімо, що серед ваших друзів є 3-5 осіб, які вміють грати в баскетбол, і ви хочете запросити одного з них пограти. Але на гру є місце лише для одного гравця.

Ви переглядаєте список друзів, знаходите першого, хто вміє грати, і викликаєте break — мета виконана. Решта друзів уже не перевіряються.

Приклад із Break

Розглянемо наступний код:

int[] sizes = {4, 18, 5, 20};  

for (int size : sizes) {  
 if (size > 16) {  
 break;  
 }  
 System.out.print("size: " + size + ", ");  
}

Цикл перевіряє елементи sizes із початку до кінця та виконує наступне:

  • Під час першої ітерації size = 4. Умова (4 > 16) є false, тому break не викликається, і на екран виводиться size: 4,.
  • Під час другої ітерації size = 18. Умова (18 > 16) є true, тому викликається break, і цикл завершується.
  • Результат: на екран виводиться лише size: 4,.

Використання циклів

Цикли є дуже корисними в додатках для управління списками продуктів, надання знижок для клієнтів або відстеження запасів.

Контроль залишків на складі за допомогою циклу While

У продуктовому магазині ми можемо захотіти продавати певний товар, поки він є в наявності. У цьому випадку можна використовувати цикл while. Наприклад, ми продаємо яблука по одному. Кожного разу після продажу зі складу забирається одне яблуко, і перед кожним продажем перевіряється кількість яблук, щоб запобігти ситуації, коли товару немає.

int apples = 20; // Кількість яблук на складі  
while (apples > 0) {  
 System.out.println("Кількість яблук в наявності: " + apples);  
 // Продаж яблука  
 apples--; // Після кожного продажу зменшуємо кількість яблук на складі  
}  
System.out.println("Яблука закінчились!");

Використання Do-while для обов’язкового введення

Щоб продемонструвати do-while, наведемо приклад, де користувачеві потрібно обов’язково ввести позитивне число. Ми також використаємо бібліотеку java.util.Scanner для введення даних. Якщо деякі терміни вам незрозумілі, Google завжди допоможе! 🙂

У прикладі важливо помітити, що цикл починається з виконання блоку коду, який запитує користувача на введення числа, і продовжується, поки введене число не стане більшим за 0.

import java.util.Scanner;  

public class Main {  
 public static void main(String[] args) {  
 Scanner scanner = new Scanner(System.in);  
 int number;  

 do {  
 System.out.print("Будь ласка, введіть позитивне число: ");  
 number = scanner.nextInt();  
 } while (number <= 0); // Цикл триває, поки число не стане позитивним  

 System.out.println("Ви ввели позитивне число: " + number);  
 scanner.close();  
 }  
}

Оновлення цін за допомогою циклу For

Після підвищення мінімальної зарплати всі ціни на товари потрібно оновити. Для цього можна використовувати цикл for, як у прикладі нижче. (Реальність буває гіркою, але краще пояснити було б складно.)

double[] prices = {1.0, 0.5, 2.5}; // Ціни на фрукти: яблука, апельсини, банани  
for (int i = 0; i < prices.length; i++) {  
 prices[i] = prices[i] * (1 + коефіцієнт підвищення + додатковий коефіцієнт);   
 System.out.println("Оновлена ціна: " + prices[i]);  
}

Перегляд кошика клієнта за допомогою For-each

Цикл for-each використовується для перебору кожного елемента в списку або масиві. У прикладі нижче показано, як перебрати кошик клієнта та вивести назви товарів, доданих до кошика.

String[] cart = {"Яблуко", "Апельсин", "Банан"};  
for (String fruit : cart) {  
 System.out.println(fruit + " додано до кошика.");  
}

Обмеження продажів за допомогою Break

У деяких випадках може знадобитися припинити продажі після досягнення певної суми. У цьому прикладі break використовується для зупинки циклу, коли загальна сума перевищує 5000 грн.

for (double price : itemPrices) {  
 if (total + price > 5000) { // Якщо загальна сума перевищує 5000 грн  
 System.out.println("Ліміт суми перевищено: " + (total + price));  
 break;  
 }  
 total += price;  
}  

System.out.println("Загальна сума: " + total);

Фільтрація товарів за допомогою If

Ще один приклад — використання оператора if із перевіркою. Наприклад, можна перевірити, чи не входить певний товар до списку, наприклад, через алергію клієнта.

String[] fruits = {"Яблуко", "Апельсин", "Фісташки", "Банан"};  
String customerAllergy = "Фісташки"; // Алергія клієнта  
for (String fruit : fruits) {  
 if (!fruit.equals(customerAllergy)) {  
 System.out.println(fruit + " можна безпечно продавати.");  
 }  
}

На цьому сьогодні закінчуємо.

Сподіваюся, вам сподобалося!

Перекладено з: Döngüler ve Looplar.

Leave a Reply

Your email address will not be published. Required fields are marked *