Как работают вложенные циклы
10.2. Вложенные циклы
Цикл называется вложенным, если он размещается внутри другого цикла. На первом проходе, внешний цикл вызывает внутренний, который исполняется до своего завершения, после чего управление передается в тело внешнего цикла. На втором проходе внешний цикл опять вызывает внутренний. И так до тех пор, пока не завершится внешний цикл. Само собой, как внешний, так и внутренний циклы могут быть прерваны командой break.
Пример 10-19. Вложенный цикл
#!/bin/bash # Вложенные циклы "for". outer=1 # Счетчик внешнего цикла. # Начало внешнего цикла. for a in 1 2 3 4 5 do echo "Итерация #$outer внешнего цикла." echo "---------------------" inner=1 # Сброс счетчика вложенного цикла. # Начало вложенного цикла. for b in 1 2 3 4 5 do echo "Итерация #$inner вложенного цикла." let "inner+=1" # Увеличить счетчик итераций вложенного цикла. done # Конец вложенного цикла. let "outer+=1" # Увеличить счетчик итераций внешнего цикла. echo # Пустая строка для отделения итераций внешнего цикла. done # Конец внешнего цикла. exit 0
| Назад | К началу | Вперед |
| Циклы и ветвления | Наверх | Управление ходом выполнения цикла |
Как работают вложенные циклы
Блок 1. Раздел 3. Тема 4
Двойные и тройные вложенные циклы
Сам по себе цикл означает, что какой-то блок кода будет повторяться. Внутри этого блока кода можно заставить повторяться другой блок кода, т.е. один цикл можно писать внутри другого. Такие циклы называются вложенными. Они нужны, например, для работы с любыми таблицами.
Рассмотрим распечатку таблицы умножения:
System.out.println ("Это таблица умножения!"); for (int a = 1; a < 10; a ++) < //внутри первого цикла можно сделать 2ой for (int b = 1; b < 10; b ++) System.out.print (" " + a*b); //печатаем числа через пробел System.out.println (); //поставить enter для новой строчки >
Вывод программы:
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
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
Чтобы распечатать одну строчку нужен цикл. А у нас тут целый набор строк. Для перебора всех строк и нужен второй цикл. Он ставит enter после каждой строки, и знает номер текущей строки.
Компилятор выполняет все команды подряд. Он идет по коду сверху вниз и встречает первый for. Для него это значит — выполнить тело этого цикла столько-то раз. Он начинает выполнять цикл первый раз, снова сверху вниз и встречает вложенный цикл. Снова это значит — выполнить тело этого цикла столько-то раз. Выполнив весь вложенный цикл, компилятор идёт дальше, а дальше — новый оборот первого цикла.
Так получаем, что на каждом обороте главного верхнего цикла будет полностью выполнены все обороты вложенного цикла. В нашем примере это означает, что на одном обороте главного цикла будет напечатана целая строка из таблицы умножения.
Подобная ситуация часто возникает в играх с клетками на игровом поле по типу морского боя. Вообще с любыми таблицами так или иначе приходится отсчитывать номер строки и номер ячейки внутри этой строки, и очень помогает двойной цикл. Мы напишем игру «морской бой» в разделе 5 про массивы и таблицы.
Пример. Распечатать символ a, так что в первой строке всего один символ, во второй — два, в третьей — три, и так далее до 5.
/* Будет вот так: a aa aaa aaaa aaaaa */ for (int i = 1; i System.out.println (); //поставить enter для новой строчки >
Как работают вложенные циклы

Внутри алгоритма циклической структуры может быть помещен другой цикл – вложенный (внутренний) цикл. Можно повторять много раз выполнение другого цикла. Вложенный цикл может быть один, но может быть и несколько вложенных циклов. Второй вложен в первый, третий – во второй и т.д
Циклы, вложены друг в друга, как «матрешки».
Цикл, содержащий в себе другой цикл, называют внешним циклом.
А цикл, содержащийся в теле другого цикла, называют внутренним циклом.
Внешние и внутренние циклы могут быть:
- с предусловием while
- с постусловием repeat
- с параметром (счетчиком) for

!Все операторы внутреннего цикла должны располагаться в теле внешнего цикла.!
For <счетчик 1>:= To Do ;счетчик>
For <счетчик 2>:= To Do ;
…
For <счетчик n>:= To Do ;счетчик>
Так цикл 2 относительно цикла 1 является внутренним, а для цикла n он внешний.
Принцип работы вложенных циклов заключается в следующем. Сначала один раз выполняется цикл, идущий первым в программе, затем управление передается следующему циклу (№2), и если после него нет никаких других циклов, то он прокручивается до конца и снова единожды выполняется внешний цикл, иначе, если после цикла №2 стоит еще один вложенный цикл, то №2 выполняется один раз, передавая управление циклу идущему после него. Такой алгоритм продолжается до тех пор, пока самый внешний цикл не выполниться необходимое количество раз.
ПРИМЕР:
Задание: напечатать числа в виде следующей таблицы
Данная таблица состоит из четырех строчек, в каждой из которых число 3 напечатано 5 раз. Строчку из пяти чисел можно напечатать с помощью одного цикла for:
for i:= 1 to 5 do
Чтобы повторить вывод строчки 4 раза, вставляем этот цикл внутрь другого:
Как работают вложенные циклы
11.1.2.7 использовать вложенные циклы при решении проблем
11.1.2.6 выполнять отладку программы
Python. Вложенные циклы
Вложенный цикл — цикл который выполняется внутри другого цикла.
Обычно вложенные циклы используются для работы с двумя измерениями, например, для печати звездочек в строках и столбцах, как показано ниже.

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


Трассировка вложенных циклов
Задача 1. Вывести звёздочки в следующем виде.

n = int(input())
m = int(input())
for i in range( n ):
for j in range( m ): # вложенный цикл
print(‘*’, end=»)
print()
Задача 2. Вывести в строку таблицу умножения числа n. (n < 10)
k = int(input())
for i in range(1, 10):
print( i , ‘*’, k , ‘=’, k * i , sep=», end=’\t’)
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45
Задача 3. Вывести таблицу умножения по следующему шаблону.

for i in range(1, 10): # начало внешнего цикла
for j in range(1, 10): # начало вложенного цикла
print(i, ‘*’, j, ‘=’, i * j, end=’\t’) # вывод таблицы умножения
print() # переход на новую строку
Задача 3. Второй вариант решения
i = 1 # инициализация параметра внешнего цикла
while i < 10: # условие внешнего цикла
j = 1 # инициализация параметра вложенного цикла
while j < 10: # условие вложенного цикла
print(i, ‘*’, j, ‘=’, i * j, end=’\t’) # вывод
j += 1 # изменение параметра вложенного цикла
i += 1 # изменение параметра внешнего цикла
print() # переход на новую строку
Команды break и continue во вложенных циклах.
while True: # начало внешнего цикла
while True: # начало вложенного цикла
if [condition]:
continue # переход к следующей итерации во вложенном цикле
if [condition]:
break # выход из вложенного цикла
if [condition]:
continue # переход к следующей итерации во внешнем цикле
if [condition]:
break # выход из внешнего цикла
Вопросы:
- Какой цикл называется вложенным?
Упражнения:
Упр. 1 Написать программу для вывода узора по образцу, используя вложенный цикл.

Образец:
Упр. 2 Совершенным числом называется целое положительное число, равное сумме своих положительных делителей, исключая само число. Например, 6 имеет делители 1, 2 и 3 (исключая само себя), а 1 + 2 + 3 = 6, поэтому 6 — совершенное число.
Напишите программу, которая выводит все совершенные числа от 1 до 100.