var x, y, z:integer; begin for x := 1 to z do begin writeln(y); end; end.
var x, y, z:integer; begin x := 1; while x < 10 do begin writeln(y); inc(x); end; end.
var x, y, z:integer; begin x := 1; repeat writeln(y); inc(x); until x > 10; end.
Обратите внимание - при использовании цикла repeat
операторные скобки begin
.. end
не нужны!
До сих пор, мы рассматривали только последовательно выполняющиеся действия (операторы). Этого не всегда достаточно. В Паскале существует 3 структурных оператора, которые называются операторами цикла или просто – циклами. Операторы цикла позволяют организовать повторение одного или целой группы операторов.
Часть оператора, которая определяет условие окончания исполнения цикла, называется заголовком цикла. Повторяемые операторы образуют тело цикла, а однократное исполнение тела цикла называется итерацией. С помощью заголовка, оператор цикла управляет тем, как будут выполняться операторы тела цикла при каждом вызове программы, в зависимости от конкретных входных данных и пути, которым пошло выполнение алгоритма. Кстати, путь, которым пошло выполнение алгоритма в каждом конкретном случае, на самом деле тоже определяется входными данными. Просто это не всегда очевидно. Различные требования к описанию того, как именно организуется повторение операторов тела, определяют разнообразие операторов цикла.
Операторы повторяются либо заранее указанное количество раз (цикл for
), либо до тех пор, пока верно (или неверно) некоторое условие (циклы while
и repeat
соответственно). Явное указание количества итераций является частным, но важным случаем выходного условия. Примерами циклов в могут быть команды «сделать десять шагов вперёд», «тереть, пока не протрёшь дырку» и т.д.
Также существуют команды, которые позволяют управлять оператором цикла из тела цикла. Хотя с точки зрения теории программирования считается, что цикл должен завершаться в соответствии с заголовком, на практике целесообразно допускать в отдельных случаях досрочный выход из цикла согласно условиям, указанным в теле цикла.
Обычно при выполнении тела цикла производится многократный пересчёт одной или нескольких переменных, пока не будет достигнут нужный результат или не станет ясно, что он недостижим. Как правило, именно изменение состояния каких-то целевых переменных является целью выполнения цикла. С другой стороны, часто смыслом цикла является исполнение некоторых желательных для пользователя чисто внешних по отношению к программе действий, либо ожидание некоторого события. Но в любом случае, для того чтобы цикл мог завершиться, абсолютно необходимо, чтобы в системе что-то изменилось.
Случай, когда программа не в состоянии завершить один из своих циклов, называется зацикливанием. Оно очень похоже на зависание программы, но обычно под зависанием понимается переход отдельной программы или всей системы в неработоспособное состояние, в то время как зацикливание – это просто такой способ «нормальной» работы отдельной программы, который не приводит ни к какому результату. Для правильно работающей системы это не должно представлять никакой опасности, хотя данный запуск программы придется прервать принудительно. Зацикливание является проявлением неправильности алгоритма данной программы, в то время как зависание может быть вызвано аппаратными сбоями.
Большой цикл, который запрашивает очередное действие пользователя, ожидает ответной команды, реагирует на нее и вновь переходит в состояние ожидания, лежит в основе всех интерактивных программ, т.е. программ, которые постоянно взаимодействуют с пользователем, в отличие от неинтерактивных или пакетных программ, которые раз получив начальные данные, работают дальше автоматически. Подобно интерактивным программам ведёт себя большинство программ, взаимодействующих с тем или иным оборудованием, включая драйвера, которые берут на себя обеспечение взаимодействия отдельных аппаратных компонент со всей остальной системой. Как правило, если предполагается, что программа обрабатывает данные или выполняет команды, что в данном случае фактически одно и тоже, поступающие от какого-то внешнего источника, то для того, чтобы отсеять или переспросить опасные, непонятные или заведомо неверные данные и команды, их обработка тоже должна вестись с помощью цикла, иначе ничего не помешает «недобросовестному» источнику повторить «некачественный» ввод.
Этот оператор цикла, называемый также циклом While, имеет вид
While <Условие выполнения> Do <Тело цикла>
Действие данного цикла проявляется следующим образом. В начале каждой итерации проверяется логическое условие, которое может быть либо логическим выражением, результатом которого может быть ответ «да» или «нет», либо переменной типа Boolean. Например:
Используя цикл While, следует помнить, что в теле цикла должны либо быть команды, которые изменяют результат проверки условия выполнения, либо явный выход из цикла. Поэтому, тело оператора While обычно содержит несколько исполняемых операторов и нуждается в операторных скобках Begin-End.
Следует обратить внимание на инициализацию переменных, т.е. на присвоение им начальных значений. Следующий код – неверен:
writeln('Печатаем числа от 1 до 10'); While (i >= 0) Do { Потеряны Begin и End? } writeln(10 - i); { Судя по коду, значение i - неопределено } i:=i-1; { Эта команда может никогда не выполнится }
Этот код следует переписать так:
writeln('Печатаем числа от 1 до 10'); i:=9; { Инициализация } While (i >= 0) Do Begin writeln(10-i); i:=i-1; { Шаг цикла } End;
Многие компиляторы запрещают в заголовке цикла константные выражения, т.е. выражения, значения которых определены до начала работы программы. Turbo и Free Pascal допускают в качестве условия логические константы TRUE (Истина) и FALSE (Ложь) для реализации бесконечных циклов. Затем тело цикла выполняется только в том случае, если условие выполнено. Если условие выполения изначально ложно, то цикл не исполняется ни разу, но это не считается ошибкой, а нормальным выполнением программы!