На Горох
Информатика, 10 класс

§ 22. Вложенные и итерационные циклы

"Информатика (базовый уровень)", Семакин И.Г., Хеннер Е.К., Шеина Т.Ю.

Объяснение темы В оглавлении: § 22. Вложенные и итерационные циклы

Кратко о теме

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

Объяснение темы

Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.

Определения и обозначения

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

Итерационный цикл — цикл, в котором число повторений заранее неизвестно и определяется изменением условия во время выполнения программы. Например, вычисления можно продолжать, пока ошибка результата больше заданной границы. Такой цикл нужен, когда остановка зависит не от заранее заданного количества шагов, а от полученного результата.

Цикл с предусловием — цикл, в котором условие проверяется до выполнения тела. Если условие сразу ложно, тело не выполнится ни разу. Это подходит, когда сначала нужно проверить, есть ли причина начинать повторение, например осталось ли ещё число для обработки.

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

Как это устроено

Когда программа входит во внешний цикл, она выполняет его тело. Если внутри тела есть ещё один цикл, управление переходит к нему: внутренний цикл проверяет собственное условие и повторяет свои действия, пока не завершится. Только после этого программа продолжает оставшуюся часть внешнего тела и переходит к следующей его итерации. Поэтому внутренний цикл запускается заново при каждом проходе внешнего, если выполнение не прерывается командой досрочного выхода.

Количество повторений задают начальное значение управляющей переменной, её изменение и условие продолжения или завершения. Например, при старте i = 1, увеличении i на 1 и выполнении, пока i ≤ 4, цикл сделает четыре прохода. Если начальное значение уже не удовлетворяет условию, проходов не будет; если переменная изменяется в неверном направлении, условие может оставаться истинным бесконечно. В цикле по условию нужно поэтому заранее проследить несколько шагов.

При фиксированном количестве проходов внешнего цикла и одинаковом числе проходов внутреннего общее число выполнений его тела можно найти умножением: каждый внешний проход даёт одинаковое число внутренних. Например, 3 прохода по 5 действий дают 3 · 5 = 15 действий. Если же число внутренних повторений зависит от значения внешней переменной, умножение границ не подходит: нужно посчитать действия на каждом шаге и сложить. Так, при 1, 2 и 3 внутренних повторах получится 1 + 2 + 3 = 6.

В цикле while сначала проверяют условие продолжения, и лишь при его истинности выполняют тело. В repeat ... until сначала выполняют тело, затем проверяют условие завершения: повторение продолжается, пока оно ложно. Поэтому одинаковая на вид проверка в этих конструкциях может дать разные результаты, а тело repeat ... until обязательно сработает один раз. Выбирая конструкцию, выясните, нужна ли проверка до первого действия или после него.

Чтобы итерационный цикл завершился, должно меняться значение, от которого зависит проверяемое условие. Например, если цикл продолжается, пока n > 0, то n нужно уменьшать; увеличение n не приблизит условие к ложному. Изменение может быть не только прибавлением или вычитанием: в каждом проходе может меняться результат вычисления или состояние данных. Перед запуском полезно проверить начальное значение, направление изменения и момент, когда условие станет ложным либо истинным для завершения.

Сравнение способов организации циклов

Вид цикла или конструкцииКак определяется повторениеКогда проверяется условиеМинимальное число выполнений телаТипичная область применения
Цикл с параметромЗаданы начальное и конечное значения параметра, а также шагПо параметру цикла, перед очередным проходом0 или 1 — зависит от диапазонаПеребор известного числа элементов или шагов
Цикл с предусловиемПовторение идёт, пока условие истинноДо выполнения тела0Обработка данных, если заранее неизвестно, сколько их осталось
Цикл с постусловиемПовторение идёт, пока условие завершения ложноПосле выполнения тела1Запрос данных с обязательной первой попыткой
Вложенный циклВнутреннее повторение выполняется в ходе внешнего; число проходов каждого задаёт его собственное управлениеСогласно виду каждого циклаЗависит от внешнего и внутреннего цикловПеребор таблиц, матриц, пар значений

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

Разбор задач

Вывести прямоугольник из символов размером 5 строк на 7 столбцов

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

  1. Зададим внешний цикл по номерам строк от 1 до 5.
  2. Внутри него запустим цикл по столбцам от 1 до 7 и при каждом проходе выведем символ, например звёздочку, без перехода на новую строку.
  3. После завершения внутреннего цикла выведем конец строки. Затем внешний цикл начнёт следующую строку, а внутренний снова выполнит семь проходов.
  4. Проверим количество: получается 5 · 7 = 35 символов, распределённых на пять строк.

Ответ: пять строк по семь символов, например прямоугольник из звёздочек размером 5 × 7.

Найти сумму всех элементов матрицы размером n × m

Матрица содержит n строк и m столбцов, значит, чтобы учесть каждый элемент, нужно перебрать обе координаты. До начала обхода сумма должна быть равна нулю, иначе в ответ попадёт постороннее начальное значение. К ней добавляют очередной элемент при каждом посещении ячейки.

  1. Создадим переменную S и присвоим ей 0.
  2. Внешним циклом переберём номера строк i от 1 до n.
  3. Внутри каждого прохода внешнего цикла переберём столбцы j от 1 до m.
  4. Для каждой пары i и j прибавим элемент матрицы a[i, j] к S. После выхода из обоих циклов S будет содержать сумму всех n · m элементов.

Ответ: сумма находится накоплением всех элементов по строкам и столбцам. Важно не обнулять S внутри циклов: иначе предыдущие слагаемые будут потеряны.

Вывести все простые числа от 2 до N

Число простое, если у него нет делителей, кроме 1 и самого числа. Для каждого кандидата от 2 до N будем искать делитель среди целых чисел от 2 до √x. Достаточно проверять этот диапазон: если у x есть делитель больше √x, то второй делитель соответствующей пары меньше √x.

  1. Внешним циклом переберём кандидатов x от 2 до N. Для каждого кандидата заведём признак: пока делитель не найден, число считаем простым.
  2. Внутренним циклом проверим делители d от 2, пока d² ≤ x. Условие d² ≤ x позволяет не вычислять корень и эквивалентно проверке до √x.
  3. Если x делится на d без остатка, число составное. Запомним это и досрочно прекратим внутреннюю проверку: остальные делители уже не нужны.
  4. После внутреннего цикла выведем x, только если делитель не найден. Затем внешний цикл перейдёт к следующему кандидату.

Ответ: программа выведет все простые числа от 2 до N включительно. Внутренний цикл здесь итерационный: его завершение зависит от обнаружения делителя или от достижения границы проверки.

Типичные ошибки

Ошибка: считать, что внутренний цикл выполняется только один раз за проход внешнего. Так думают, потому что мысленно смешивают начало внутреннего цикла с одним его действием. На самом деле он обычно проходит полностью, а затем запускается заново при следующем проходе внешнего. Проверьте себя, проследив последовательность команд и отметив, где именно внутренний цикл завершает работу.

Ошибка: принять условие продолжения while за условие завершения repeat ... until. В while истинное условие ведёт к новому проходу, а repeat ... until заканчивает цикл, когда условие становится истинным. Путаница приводит к лишним повторам или преждевременной остановке. Перед запуском проговорите смысл проверки словами: «повторять, пока…» или «закончить, если…».

Ошибка: не менять управляющую переменную или менять её не в ту сторону. Причина часто в том, что проверяют только запись условия, но не всю последовательность значений. Например, при условии n > 0 увеличение положительного n не приближает завершение. Проверьте начальное значение и выпишите несколько последующих: должно быть видно, как цикл дойдёт до состояния остановки.

Ошибка: перемножать количества повторений, даже если внутренний цикл меняет длину в зависимости от внешнего параметра. Умножение верно только тогда, когда число внутренних проходов одинаково на каждом внешнем шаге. Если оно зависит от переменной внешнего цикла, сумму нужно составить по фактическим проходам; досрочный выход также меняет их число. Для проверки посчитайте внутренние действия отдельно при каждом значении внешней переменной.

Связь с другими темами

Для работы с циклами нужны переменные, логические выражения и условные операторы: именно они задают управление повторением и выбор дальнейшего действия. Вложенные циклы особенно важны при обработке двумерных массивов, где каждый элемент задаётся номером строки и столбца. Они также используются в сортировке, поиске и моделировании процессов. Итерационные циклы пригодятся в численных вычислениях, когда количество шагов зависит от результата или достижения нужной точности.

Что запомнить

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

Частые вопросы по теме

Чем вложенный цикл отличается от итерационного?

Вложенный цикл определяется расположением: он находится внутри тела другого цикла. Итерационный цикл определяется способом управления: число его повторений заранее неизвестно и зависит от условия, проверяемого во время работы. Цикл может быть одновременно вложенным и итерационным.

Почему внутренний цикл нужно начинать заново для каждой итерации внешнего?

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

Когда выбрать while, а когда repeat ... until?

while выбирают, если условие нужно проверить до первого выполнения тела и тело может не понадобиться вовсе. repeat ... until подходит, когда действие должно произойти хотя бы один раз, например перед первой проверкой введённых данных. В while условие означает продолжение, а в repeat ... until — завершение.

Как определить, сколько раз выполнится вложенный цикл?

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

Как найти причину бесконечного выполнения цикла?

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

Спросить по теме параграфа

§ 22. Вложенные и итерационные циклы

Учебник

Оглавление →
Предмет
Информатика
Класс
10 класс
Учебник
"Информатика (базовый уровень)", Семакин И.Г., Хеннер Е.К., Шеина Т.Ю.