Глиф Учебники

Урок 5. Циклы for, while и do-while

Курс «Java» · урок 5 из 10 · 3 минуты чтения

Цикл повторяет одни и те же команды много раз: вывести числа от 1 до 100, сложить все оценки, спрашивать пароль, пока не введут верный. В Java три основных цикла: for, while и do-while.

Цикл for

for удобен, когда заранее известно, сколько раз повторять:

Java
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            System.out.println("Шаг " + i);
        }
    }
}
Вывод
Шаг 1
Шаг 2
Шаг 3
Шаг 4
Шаг 5

В скобках после for три части через точку с запятой:

  1. int i = 1 — начало: создаётся счётчик и получает первое значение. Выполняется один раз.
  2. i <= 5 — условие: проверяется перед каждым повтором. Пока оно истинно, тело цикла выполняется.
  3. i++ — шаг: выполняется после каждого повтора.
for (int i = 1; i <= 5; i++) { int i = 1 начало — один раз i <= 5 true System.out.println("Шаг " + i); i++ шаг — после тела false выход i i <= 5 вывод 1 true Шаг 1 2 true Шаг 2 3 true Шаг 3 4 true Шаг 4 5 true Шаг 5 6 false выход
Начало int i = 1 выполняется один раз, затем перед каждым повтором проверяется i <= 5, после тела выполняется шаг i++; при i = 6 условие ложно, и цикл заканчивается после пяти итераций.

Один проход тела цикла называется итерацией. Счётчик может идти с любым шагом и в любую сторону: for (int i = 10; i > 0; i -= 2) даёт 10, 8, 6, 4, 2. Переменная i существует только внутри цикла.

Сумма чисел от 1 до 100:

Java
public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
}
Вывод
5050

Переменная sum объявлена до цикла: если объявить её внутри, она будет создаваться заново на каждой итерации и обнуляться.

Цикл while

while повторяет, пока условие истинно, и подходит, когда число повторов заранее неизвестно. Например, сумма цифр числа:

Java
public class Main {
    public static void main(String[] args) {
        int n = 2024;
        int sum = 0;
        while (n > 0) {
            sum += n % 10;
            n /= 10;
        }
        System.out.println(sum);
    }
}
Вывод
8

n % 10 — последняя цифра числа, n /= 10 отбрасывает её. Цикл идёт, пока цифры не кончатся: 4 + 2 + 0 + 2 = 8.

Условие проверяется до итерации. Если оно ложно сразу, тело не выполнится ни разу.

Цикл do-while

do-while проверяет условие после итерации, поэтому тело выполняется хотя бы один раз. Это удобно для проверки ввода: сначала спросить, потом решить, спрашивать ли снова.

while — сначала проверка n > 0 да тело цикла нет после цикла ложно сразу — тело ни разу do-while — сначала тело тело цикла n <= 0 да нет после цикла тело — хотя бы один раз
while сначала проверяет условие n > 0 и при ложном условии не выполняет тело ни разу, а do-while сначала выполняет тело и только потом проверяет n <= 0, поэтому тело выполняется хотя бы один раз.
Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n;
        do {
            System.out.println("Введите положительное число:");
            n = in.nextInt();
        } while (n <= 0);
        System.out.println("Спасибо, " + n);
    }
}
Ввод
-5
0
7
Вывод
Введите положительное число:
Введите положительное число:
Введите положительное число:
Спасибо, 7

Переменная n объявлена до do: условие в while должно её видеть. После while (…) у do-while нужна точка с запятой.

break и continue

Java
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            if (i % 3 == 0) {
                continue;
            }
            if (i > 7) {
                break;
            }
            System.out.println(i);
        }
    }
}
Вывод
1
2
4
5
7

Числа, кратные трём, пропускаются через continue, а на восьмёрке break останавливает цикл.

i вывод continue continue break 1 2 3 4 5 6 7 8 9 10 1 2 — 4 5 — 7 выход не дошло continue — остаток итерации пропущен, вывода нет, цикл идёт дальше break — цикл сразу закончился, до 9 и 10 дело не дошло
При i = 3 и i = 6 continue пропускает вывод и цикл идёт к следующему i, при i = 8 break заканчивает цикл, и до 9 и 10 дело не доходит — выводятся 1, 2, 4, 5 и 7.

Цикл с условием while (true) сам не закончится никогда — выйти из него можно только через break. Так пишут программы, которые работают до команды «выход»:

Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int total = 0;
        while (true) {
            int x = in.nextInt();
            if (x == 0) {
                break;
            }
            total += x;
        }
        System.out.println("Сумма: " + total);
    }
}
Ввод
5 10 -3 0
Вывод
Сумма: 12

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

Внутри цикла может быть другой цикл. Внутренний проходит целиком на каждой итерации внешнего:

Java
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 5; j++) {
                System.out.printf("%4d", i * j);
            }
            System.out.println();
        }
    }
}
Вывод
   1   2   3   4   5
   2   4   6   8  10
   3   6   9  12  15

%4d выводит число шириной четыре знака — так столбцы получаются ровными. println() после внутреннего цикла переводит строку.

Частые ошибки

Коротко

Проверьте себя

1. Сколько раз выполнится тело цикла for (int i = 0; i < 5; i++)?
2. Чем do-while отличается от while?
3. Что делает continue внутри цикла?
4. Что выведет программа?
Java
int sum = 0;
for (int i = 1; i <= 4; i++) {
    sum += i;
}
System.out.println(sum);