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");
Програма буде безліч разів виводити на екран літеру С.
Код Пояснення
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 і Pascal

Багато хто з вас вивчав у школі мову 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;
}