Иногда необходимо поместить один цикл в другой. Такой цикл и называется вложенным. Внутри вложенного цикла в свою очередь может быть вложен еще один цикл, образуя следующий уровень вложенности и так далее. Количество уровней вложенности, как правило, не ограничивается.
Самый наглядный пример – вывод таблицы умножения.
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. |