мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Это старая версия документа!


Итерации

FIXME

Цикл for
var 
  x, y, z:integer;
begin
  for x := 1 to z do
  begin
    writeln(y);
  end;
end.
Цикл while
var 
  x, y, z:integer;
begin
  x := 1;
  while x < 10 do
  begin
    writeln(y);
    inc(x);
  end;
end.
Цикл repeat
var 
  x, y, z:integer;
begin
  x := 1;
  repeat
    writeln(y);
    inc(x);
  until x > 10;
end.

Обратите внимание - при использовании цикла repeat операторные скобки begin .. end не нужны!

Циклы

Операторы цикла позволяют повторять выполнение одного оператора или группы операторов либо заранее указанное количество раз, либо до тех пор, пока верно некоторое условие.

Часть оператора, которая определяет условие окончания исполнения цикла, называется заголовком цикла. Указание на желаемое количество повторений является частным случаем такого условия. Хотя с точки зрения теории программирования считается, что цикл должен завершаться в соответствии с условием, указанным в его заголовке, на практике целесообразно допускать в отдельных случаях выход из цикла согласно условиям, указанным в теле цикла. Для этого существуют специальные команды.

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

Обычно при выполнении тела цикла производится многократный пересчёт одной или нескольких переменных, пока не будет достигнут нужный результат или не станет ясно, что он недостижим. Как правило, именно изменение состояния каких-то целевых переменных является целью выполнения цикла. С другой стороны, часто смыслом цикла является исполнение некоторых желательных для пользователя чисто внешних по отношению к программе действий, либо ожидание некоторого события. Но в любом случае, абсолютно необходимо для того чтобы цикл мог завершиться, чтобы в системе что-то изменилось.

Случай, когда программа не в состоянии завершить один из своих циклов, называется зацикливанием. Оно очень похоже на зависание программы, но обычно под зависанием понимается переход отдельной программы или всей системы в неработоспособное состояние, в то время как зацикливание – это просто такой способ «нормальной» работы отдельной программы, который не приводит ни к какому результату. Для правильно работающей системы это не должно представлять никакой опасности, хотя данный запуск программы придется прервать. Зацикливание является проявлением неправильности алгоритма данной программы, в то время как зависание может быть вызвано аппаратными сбоями. Зависание как правило относится ко всей системе.

Большой цикл, который запрашивает очередное действие пользователя, ожидает ответной команды, реагирует на нее и вновь переходит в состояние ожидания, лежит в основе всех интерактивных программ, т.е. программ, которые постоянно взаимодействуют с пользователем, в отличие от неинтерактивных или пакетных программ, которые раз получив начальные данные, работают дальше автоматически. Подобно интерактивным программам ведёт себя большинство программ, взаимодействующих с тем или иным оборудованием, включая драйвера, которые берут на себя обеспечение взаимодействия отдельных аппаратных компонент со всей остальной системой. Как правило, если предполагается, что программа обрабатывает данные или выполняет команды, что в данном случае фактически одно и тоже, поступающие от какого-то внешнего источника, то для того, чтобы отсеять или переспросить опасные, непонятные или заведомо неверные данные и команды, их обработка тоже должна вестись с помощью цикла, иначе ничего не помешает «недобросовестному» источнику повторить «некачественный» ввод.

Цикл с предварительным условием (While-Do)

Этот оператор цикл, называемый циклом While, имеет вид

<code pascal| Цикл While-Do> While <Условие выполнения> Do

<Тело цикла>

</code pascal>

Действие данного цикла проявляется следующим образом. Сначала каждой итерации проверяется логическое условие, которое может быть переменной типа Boolean, либо логическим выражением, результатом которого может быть ответ «да» или «нет». Turbo и Free Pascal допускают в качестве условия логические константы TRUE (Истина) и FALSE (Ложь) для реализации бесконечных циклов. Затем тело цикла выполняется только в том случае, если условие выполнено. Если условие выполения изначально ложно, то цикл не исполняется ни разу, но это не считается ошибкой, а нормальным выполнением программы!

Используя цикл While, следует помнить, что в теле цикла должны либо быть команды, которые изменяют результат проверки условия выполнения, либо явный выход из цикла. Поэтому, тело оператора While обычно содержит несколько исполняемых операторов и нуждается в операторных скобках Begin-End.

Следует обратить внимание на инициализацию переменных, т.е. на присвоение им начальных значений. Следующий код – неверен:

writeln('Печатаем числа от 1 до 10'); While (i ⇐ 10) Do

	{ Потеряны Begin и End? }
writeln(i);			
{ Судя по коду, значение i - неопределено }
i:=i+1;				
	{ Эта команда никогда не выполнится }

Этот код следует переписать так:

writeln('Печатаем числа от 1 до 10'); i:=1;

{ Инициализация }

While (i ⇐ 10) Do Begin

writeln(i);			
i:=i+1;				
	{ Шаг цикла }

End;