3.9.4. Вложенные циклы

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

Обратите внимание — при программировании вложенных циклов необходимо соблюдать следующее дополнительное условие: все операторы внутреннего цикла должны полностью располагаться в теле внешнего цикла.

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

var i, j :byte;
   begin
     for i:= 1 to 10 do
       for j:=1 to 10 do
         writeln (i,’*’,j,’=’,i*j);
   end;

Проанализируем действие данной программы. В разделе описания переменных описываются переменные I, J целого типа byte, выполняющие функции управляющих переменных циклов for.

Выполнение программы начинается с внешнего цикла. При первом обращении к оператору внешнего цикла for вычисляются значения начального (1) и конечного (10) параметров цикла и управляющей переменной I присваивается начальное значение 1.

Затем циклически выполняется следующее:

1. Проверяется условие I<=10.

2. Если оно соблюдается, то выполняется оператор в теле цикла, т. е. выполняется внутренний цикл.

• При первом обращении к оператору внутреннего цикла for вычисляются значения начального (1) и конечного (10) параметров цикла и управляющей переменной J присваивается начальное значение 1.

Затем циклически выполняется следующее:

• Проверяется условие J<=10.

• Если оно удовлетворяется, то выполняется оператор в теле цикла, т. е. оператор Writeln(I,' * ',J,' = ',I*J), выводящий на экран строку таблицы умножения в соответствии с текущими значениями переменных I и J.

• Затем значение управляющей внутреннего цикла J увеличивается на единицу и оператор внутреннего цикла for проверяет условие J<=10. Если условие соблюдается, то выполняется тело внутреннего цикла при неизменном значении управляющей переменной внешнего цикла до тех пор, пока выполняется условие J<=10.

Если условие J<=10 не удовлетворяется, т. е. как только J станет больше 10, оператор тела цикла не выполняется, внутренний цикл завершается и управление в программе передается за пределы оператора for внутреннего цикла, т. е. на оператор for внешнего цикла.

3. Значение параметра цикла I увеличивается на единицу, и проверяется условие I<=10. Если условие I<=10 не соблюдается, т. е. как только I станет больше 10, оператор тела цикла не выполняется, внешний цикл завершается и управление в программе передается за пределы оператора for внешнего цикла, т. е. на оператор end, и программа завершает работу.

Таким образом, на примере печати таблицы умножения и на блок-схеме (рис. 3.5) наглядно показано, что при вложении циклов внутренний цикл выполняется полностью от начального до конечного значения параметра, при неизменном значении параметра внешнего цикла. Затем значение параметра внешнего цикла изменяется на единицу, и опять от начала и до конца выполняется вложенный цикл. И так до тех пор, пока значение параметра внешнего цикла не станет больше конечного значения, определенного в операторе for внешнего цикла.

Рис. 3.5. Условное обозначение на схемах алгоритмов вложенных циклов с параметром

Еще один вариант программы, выводящей на экран таблицу умножения, но уже в виде "квадрата Пифагора", приведен ниже. Использование оператора writeln в теле внешнего цикла по i позволяет выполнить перевод курсора в начало следующей строки экрана при завершении вывода предыдущей.

Листинг 3.26 содержит программу, которая выводит на экран квадрат Пифагора — таблицу умножения.

Листинг 3.26. Вывод на экран таблицы умножения

var
    i,j: integer; { номер строки и столбца таблицы }
begin
    for i:=l to 10 do
      begin
        for j:=l to 10 do write(i*j:5);
        writeln; { перевод строки }
      end;
end.

Листинг 3.27 содержит программу, определяющую все совершенные числа меньше n.

Совершенное число — это число, равное сумме всех своих делителей, исключая себя самого, например 6=1+2+3. К настоящему времени найдено 24 совершенных числа (6, 28, 496, 8128...). Все они четные. Существуют ли нечетные совершенные числа и конечно ли их множество — неизвестно.

Листинг 3.27. Определение всех совершенных числ, меньших заданного n

var i,j,n,m: integer;
begin
    write('Введите вернюю границу: ');readln(n);
    for i:=2 to n do { начало внешнего цикла }
      begin
      m:=0; { обнуление начального значения суммы }
        { внутренний цикл: поиск и суммирование делителей }
        for j:=1 to i-1 do
        { если число i- без остатка делится на j, то число j — его делитель, }
        { поэтому увеличиваем значение m на величину значения j }
          if i mod j=0 then m:=m+j;
        if m=i then writeln(i);
      end;
end.

Листинг 3.28 содержит программу, которая для натурального n вычисляет сумму степеней: (1/1)n + (1/2)n + ...+(1/n)n

Листинг 3.28. Вычисление суммы степеней

var n,i,j: integer; a,s,p: real;
begin
   write('Введите показатель степени: '); readln(n);
   s: =0; { обнуление начального значения суммы }
   for i:=l to n do { начало внешнего цикла }
      begin
        a:=1/i; p:=a;
        for j:=2 to n do p:=p*a; { вычисление слагаемого }
        s:=s+p; { накопление суммы степеней }
      end ;
    writeln('Сумма степеней: ',s);
end.

Листинг 3.29 содержит программу, которая определяет минимальное значение функции f(x)=x(x-1)2(x-1)3 на интервале [-0,3; 0,5] с точностью 10-7.

Листинг 3.29. Поиск минимального значения функции

const eps=1e-7; { точность поиска минимума } var a,b,x0,xmin,у,ymin,x,h: real;
begin
 write('Введите границы интервала: '); readln(a,b);
 write('Введите значение шага: '); readln(h);
 х0:=а; { начальное значение аргумента при первом поиске минимума }
 while h>=eps do
    begin
      ymin:=1e7; x:=x0;
        repeat
          y:=x*sqr(x-1)*sqr(x-2)*(x-2);
          if ymin>y then
            begin
              ymin: =y; xmin: =x ;
            end;
          x:=x+h;
        until (y>ymin)or(x>b);
        xO:=xmin-h; h:=h/2;
        end;
  writeln('xmin = ',xmin:8:5,'; ymin = ',ymin:8:5);
end.

 предыдущая         меню        вверх         следующая

Hosted by uCoz