
6.4. Вложенные циклы
Операторы, которые входят в состав циклов всех видов, сами также могут быть циклами. Такие циклы называют вложенными. Наиболее часто используют арифметические вложенные циклы.
Программирование вложенных циклов начинается с самого внешнего в порядке убывания их вложенности. В тело внешнего цикла включается внутренний цикл, в которой может включаться еще один цикл, по отношению к которому предыдущий внутренний цикл становится уже внешним и так далее.
Проверка окончания циклов начинается с самого внутреннего и идет в порядке возрастания их вложенности.
При использовании вложенных арифметических циклов в случае изменения значения параметра внешнего цикла необходимо восстанавливать начальные значения параметров всех внутренних циклов.
Пример 1 использования арифметических вложенных циклов. Необходимо задать работу электронных часов, начиная с момента времени 0 часов, 0 минут, 0 секунд при условии, что время экспозиции каждого набора значений равно одной секунде.
Решение. Обозначая часы через h, минуты - m, секуды – s и учитывая, что в сутках 24 часа, в одном часе 60 минут, а в одной минуте 60 секунд, автоматическую индикацию можно обеспечить при помощи следующего вложенного цикла:
For h:=0 to 23 do For m:=0 to 59 do For s:=0 to 59 do Writeln(h,’:’,m,’:’,s);
Как видно из структуры алгоритма, программа в примере 1 выведет все возможные сочетания величин (h,m,s) . Такая процедура называется полным перебором. Применение полного перебора упрощает решение многих задач, но зачастую требует выполнение слишком большого числа вычислений. Поэтому желательно по возможности сокращать его. Для этого можно, в частности, можно использовать “подвижные” границы изменения параметров вложенных циклов, зависящие от параметров внешних циклов либо от других величин, рассчитываемых в них.
Пример 2. Заданы три целочисленные величины 1 ≤ а ≤ 4; 0 ≤ b ≤ 5; 2 ≤ c ≤ 6. Необходимо вывести на экран все сочетания (а, b, c), удовлетворяющие условию нестрогого неравенства: а ≤ b ≤ c. Цифры внутри сочетания разделять пробелами.
Решение. Простейшее решение основано на полном переборе всех вариантов значений (а, b, c) и использовании условного оператора, имеет вид:
For a:=1 to 4 do For b:=0 to 5 do For c:=2 to 6 do if a<=b then if b<=c then Writeln(a,’ ’,b,’ ’,c);
Однако более быстрым и простым по структуре будет решение, основанное на сокращенном переборе за счет выбора границ изменения параметров (а, b, c):
For a:=1 to 4 do For b:=a to 5 do For c:=b to 6 do Writeln(a,’ ’,b,’ ’,c);
Вложенные арифметические циклы обычно используют для перебора значений в многомерных массивах. Данная операция будет рассмотрена ниже в Главе 8 по структурированным данным.
Вопросы для проверки знаний.
1. Какие циклы называют вложенными ?
2. Как производится программирование вложенных циклов ?
3. В каком порядке осуществляется проверка окончания вложенных циклов ?
4. Каким образом изменяются параметры внутренних циклов при изменении значения параметра внешнего цикла у вложенных арифметических циклов ?
Практическое задание.
1. Написать с использованием вложенных циклов программу, которая определяет все пары (a,b) не равных друг другу целочисленных значений a и b на отрезке от 1 до 6, у которых выражение a2+b 2- ab кратно 7.