JavaRush /Курсы /JAVA 25 SELF /Вложенные циклы и их применение

Вложенные циклы и их применение

JAVA 25 SELF
4 уровень , 5 лекция
Открыта

1. Введение

Начнем с вопроса: для чего вообще нужно вкладывать один цикл внутрь другого? Дело в том, что часто наши данные или задачи организованы не просто в одну линию, а, например, в таблицу, сетку или даже в многомерную структуру. Допустим, вы хотите вывести на экран таблицу умножения, пройтись по двумерному массиву или пересчитать пересечения между всеми парами элементов. Здесь вам одного цикла явно не хватит — нужен цикл в цикле.

В программировании вложенный цикл — это как два будильника: наружный начинает звонить, а внутри него запускается еще один, который будет звенеть каждый раз, пока первый активен. Так, пока идет одна «внешняя» итерация, внутренняя проходит весь свой путь (и делает это снова и снова для каждой итерации внешнего).

Хороший пример — часы и минуты. Часы — это внешний цикл от 0 до 23, минуты — внутренний цикл от 0 до 59. На каждое изменение внешнего цикла внутренний успевает пробежать все свои значения.

2. Синтаксис вложенных циклов

В Java синтаксис вложенных циклов ничем не отличается от обычных циклов — вы просто пишете один цикл внутри тела другого. Посмотрим на примеры с for и while:

// Внешний цикл for
for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 4; j++)  // Внутренний цикл for
    {
        System.out.print(i + "," + j + " ");
    }
    System.out.println(); // Переход на новую строку после внутреннего цикла
}

Здесь внешний цикл контролирует переменную i (от 0 до 2), а внутренний — переменную j (от 0 до 3). Для каждого значения i внутренний цикл полностью проходит от j == 0 до j == 3. Если вы выполните этот код, увидите приятную табличку координат:

0,0 0,1 0,2 0,3 
1,0 1,1 1,2 1,3 
2,0 2,1 2,2 2,3 

Аналогичный пример с использованием while:

int i = 0;
while (i < 3)
{
    int j = 0;
    while (j < 4)
    {
        System.out.print(i + "," + j + " ");
        j++;
    }
    System.out.println();
    i++;
}

Обратите внимание: внутри каждого прохода внешнего цикла переменная внутреннего цикла (j) должна быть заново инициализирована, иначе мы увидим только одну строку!

3. Примеры работы вложенных циклов

Пример 1: вывод шахматной доски (8x8)

Пусть наша первая задача — вывести на экран классическую шахматную доску в виде черных и белых клеток (пусть ‘#’ — черная, ‘.’ — белая). Реализуем с помощью вложенных циклов for:

for (int row = 0; row < 8; row++)
{
    for (int col = 0; col < 8; col++)
    {
        // Если сумма номеров строки и столбца четная — клетка белая, иначе черная
        if ((row + col) % 2 == 0)
            System.out.print(".");
        else
            System.out.print("#");
    }
    System.out.println(); // После каждого ряда перенос строки
}

Результат:

_#_#_#_#
#_#_#_#_
_#_#_#_#
#_#_#_#_
_#_#_#_#
#_#_#_#_
_#_#_#_#
#_#_#_#_

Важный момент: вложенность обеспечивает то, что для каждой строки (row) мы полностью проходим по всем столбцам (col). Без вложенности мы не получили бы структуру доски — только одну строку или одну колонку.

Пример 2: таблица умножения

Один из классических кандидатов на вложенные циклы! Давайте выведем таблицу умножения 1–9:

for (int i = 1; i <= 9; i++)
{
    for (int j = 1; j <= 9; j++)
    {
        System.out.print(i * j + "\t");
    }
    System.out.println();
}

Форматирование i * j + "\t" добавляет отступы, чтобы таблица выглядела аккуратно.

Результат:

  1   2   3   4   5   6   7   8   9 
  2   4   6   8  10  12  14  16  18 
  3   6   9  12  15  18  21  24  27 
  4   8  12  16  20  24  28  32  36 
...
  9  18  27  36  45  54  63  72  81 

4. Вложенные циклы и управление ими — нюансы

О влиянии break и continue во вложенных циклах

Вот тут многие новички попадаются! Если вы используете break или continue во внутреннем цикле, они влияют только на этот цикл. Внешний продолжает свою работу как ни в чем не бывало.

Пример: досрочный выход только из внутреннего цикла

for (int i = 0; i < 3; i++)
{
    for (int j = 0; j < 5; j++)
    {
        if (j == 3)
            break; // выскакиваем только из внутреннего цикла!
        System.out.print(i + "," + j + " ");
    }
    System.out.println();
}

Результат:

0,0 0,1 0,2 
1,0 1,1 1,2 
2,0 2,1 2,2 

Если вам нужно выйти сразу из двух вложенных циклов (например, срочно завершить поиск при первом успешном совпадении в таблице), обычно используют флаг или специальный прием (например, return — если всё происходит внутри функции).

5. Визуализация вложенных циклов

Иногда бывает сложно «увидеть» последовательность исполнения вложенных циклов. Взглянем на следующую блок-схему:

nested-loops-scheme

В табличной форме — сколько всего итераций будет при i от 1 до 3, j от 1 до 4?

i j (перебирается для каждого i) Итераций внутреннего цикла
1 1, 2, 3, 4 4
2 1, 2, 3, 4 4
3 1, 2, 3, 4 4
Всего: 3 × 4 = 12

6. Ошибки и подводные камни при работе с вложенными циклами

Распространенная ошибка — неверно инициализировать переменную внутреннего цикла. Например, объявить её вне внешнего цикла, но не сбрасывать на каждом шаге. В итоге внутренний цикл может не выполняться вовсе или выполняться неправильно.

int j = 0;
for (int i = 0; i < 3; i++)
{
    while (j < 4) // Ой! j уже мог быть равен 4 после первой итерации.
    {
        System.out.print(i + "," + j + " ");
        j++;
    }
    System.out.println();
}

Здесь цикл отработает только один раз. Не забывайте инициализировать переменные внутренних циклов внутри внешних!

Также, если случайно написать два вложенных цикла с одинаковыми переменными (for (int i = 0; ...) { for (int i = 0; ...) { ... } }), компилятор вас поругает: переменная уже определена.

1
Задача
JAVA 25 SELF, 4 уровень, 5 лекция
Недоступна
Координатная сетка на радаре 🗺️
Координатная сетка на радаре 🗺️
1
Задача
JAVA 25 SELF, 4 уровень, 5 лекция
Недоступна
Прямоугольник из астероидов ⭐
Прямоугольник из астероидов ⭐
1
Задача
JAVA 25 SELF, 4 уровень, 5 лекция
Недоступна
Создание игрового поля 🎲
Создание игрового поля 🎲
1
Задача
JAVA 25 SELF, 4 уровень, 5 лекция
Недоступна
Подбор идеального пароля 🔒
Подбор идеального пароля 🔒
1
Опрос
Циклы, 4 уровень, 5 лекция
Недоступен
Циклы
Циклы while, for, do-while
Комментарии (30)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Igor Erokhin Уровень 5
13 апреля 2026
Задача: Координатная сетка на радаре. Никто таким образом не определит координаты - должны быть пробелы. Задача не проходит, если между координатами ставить пробелы. Во-вторых попробуйте их в принципе прочитать: 0,00,10,20,3 1,01,11,21,3 2,02,12,22,3
Юрий Уровень 44
19 июля 2026
У вас может не проходит, потому что вы и в конце строки пробел ставите? Надо что бы только между координатами был пробел.
Дмитрий Уровень 1
3 марта 2026
Прикольная тема, в целом. Зашло)
SB Уровень 59
17 февраля 2026
Andrei Provotorov Уровень 66
15 февраля 2026
Прямоугольник из астероидов ⭐ - идеешка местна криво отображает символы, указатель строки где печатаю не там
Anonymous #3628287 Уровень 1
10 февраля 2026
Очень удобно смотреть объяснение задачи в Microsoft Copilot или Gemini. Так подробно объясняют, что можно понять и логику задачи и технологические тонкости.
Андрей Уровень 27
4 февраля 2026
В четвертой задаче результат не соответствует условию. В условии речь шла о двух цифрах (Поэтому в первом решении я делал циклы до 9 -задавал условие меньше 10). В результате в ответе 3 и 10. 10 это уже не цифра, а число. В результате пароль получился из трех цифр.
Ilya Pozdnyakov Уровень 13
4 февраля 2026
Аналогично. Полный бардак с заданиями 😡
Anna Klushkina Уровень 66
2 января 2026
⛏ Продолжаем продираться
Anonymous #6442887 Уровень 60
12 декабря 2025
Классная тема в этой лекции
Азат Басиров Уровень 7
30 ноября 2025
в первой задаче не понял для чего было добавлено еще одно условие, но я там ничего не писал и задача решилась , но по этому пункту вышла ошибка
seeoxxx Уровень 21
1 декабря 2025
if (j < 3) { System.out.print(" "); }
Daniil Tokarev Уровень 8
1 декабря 2025
Так же сбило с толку, решил сделать без условия и тоже прошло
kuzie Уровень 5
18 ноября 2025
Я немного в непонятках, во время прохождения теста был вопрос "Какой из приведённых ниже циклов не выполнит тело ни разу, если условие ложно с самого начала?". Я ответил while, но мне засчитало ошибку, но ведь ответ правильный, я даже в компиляторе проверил, оно не выполняет ни разу.. P.S. Тьфу, оказывается можно было выбрать for и while, ну что за кривые ответы, я думал это просто непонятный ответ для "Отвлечения"