Цикл for

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

1. Порівняння циклів for і while

Цикл while можна використовувати у всіх випадках, коли команду або групу команд потрібно виконати кілька разів. Однак серед усіх цих випадків один варто виділити особливо.

Це випадок, коли програміст (автор програми) заздалегідь знає, скільки разів має виконуватися його цикл. Зазвичай для цього використовується спеціальна змінна-лічильник, яка під час кожної ітерації циклу збільшується (або зменшується) на 1.

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

А якщо тіло циклу велике? Або маємо кілька вкладених циклів? Загалом у таких випадках бажано зібрати всю цю інформацію про змінну-лічильник в одному місці. Так у мові Java з'явився цикл for. Він теж має зовсім нескладний вигляд:

for (команда1; умова; команда2)
{
   блок команд
}

У циклі while у круглих дужках була тільки умова, а тут додано ще дві команди, розділені крапкою з комою.

Насправді все досить просто: компілятор перетворює цикл for на звичайний цикл while таким чином:

команда1;
while (умова)
{
   блок команд
   команда2;
}

Покажемо це на прикладі: два приклади нижче ідентичні.

Варіант 1 Варіант 2
for (int i = 0; i < 20; i++)
{
 System.out.println(i);
}
int i = 0;
while (i < 20)
{
 System.out.println(i);
   i++;
}

Ми просто зібрали в одному місці весь код, який стосується змінної-лічильника — i.

команда1 у циклі for виконується тільки один раз перед початком циклу (це видно у другому прикладі)

команда2 виконується таку саму кількість разів, як і тіло циклу, але вона виконується щоразу вже після повного завершення тіла циклу


2. Де використовується цикл for

Цикл for використовується в Java, мабуть, найчастіше з усіх видів циклів. Він застосовується скрізь, тому що для програмістів це просто зрозуміліша й зручніша форма запису циклу while. Практично будь-який цикл while можна перетворити на цикл for.

Приклади:

Цикл while Цикл for
int i = 3;
while (i >= 0)
{
   System.out.println(i);
   i--;
}
for (int i = 3; i >= 0; i--)
{
   System.out.println(i);
}
int i = 0;
while (i < 3)
{
   System.out.println(i);
   i++;
}
for (int i = 0; i < 3; i++)
{
   System.out.println(i);
}
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
for (boolean isExit = false; !isExit; )
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
while (true)
   System.out.println("C");
for (; true; )
   System.out.println("C");
while (true)
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}
for (; true; )
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}

Зверніть увагу на останній приклад. Там пропущені команди для роботи з лічильником циклу. Немає лічильника —- немає команд.

Java дозволяє не писати в циклі for команди для ініціалізації лічильника та змінення лічильника. І навіть вираз-умову циклу можна не писати.


4
Задача
Java Syntax Zero, 4 рівень, 6 лекція
Недоступна
Парні числа
Парні числа

3. Особливості використання циклу for

Важливий момент щодо використання циклу for і операторів break і continue.

Оператор break у циклі for діє так само, як і в циклі while — призводить до негайного завершення циклу. А от коли використовується оператор continue, тіло циклу пропускається, а команда2 (яка змінює лічильник циклу) — ні.

Подивімося ще раз, як пов'язані між собою цикли for і while.

for (команда1; умова; команда2)
{
   блок команд
}
команда1;
while (умова)
{
   блок команд
   команда2;
}

Якщо в блоці команд циклу for викликати оператор continue, наступні команди блоку будуть пропущені, а от команда2 (яка змінює лічильник циклу for) все одно буде виконана.

Повернімося до нашого прикладу з пропусканням чисел, що діляться на 7.

Цей код зациклиться Цей код чудово працюватиме
int i = 1;
while (i <= 20)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
   i++;
}
for (int i = 1; i <= 20; i++)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
}

Код із циклом while не діятиме — значення змінної i ніколи не перевищить 7. А от код із циклом for діятиме чудово.


4
Задача
Java Syntax Zero, 4 рівень, 6 лекція
Недоступна
Сума кратних чисел
Сума кратних чисел

4. Порівняння циклів for: Java і Pascal

До речі, у мові Pascal теж є цикл For. Цей цикл взагалі є майже в усіх мовах програмування. Але в Pascal він набагато зрозуміліший. Приклади:

Pascal Java
For i := 1 to 10 do
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i++)
{
   System.out.println(i);
}
For i := 1 to 10 do step 2
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i = i + 2)
{
   System.out.println(i);
}
For i := 10 downto 0 do step 2
Begin
   Writeln(i);
End;
for (int i = 10; i >= 0; i = i - 2)
{
   System.out.println(i);
}
Коментарі (31)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Владислав Рівень 1
5 червня 2025
Долго не мог понять почему код прерывался на 0. Делал сразу 2 условия в самоме цикле, но вывод был 0. Переделал на if и все получилось. Так понимаю в цикле нельзя использовать условные операторы. Но зашел в правильное решение а там начало вообще от 2 начинается, а не с 1.... И не понимаю почему i = i +2
Іван Рівень 8
10 листопада 2024
Все начебто зрозуміло з першого погляду, потім зануряєшся глибше і глибше-розумієш що - щось не зрозумів і починаєш з початку - замкнуте коло. Поки що я знайшов одне рішення, як вийти з замкнутого кола, це позитивно мислити ))! Бажаю усім - знайти вихід з замкнутого кола!
Olga Рівень 5
26 листопада 2024
Іване, дякую за розуміння того, що я не одна така))
Alexander Safronyuk Рівень 5
10 серпня 2024
Умову задачі взагалі не зрозумів. Доки не питався chat gpt, не зрозуміло було як це має на ділі працювати. Було б краще, якби ви добавили якийсь приклад роботи в описі завдання.
oncer Рівень 7 Expert
25 липня 2024
Ці задачі здалися мені набагало простішими, ніж з попереднього урока.
gummer Рівень 11
26 лютого 2024
В принципі, якщо правильно побудувати останнє завдання, continue там зайвий (без continue код не проходить перевірку, і я лише дарма втратив спробу. Довелось дописати else{continue;} просто, аби код пройшов :C )
hidden #3421731 Рівень 28
10 березня 2024
так можна і не дописувати

else{continue;}
можна зразу після

sum += start;
continue;
Євгеній Рівень 14 Expert
12 травня 2023
добре, що в курсі є порівняння з мовою Pascal, так я багато чого зрозумів, з того що раніше не піддавалося розумінню ))
Сергей Брага Рівень 6
20 квітня 2023

  //напишіть тут ваш код
        for(; start < end; start++)
        {
            if((start % multiple) == 0)
            sum = sum + start;
            continue;
        }    
Vitalii Рівень 11
28 липня 2023
хм... а нащо тут continue взагалі? цикл і без нього буде ітерувати далі))
Kolapsec Рівень 7
26 листопада 2023
!= 0 :)
Ledzen Рівень 4
15 березня 2023
Раніше якось міг додуматись до вирішення, зараз сиджу читаю умову і не розумію з чого починати писати програму :(
Женя Иващенко Рівень 32
4 лютого 2023
Підскажіть , для чого потрібно оголошувати (в останньому завданні) (int i = start;) , якщо START вже дорівнює 1 (так записано в Input data) ? Чому не можна просто використовувати start замість i ?
Василь Рівень 10 Expert
23 березня 2023
Не потрібно оголошувати, я використовував start і прийняло роботу.
les_yeux_blancs Рівень 50
17 квітня 2023
використовувати start то можна, але тільки якщо ти не проти того, що значення цього самого start буде змінюватись і в результаті стане рівним end тобто, якщо сильно захочеш вкінці зробити щось типу System.out.println("Numbers from " + start + " to " + end + ":"), то отримаєш "Numbers from 10 to 10:"
Volodymyr Рівень 5
23 серпня 2022
в другій задачі блок

if (i % multiple != 0) {
                continue;
            }
            sum = sum + i;
виглядає не дуже доречним, значно логічніше:

if (i % multiple = 0) {
                sum = sum + i;
            }
            
Bandiu Band Рівень 25
6 вересня 2022
Спочатку так і зробив, не замітив умову з continue
Roma Chernesh Рівень 16
30 листопада 2022
теж саме:) continue у данній конкретній задачі прям зовсім не в тему
theylovevalera Рівень 51
12 березня 2023
Такий код не працюватиме,замість "= "там повинно бути "=="🙃
Євгеній Рівень 14 Expert
12 травня 2023

sum += i;
SeVans Рівень 6
23 червня 2023

if (i % multiple = 0) {
                sum = sum + i;
            }
тут буде помилка в умові, правильно:

if ((i % multiple) == 0) {
                sum += i;
            }