3.3.7. Вложенные циклы и примеры неверного использования циклов

 

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

 

Самый наглядный пример – вывод таблицы умножения.

program table;

const n = 9;            {размер таблицы}

var i, j :integer;

begin

   for i:=1 to n do    {номера строк}

   begin

     for j:=1 to n do  {номера столбцов}

       write(i*j:4);

     writeln;              {переход на новую строку}

   end;

end.

 

Разберем, как работает эта программа. Для каждого значение переменной (i) первого счетного цикла будет целиком выполняться весь вложенный цикл по переменной j от 1 до n. После выполнения всего вложенного цикла управление опять вернется к первому циклу и значение переменной i в нем будет увеличено на 1. Операторы вложенного цикла помещены в составной оператор begin …end, так как после использования каждого значения i (т.е. номера строки) требуется переход на новую строчку.

 

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

Тип ошибки

Неверное написание

Неверный тип переменной цикла с параметром

Var x: real;

Begin

   For x:=1 to 10 do {x должна быть целой, а не вещественной}

   Write (x*x);

End.

Изменение переменной цикла в теле цикла

Var i: integer;

Begin

   For i:=1 to 10 do

  begin

   Write (i);

   i:=i+1; {Нельзя менять i в цикле}

  End;

End.

Использование одинаковых переменных цикла во вложенных циклах

Var i,j: integer;

Begin

   For i:=1 to 10 do

   For i:=1 to 10 do {та же переменная i во вложенном цикле}

   Write (i);

End.

Неинициализированная переменная до цикла

Var i: integer; p: real;

Begin {не инициализировали p:=1}

   For i:=1 to 10 do

   p:=p*i;

   write (p);{p равно 0}

  End;

End.

Бесконечный цикл

x:=1;

while x>0 do {условие всегда истинно}

   x:=x+1;

Переполнение переменных

Var n: integer; x: real;

begin

n := 32767; // максимальное целое

writeln(n);

n := n + 1; // следующее за максимальным целым

writeln(n); // возникнет ошибка переполнения

writeln;

x := 1.7e308; // максимальное вещественное

writeln(x);

x := x * 1.1; // больше, чем максимальное вещественное

writeln(x); // возникает ошибка переполнения

end.