В прошлой статье речь шла о простых циклах в Паскале, таких которые не содержат в себе других циклов. Тут мы разберем принцип работы циклов, называемых вложенными. Рассмотрим их на примере цикла с параметром:
For <счетчик 1>:=<начальное знач.> To <конечное знач.> Do <тело цикла 1>;
For <счетчик 2>:=<начальное знач.> To <конечное знач.> Do <тело цикла 2>;
…
For <счетчик n>:=<начальное знач.> To <конечное знач.> Do <тело цикла n>;
Вернувшись к терминологии, отметим, что в таких структурах одни циклы называются внешними, а другие внутренними. Так цикл 2 относительно цикла 1 является внутренним, а для цикла n он внешний.
Принцип работы вложенных циклов заключается в следующем. Сначала один раз выполняется цикл, идущий первым в программе, затем управление передается следующему циклу (№2), и если после него нет никаких других циклов, то он прокручивается до конца и снова единожды выполняется внешний цикл, иначе, если после цикла №2 стоит еще один вложенный цикл, то №2 выполняется один раз, передавая управление циклу идущему после него. Такой алгоритм продолжается до тех пор, пока самый внешний цикл не выполниться необходимое количество раз.
Предположим у нас есть вложенные циклы for:
for i:=1 to m1 do
for j:=1 to m2 do
…
for k:=1 to mn do
Количество проходов по первому циклу = m1, второму = m2*m1, n-ому = mn*mn-1*mn-2*..*m2*m1. В качестве доказательства предлагаю разобраться в следующей программе.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
program counter_performance;
uses crt; var i, j, k, g, h: integer; s_i, s_j, s_k, s_g, s_h: integer; begin s_i:=0; s_j:=0; s_k:=0; s_g:=0; s_h:=0; for i:=1 to 5 do begin s_i:=s_i+1; for j:=1 to 3 do begin s_j:=s_j+1; for k:=1 to 19 do begin s_k:=s_k+1; for g:=1 to 10 do begin s_g:=s_g+1; for h:=1 to 6 do s_h:=s_h+1; end; end; end; end; write(‘i=’,s_i,‘ j=’,s_j,‘ k=’,s_k,‘ g=’,s_g,‘ h=’,s_h); readkey; end. |
Имеются 5 циклов со счётчиками от i до h. В каждом из них при помощи переменных подсчитывается, сколько раз выполняется каждый цикл. Запустив программу на своем компьютере, Вы должны увидеть такой результат:
Посчитав способом, изложенным выше, получите результат соответствующий величинам, отображенным на скриншоте.
Вложенные конструкции аналогично работают в циклах с предусловием и постусловием. В следующей программе с помощью оператора while фигурка выводиться на экран.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
program nested_loops;
uses crt; var i, j: integer; begin i:=1; j:=1; while i<20 do begin while j<i+1 do begin write(‘\’); j:=j+1; end; j:=1; i:=i+1; writeln; end; readkey; end. |
При работе с массивами очень часто применяются вложенные циклы, а когда дело доходит до матриц (двумерных массивов), то даже их заполнение, как правило, делается через рассмотренные нами в этой статье конструкции.