"Информатика (базовый уровень)", Семакин И.Г., Хеннер Е.К., Шеина Т.Ю.
Вложенные и итерационные циклы помогают выполнять повторяющиеся действия, когда одного цикла недостаточно или число повторений заранее неизвестно. Вложенный цикл находится внутри другого: внешний организует крупные шаги, а внутренний выполняет действия на каждом из них. Итерационный цикл продолжается, пока выполняется условие, которое меняется во время работы программы. Чтобы цикл завершился правильно, нужно выбрать верное условие и предусмотреть изменение управляющей переменной.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Вложенный цикл — цикл, расположенный внутри тела другого цикла. Внешний цикл задаёт повторяющиеся крупные шаги, а внутренний выполняет набор действий на каждом из них. Такое устройство удобно, например, при обработке строк и столбцов таблицы: один цикл выбирает строку, другой перебирает её элементы.
Итерационный цикл — цикл, в котором число повторений заранее неизвестно и определяется изменением условия во время выполнения программы. Например, вычисления можно продолжать, пока ошибка результата больше заданной границы. Такой цикл нужен, когда остановка зависит не от заранее заданного количества шагов, а от полученного результата.
Цикл с предусловием — цикл, в котором условие проверяется до выполнения тела. Если условие сразу ложно, тело не выполнится ни разу. Это подходит, когда сначала нужно проверить, есть ли причина начинать повторение, например осталось ли ещё число для обработки.
Цикл с постусловием — цикл, в котором условие проверяется после выполнения тела, поэтому тело выполняется хотя бы один раз. Он удобен, если сначала нужно выполнить действие, а затем решить, повторять ли его. Например, программа может запросить ввод, а после проверить, удовлетворяет ли он требованиям.
Когда программа входит во внешний цикл, она выполняет его тело. Если внутри тела есть ещё один цикл, управление переходит к нему: внутренний цикл проверяет собственное условие и повторяет свои действия, пока не завершится. Только после этого программа продолжает оставшуюся часть внешнего тела и переходит к следующей его итерации. Поэтому внутренний цикл запускается заново при каждом проходе внешнего, если выполнение не прерывается командой досрочного выхода.
Количество повторений задают начальное значение управляющей переменной, её изменение и условие продолжения или завершения. Например, при старте 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.
Матрица содержит n строк и m столбцов, значит, чтобы учесть каждый элемент, нужно перебрать обе координаты. До начала обхода сумма должна быть равна нулю, иначе в ответ попадёт постороннее начальное значение. К ней добавляют очередной элемент при каждом посещении ячейки.
Ответ: сумма находится накоплением всех элементов по строкам и столбцам. Важно не обнулять S внутри циклов: иначе предыдущие слагаемые будут потеряны.
Число простое, если у него нет делителей, кроме 1 и самого числа. Для каждого кандидата от 2 до N будем искать делитель среди целых чисел от 2 до √x. Достаточно проверять этот диапазон: если у x есть делитель больше √x, то второй делитель соответствующей пары меньше √x.
Ответ: программа выведет все простые числа от 2 до N включительно. Внутренний цикл здесь итерационный: его завершение зависит от обнаружения делителя или от достижения границы проверки.
Ошибка: считать, что внутренний цикл выполняется только один раз за проход внешнего. Так думают, потому что мысленно смешивают начало внутреннего цикла с одним его действием. На самом деле он обычно проходит полностью, а затем запускается заново при следующем проходе внешнего. Проверьте себя, проследив последовательность команд и отметив, где именно внутренний цикл завершает работу.
Ошибка: принять условие продолжения while за условие завершения repeat ... until. В while истинное условие ведёт к новому проходу, а repeat ... until заканчивает цикл, когда условие становится истинным. Путаница приводит к лишним повторам или преждевременной остановке. Перед запуском проговорите смысл проверки словами: «повторять, пока…» или «закончить, если…».
Ошибка: не менять управляющую переменную или менять её не в ту сторону. Причина часто в том, что проверяют только запись условия, но не всю последовательность значений. Например, при условии n > 0 увеличение положительного n не приближает завершение. Проверьте начальное значение и выпишите несколько последующих: должно быть видно, как цикл дойдёт до состояния остановки.
Ошибка: перемножать количества повторений, даже если внутренний цикл меняет длину в зависимости от внешнего параметра. Умножение верно только тогда, когда число внутренних проходов одинаково на каждом внешнем шаге. Если оно зависит от переменной внешнего цикла, сумму нужно составить по фактическим проходам; досрочный выход также меняет их число. Для проверки посчитайте внутренние действия отдельно при каждом значении внешней переменной.
Для работы с циклами нужны переменные, логические выражения и условные операторы: именно они задают управление повторением и выбор дальнейшего действия. Вложенные циклы особенно важны при обработке двумерных массивов, где каждый элемент задаётся номером строки и столбца. Они также используются в сортировке, поиске и моделировании процессов. Итерационные циклы пригодятся в численных вычислениях, когда количество шагов зависит от результата или достижения нужной точности.
Чем вложенный цикл отличается от итерационного?
Вложенный цикл определяется расположением: он находится внутри тела другого цикла. Итерационный цикл определяется способом управления: число его повторений заранее неизвестно и зависит от условия, проверяемого во время работы. Цикл может быть одновременно вложенным и итерационным.
Почему внутренний цикл нужно начинать заново для каждой итерации внешнего?
После завершения внутреннего цикла его тело больше не выполняется в текущем проходе внешнего. При следующем проходе внешнего программа снова входит во внутренний цикл и проверяет его условие с начала. Так для каждого внешнего шага выполняется полный набор внутренних действий.
Когда выбрать while, а когда repeat ... until?
while выбирают, если условие нужно проверить до первого выполнения тела и тело может не понадобиться вовсе. repeat ... until подходит, когда действие должно произойти хотя бы один раз, например перед первой проверкой введённых данных. В while условие означает продолжение, а в repeat ... until — завершение.
Как определить, сколько раз выполнится вложенный цикл?
Если оба цикла выполняются фиксированное число раз и число внутренних повторений не меняется, умножьте их количества. Если внутренний цикл зависит от значения внешней переменной, посчитайте его повторы отдельно для каждого внешнего шага и сложите результаты. Учитывайте также досрочный выход из цикла.
Как найти причину бесконечного выполнения цикла?
Проверьте, изменяется ли переменная, от которой зависит условие, и приближает ли её изменение условие к завершению цикла. Затем проследите выполнение на нескольких шагах: условие может быть записано как продолжение вместо завершения или наоборот. Полезно также проверить начальное значение и направление изменения переменной.
§ 22. Вложенные и итерационные циклы