JavaRush /Курси /Java Syntax Zero /Цикли в Java

Цикли в Java

Java Syntax Zero
Рівень 4 , Лекція 3
Відкрита

1. Цикли в нашому житті

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

  • Покласти першу сторінку на сканер
  • Натиснути кнопку сканувати
  • Покласти наступну сторінку

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

Або ще приклад: я хочу відмітити всі непрочитані листи в поштовій скриньці як спам. Колись їх потрібно було виділяти по одному і помічати як спам.

Але програмісти народ лінивий, тому цю функцію вже давно автоматизували: ви просто виділяєте будь-який список листів і натискаєте кнопку «помітити як спам», а ваш поштовий клієнт сам проходиться по цьому списку і переносить кожен лист у папку спам.

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


2. Цикл while

Оператор if-else суттєво розширив наші можливості програмування: тепер можна писати програми, які виконують різні дії в різних ситуаціях. Але є ще одна річ, яка зробить наші програми на порядок потужнішими — це цикли.

У Java є 4 види циклів: while, for, for-each і do-while. Зараз ми розглянемо найперший з них.

Оператор циклу while дуже простий і складається всього з двох частин: умова і тіло циклу. Тіло циклу виконується знову і знову, поки умова дорівнює true. Загальний вигляд циклу while такий:

while (умова)
   команда;
Запис циклу while з однією командою
while (умова)
{
   блок команд
}
Запис циклу while з блоком команд

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

Це працює так: спочатку перевіряється умова, і якщо вона істинна, виконується тіло циклу (команда або блок команд), потім знову перевіряється умова і знову виконується тіло циклу. І так доти, поки умова не стане хибною.

Якщо умова завжди буде істинна, значить програма ніколи не завершить роботу і завжди буде виконувати цикл.

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


3. Приклади циклів

Ось кілька практичних прикладів використання циклів.

Код Пояснення
int  n = 5;
while (n > 0)
{
   System.out.println(n);
   n--;
}
На екран буде виведено 5 рядків:
5
4
3
2
1
Код Пояснення
int  n = 0;
while (n < 10)
{
   System.out.println(n);
   n++;
}
На екран буде виведено 10 рядків:
0
1
...
8
9
Код Пояснення
Scanner console = new Scanner(System.in);
while(console.hasNextInt()) {
   int x = console.nextInt();
} 
Програма зчитує з клавіатури числа до того моменту, поки вводять саме числа.
Код Пояснення
while (true)
   System.out.println("C");
Програма буде безкінечно друкувати на екран букву C.
Код Пояснення
Scanner console = new Scanner(System.in);
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
Програма буде вводити рядки з клавіатури,

поки не буде введено рядок exit.

Функція equals() у попередньому прикладі використовується для порівняння рядків. Якщо рядки рівні, функція поверне результат — true, якщо рядки не рівні, то поверне false.



4. Цикл в циклі

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

З циклами також так можна. Щоб написати цикл в циклі, потрібно у тілі першого циклу написати другий. Виглядати це буде приблизно так:

while (умова зовнішнього циклу)
{
   while (умова внутрішнього циклу)
   {
     блок команд
   }
}
Цикл whileблоком команд) всередині іншого циклу while

Розберемо три задачі.

Задача 1. Припустимо, ми хочемо написати програму, яка б виводила на екран 4 рази слово Мама. Цикл — це саме те, що нам потрібно. І приблизно так виглядав би наш код:

Код Пояснення
int  n = 0;
while (n < 4)
{
   System.out.println("Мама");
   n++;
}
На екран будуть виведені 4 рядки:
Мама
Мама
Мама
Мама

Задача 2. Ми хочемо написати програму, яка б виводила в один рядок 5 літер А. Для цього нам знову потрібен цикл. Ось як буде виглядати цей код:

Код Пояснення
int n = 0;
while (n < 5)
{
   System.out.print("A");
   n++;
}
Замість println пишемо print, інакше кожна літера A буде в окремому рядку.

На екран буде виведено:
AAAAA

Задача 3. Ми хочемо вивести на екран прямокутник з літер А розміром у 4 рядки та 5 стовпців. А ось для цього нам вже потрібні вкладені цикли. Просто візьмемо перший приклад, де ми виводимо 4 рядки, і замінимо код по виводу одного рядка на код з другого прикладу.

Код Пояснення
int n = 0;


      
while ( n < 4) { int m = 0;
while ( m < 5) { System.out.print("А"); m++; }
System.out.println(); n++; }
 
Зовнішній цикл позначено фіолетовим кольором, він використовує змінну n для підрахунку кількості витків циклу.

Внутрішній цикл позначено зеленим кольором. Для підрахунку кількості витків циклу він використовує змінну m.

Потрібно явно переносити курсор на наступний рядок після того, як відпрацював внутрішній цикл. Інакше всі літери, які виведе програма, будуть в одному рядку.

На екран буде виведено:
ААААА
ААААА
ААААА
ААААА

Зовнішній та внутрішній цикли повинні використовувати різні змінні для підрахунку кількості вже зроблених витків. Також довелося додати команду System.out.println() після внутрішнього циклу, адже він друкує літери А в один рядок, і після виводу всіх літер хтось має перенести курсор на новий рядок.



5. Порівняння циклів: Java vs Pascal

Багато з вас вивчали в школі Паскаль, тому, щоб полегшити вам розуміння матеріалу, наведемо порівняння циклів while у мові Pascal і в Java. Якщо ви не знаєте Pascal, просто пропустіть цей матеріал.

Pascal Java
i := 3;
While i >= 0 Do
   Begin
      WriteLn(i);
      i := i - 1;
   End;
int i = 3;
while (i >= 0)
{
   System.out.println(i);
   i--;
}
i := 0;
While i < 3 Do
   Begin
      WriteLn(i);
      i := i + 1;
   End;
int i = 0;
while (i < 3)
{
   System.out.println(i);
   i++;
}
IsExit := False;
While Not isExit Do
   Begin
      ReadLn(s);
      isExit :=  (s = 'exit');
   End;
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
While True Do
   WriteLn('C');
while (true)
   System.out.println("C");
While True Do
   Begin
     ReadLn(s);
     If s = 'exit' Then
       Break;
   End;
while (true)
{
   String s = console.nextLine();
   if (s.equals("exit"))
     break;
}

Коментарі (37)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Владислав Рівень 1
28 травня 2025
Над задачею з перевіркою на стоп слово просидів декілька днів. Але все таки методом перечитки лекції та додаткових ресурсів дійшов до результата. Дякую.
Andreyjava Rush Рівень 6
24 лютого 2025
Підкажіть чому int n = 0; потрібно записувати в цикл while? Якщо записуй відразу, то результат тільки одна строка package ua.javarush.task.pro.task04.task0404; public class Solution { public static void main(String[] args) { int n = 0; int m = 0; while (m < 5) { while (n < 10) { System.out.print("Q"); n++; } System.out.println(); m++; } } }
Гаркін Рівень 14
2 червня 2024
Якщо дивились CS50 , то у лекції 5.3 є корисна порада для циклів for Якщо не дивились (бо вона дається на прикінці 13 рівня), то ось Вам порада: якщо разом з циклом for Вам треба використовувати довжину (рядка або масиву) як обмеження , то не користуйтесь рядком:

for (int i = 0; i < array.length ; i++)
а одразу звикайте до

for (int i = 0, n = array.length; i < n ; i++)
Pavlo Рівень 8
11 травня 2024
int n = 10; while (n != 0) { int m = 20; while (m != 0) { if ((m == 1 || m == 20 || n == 1 || n == 10)) System.out.print("Б"); else System.out.print(" "); m--; }; n--; System.out.println(); };
Василь Рівень 4
30 жовтня 2025
і сенс викладати готове рішення? Я б на місці адмінів банив такі повідомлення.
Ва Дим Рівень 28
5 березня 2024
я задачку на підкумок час вирішував а з останньою справився за 10 хв
Kolapsec Рівень 7
24 листопада 2023
Поки проста задача, все ок, виконую радуюсь як дитя. Тільки щось складніше - каша в голові... це пройде?
Гаркін Рівень 14
9 лютого 2024
Саме коли ти вирішуєш хоч трохи щось складніше від Easy - ти починаєш дійсно працювати мозгами. Завдання Easy це щоб ти отримував дофамінчик (задоволення) і продовжував навчання.
Anonymous #3312433 Рівень 5
27 вересня 2023
А, прикольно, тобто виявляється, є якісь hasNextLine() та hasNextInt(), які можуть розрізняти числа від строки й відповідно налаштовувати різні логіки обробки. Може, треба було написати десь про це... Це якщо зі сканером працювати, а якщо з бафердРідером, які там методи?
Юрій Рівень 16
29 вересня 2023
по це писали в 8-й лекції 2-го рівня
4 вересня 2023
Здається, зрозумів, шо куди, але -- то не точно. Бо поки той цикл в циклі написав, сам, ледь, в цикл не впав, а разом з ним і в депресію. Але ж, на те воно і навчання))
Sergey Рівень 13
23 вересня 2024
Щоб не плутатись в циклах, треба правильно називати змінні - не a,b,n,m,- а шось на кшталт "rowNumber, columnNumber". - так легше орієнтуватись.
Василь Рівень 4
3 липня 2023
Над останньою задачею покипів трохи. Як на мене то її б легше було вирішити через цикл for, але умова вимагала while.
Євгеній Рівень 14 Expert
11 травня 2023
лінь - рушій прогресу))