Циклы в Java: for, while и do-while — бесплатный урок

Циклы в Java: for, while и do-while

Бесплатный открытый урок: три вида циклов в Java, вложенные циклы, break и continue, область видимости счётчика и типичные зацикливания. Примеры проверены на JDK 21.

for и while

for берут, когда число повторений известно заранее, while — когда цикл выполняется, пока держится условие. В заголовке for три части: объявление счётчика, условие продолжения и шаг.

public class Summa {
    public static void main(String[] args) {
        int summa = 0;

        for (int i = 1; i <= 10; i++) {
            summa += i;
        }
        System.out.println("Сумма чисел от 1 до 10: " + summa);

        int otschet = 3;
        while (otschet > 0) {
            System.out.println(otschet);
            otschet--;
        }
        System.out.println("Пуск!");
    }
}
Сумма чисел от 1 до 10: 55
3
2
1
Пуск!

Запись summa += i — сокращение для summa = summa + i, а otschet-- уменьшает переменную на единицу. Если забыть otschet--, условие никогда не станет ложным и программа зациклится: остановить её можно сочетанием Ctrl+C в терминале.

do-while: хотя бы один проход

Разница с while одна, но существенная: условие проверяется после тела, поэтому тело выполняется минимум один раз. Так пишут меню и повторный ввод данных.

int popytka = 0;

do {
    popytka++;
    System.out.println("Попытка " + popytka);
} while (popytka < 3);
Попытка 1
Попытка 2
Попытка 3

break и continue

continue пропускает остаток текущего шага и переходит к следующему, break выходит из цикла целиком. Оба действуют только на ближайший цикл.

for (int i = 1; i <= 10; i++) {
    if (i % 2 != 0) {
        continue;
    }
    if (i > 6) {
        break;
    }
    System.out.println(i);
}
2
4
6

Вложенные циклы

Внутренний цикл полностью отрабатывает на каждом шаге внешнего. Классический пример — таблица умножения; String.format("%3d", ...) выравнивает числа по три знака, чтобы столбцы не разъехались.

public class Tablica {
    public static void main(String[] args) {
        for (int i = 2; i <= 4; i++) {
            String stroka = "";
            for (int j = 1; j <= 5; j++) {
                stroka = stroka + String.format("%3d", i * j);
            }
            System.out.println(stroka);
        }
    }
}
  2  4  6  8 10
  3  6  9 12 15
  4  8 12 16 20

Где живёт счётчик

Переменная, объявленная в заголовке for, существует только внутри цикла. Обращение к ней снаружи не компилируется:

for (int i = 0; i < 3; i++) {
    System.out.println(i);
}

System.out.println(i);

Компилятор ответит cannot find symbol. Если значение нужно после цикла, объявите переменную до него — тогда она переживёт цикл.

Частые ошибки в условии

  • Сдвиг на единицу. Для десяти повторений пишут i = 0; i < 10 или i = 1; i <= 10. Смесь этих двух вариантов даёт девять или одиннадцать шагов.
  • Изменение счётчика внутри тела при уже работающем шаге i++ — цикл начинает перескакивать значения.
  • Точка с запятой сразу после заголовка: for (int i = 0; i < 3; i++); — тело цикла пустое, а следующий блок выполнится один раз. Компилятор об этом не предупредит.

Задание для самопроверки

  1. Напечатайте все числа от 1 до 100, которые делятся на 7 без остатка.
  2. Посчитайте факториал числа 10 в переменной типа long. Затем повторите с int для числа 20 и объясните результат.
  3. Выведите числа от 1 до 15: вместо кратных трём печатайте слово «раз», вместо кратных пяти — «два», вместо кратных пятнадцати — «раз-два».

Что дальше

Предыдущий урок — ветвления: if, else и switch, следующий — массивы и списки. Все бесплатные занятия собраны в разделе «Уроки Java».