Бесплатный открытый урок: три вида циклов в 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 до 100, которые делятся на 7 без остатка.
- Посчитайте факториал числа 10 в переменной типа
long. Затем повторите сintдля числа 20 и объясните результат. - Выведите числа от 1 до 15: вместо кратных трём печатайте слово «раз», вместо кратных пяти — «два», вместо кратных пятнадцати — «раз-два».
Что дальше
Предыдущий урок — ветвления: if, else и switch, следующий — массивы и списки. Все бесплатные занятия собраны в разделе «Уроки Java».