Алгоритмы решения многих задач являются циклическими. Для достижения результата последовательность действий должна быть выполнена несколько раз. Например, программа контроля знаний выводит вопрос, принимает ответ, добавляет оценку за ответ к сумме баллов, затем повторяет это действие еще и еще раз, и так до тех пор, пока испытуемый не ответит на все вопросы.
Алгоритм, в котором есть последовательность операций, которая должна быть выполнена несколько раз, называется циклическим, а последовательность операций именуется циклом. В языке FPC для реализации циклов предусмотрены инструкции:
- for для циклов с заранее известным числом повторений,
- while…do и repeat…until для циклов с заранее неизвестным числом повторений.
Инструкция цикла for…to…do
Инструкция предназначена для организации циклов с заранее известным числом повторений. В нем каждый проход цикла нумеруется индексной переменной i. В этой инструкции используется инкрементный вариант изменения индекса цикла, когда индексная переменная i при новом проходе цикла увеличивается c шагом 1. Формат инструкции
#4. Циклы For, While, repeat на PascalABC.net
Требования и особенности:
- Переменная цикла i должна быть порядкового типа.
- Значение должно быть не меньше значения .
- Переменная цикла i должна быть объявлена в том же блоке, где находится инструкция цикла.
- Если в теле цикла требуется выполнить несколько инструкций, то их следует превратить в составную инструкцию, используя блок begin…end.
- Нельзя в теле цикла менять значение переменной цикла. Компилятор расценивает такое действие, как ошибку. Будьте внимательны.
- При естественном завершении цикла переменная цикла i объявляется не определенной.
- При принудительном завершении цикла с помощью инструкции перехода goto переменная цикла i сохраняет значение, имевшееся на момент перехода.

Пример. Расчет числа e=2.87… по формуле разложения в бесконечный ряд с использованием инкрементного цикла. При расчете используем N членов ряда exp(x)=1 + x + x 2 /2! + … + x n /n! + ….
uses SysUtils, RusTrans; // Ссылка на модули
var
x,Prod,Sum:real; // Аргумент, числитель, результат
N,Fact,i:integer; // Число членов ряда, факториал, индекс
begin
writeln(Rus(‘Введите x и N’)); // Приглашение
readln(x,N); // Ввод данных
Sum:=1; // Инициализация
Prod:=1;
Fact:=1;
for i:=1 to N-1 do // Повторять в цикле
begin
Fact:=Fact*i; // Очередной факториал
Prod:=Prod*x;
Sum:=Sum+Prod/Fact;
end;
writeln(‘Sum=’,Sum); // Вывод результата
readln; // Пауза, чтобы увидеть результат
end.
Инструкция цикла for…downto…do
Инструкция предназначена для организации циклов с заранее известным числом повторений. В ней каждый проход цикла нумеруется индексной переменной. В этой инструкции используется декрементный вариант изменения индекса цикла, когда индексная переменная при новом проходе цикла уменьшается c шагом 1. Формат инструкции
Паскаль с нуля [ч6]. Циклы. While, repeat-until, for.

Требования к инструкции такие же, как для инкрементного цикла. Только значение должно быть не больше значения . Пример. Программа моделирует обратный отсчет времени перед пуском ракеты.
uses SysUtils, RusTrans; // Ссылка на модули
var Seconds:Integer;
begin
writeln(Rus(’Обратный отсчет времени’)); // Вывод заголовка
for Seconds:=10 downto 1 do
writeln(Rus(’Осталось ’), Seconds:3,Rus(’ секунд’));
writeln(Rus(’Пуск’));
readln; // Пауза, чтобы увидеть результат
end.
Инструкция цикла while…do
Инструкция цикла while…do используется в том случае, когда некоторую последовательность действий надо выполнить несколько раз, причем необходимое число повторений во время разработки программы неизвестно и может быть определено только во время работы программы. Типичными примерами использования цикла while..do являются вычисления с заданной точностью, поиск в массиве или в файле. Это инструкция с предусловием, проверка надобности исполнения тела цикла осуществляется перед ним. Возможен случай, когда тело цикла не будет исполнено ни разу. Формат инструкции:
После do разрешена только одна инструкция. Поэтому, если в теле цикла определено несколько действий, то надо объединить их в один составной блок с помощью скобок begin…end. Алгоритм инструкции
- Сначала проверяется истинность .
- Пока = true (истинно), цикл выполняется.
- При = false (ложно) цикл завершается и выполняется следующая инструкция.
Чтобы тело цикла while…do было выполнено хотя бы один раз, необходимо, чтобы перед выполнением инструкции while…do = true.
Пример . Программа определяет число К натуральных чисел, сумма которых не превышает S.
uses SysUtils, RusTrans; // Ссылка на модули
var
S, K, Sum : Integer;
begin
writeln(Rus‘Введите S’)); // Приглашение
readln(S); // Ввод S
K:=0; // Начальное значение К.
Sum:=0; // Начальное значение суммы.
while (Sum <=S) do // Начать цикл
begin
K:=K+1; // Получить очередное число
Sum:=Sum+K; // Сумма чисел
end; // Конец цикла
if S>=0 // Проверка суммы и вывод
then writeln(Rus(’Сумма ’),K-1,Rus(’ чисел не превышает ’),S)
else writeln(Rus(’Сумма не может быть отрицательной’));
readln; // Пауза, чтобы увидеть результат
end.

Инструкция цикла repeat…until
Инструкция repeat…until, как и инструкция while…do, используется в программе в том случае, если необходимо выполнить повторные вычисления (организовать цикл), но число повторений во время разработки программы неизвестно и может быть определено только во время работы программы, т. е. определяется ходом вычислений. Это инструкция с постусловием, в ней один раз тело цикла исполняется без проверок, а затем осуществляется проверка надобности повторного исполнения тела цикла. Формат инструкции
Repeat и until образуют блочные скобки. Поэтому тело цикла может содержать несколько инструкций. Алгоритм инструкции
- Сначала выполняются находящиеся между repeat и until инструкции тела цикла.
- Затем вычисляется . Если = False (ложно ), то инструкции тела цикла выполняются еще раз.
- Если = True (истинно), то выполнение цикла прекращается и выполняется следующая инструкция.

Результат должен быть логического типа. Есть опасность зацикливания, если результат выражения не зависит от инструкций тела цикла. Чтобы гарантировать выход из цикла целесообразно проверять число проходов.
Пример . Программа определяет число К натуральных чисел, сумма которых не превышает S.
uses SysUtils, RusTrans; // Ссылка на модули
var
S, K, Sum : Integer;
begin
writeln(Rus(‘Введите S’)); // Приглашение
readln(S); // Ввод S
K:=0; // Начальное значение К.
repeat // Начать цикл
K:=K+1; // Получить очередное число
Sum:=K*(K+1)/2; // Сумма чисел
until Sum>S; // Конец цикла
if S>=0 // Проверка суммы и вывод
then writeln(Rus(’Сумма ’),K-1,Rus(’ чисел не превышает ’),S)
else writeln(Rus(’Сумма не может быть отрицательной’));
readln; // Пауза, чтобы увидеть результат
end.
Процедуры Break и Continue
Процедура Break позволяет завершить цикл, не дожидаясь его окончания. При выполнении процедур индексная переменная сохраняет последнее значение. Процедура Continue позволяет начать новую итерацию цикла, даже если текущая итерация не завершена. Индексная переменная примет начальное значение новой итерации. Пример.
Программа определяет в массиве первое отрицательное число и выводит его на дисплей. Если число положительное, то следующая итерация. Если число найдено, то конец цикла.
uses SysUtils, RusTrans; // Ссылка на модули
Mas:array[1..N] of integer; // Массив чисел
i:byte; // Параметр цикла
Yes:boolean; // Признак обнаружения
writeln(Rus(‘Введите массив’)); // Приглашение
for i:=1 to N do // Ввод массива чисел
Yes:=false; // Число еще не найдено
if Mas[i]>=0 then Continue; // Не отрицательное, дальше
writeln(Rus(’1-е отрицательное число =’),
Mas[i],Rus(‘ Его номер =’),i);
Yes:=true; // Признак обнаружения
Break; // Завершить цикл
if not Yes // Проверка признака
then writeln(Rus(’Отрицательных чисел нет’)); readln; // Пауза, чтобы увидеть результат
Источник: pascal-cod.ru
Циклические последовательности — Turbo Pascal
При решении подавляющего большинства задач (в том числе и весьма несложных) в программе практически невозможно задать в явном виде все операции, которые необходимо выполнить. В самом деле, пусть необходимо вычислить сумму первых n членов гармонического ряда:
Y= 1+ 1/2+ 1/3 + …+ 1/ n
Очевидно, что с использованием только рассмотренных выше типов операторов можно составить программу лишь для фиксированного значения n. Например, при n=5 требуемые вычисления можно задать с помощью оператора присваивания вида:
Y:= 1+1/2+1/3+1/4+1/5
Если же значение n не фиксируется, а является исходным данным, вводимым в процессе выполнения программы (и даже константой, описанной в программе), то аналогичный оператор присваивания записать невозможно. Ибо запись вида Y:= 1+1/2+1/3+…+1/ n в языках программирования недопустима.
Для устранения возникающих трудностей служат операторы цикла. Они позволяют повторять выполнение отдельных частей программы. Можно выделить четыре ператора цикла, присутствующих в том или ином виде во всех языках программирования: простой арифметический оператор цикла (цикл с параметром с шагом 1), сложный арифметический оператор цикла (цикл с параметром произвольного шага), итерационный оператор цикла с предусловием, итерационный оператор цикла с постусловием.
Простой арифметический оператор цикла Паскаля (цикл с параметром)
Вернемся к рассмотренной выше задаче вычисления суммы первых n членов гармонического ряда, правила которой невозможно задать в виде арифметического выражения, если значение n заранее не фиксировано.
На самом деле вычисление этой суммы можно осуществить по очень простому и компактному алгоритму: предварительно положим y=0 (с помощью оператора присваивания y:=0), а затем выполним оператор присваивания y:= y+1/ i для последовательных значений i= 1,2,…, n. При каждом очередном выполнении этого оператора к текущему значению y будет прибавляться очередное слагаемое. Как видно, в этом случае процесс вычислений будет носить циклический характер: оператор y:= y+1/i должен выполняться многократно, т.е. циклически, при различных значениях i.
Этот пример циклического вычислительного процесса является весьма типичным; его характерные особенности состоят в том, что
- число повторений цикла известно к началу его выполнения (в данном случае оно равно значению n, которое предполагается заданным к этому времени);
- управление циклом осуществляется с помощью переменной порядкового типа, которая в этом циклическом процессе принимает последовательные значения от заданного начального до заданного конечного значений (в нашем случае – это целочисленная переменная i, принимающая последовательные значения от 1 до n).
Для компактного задания подобного рода вычислительных процессов и служит оператор цикла с параметром. Чаще всего используется следующий вид этого оператора В Паскале:
For V:= E1 to E2 do S,
где for (для), to (увеличиваясь к) и do (выполнять, делать) – служебные слова, V – переменная порядкового типа, называемая параметром цикла, Е1 и Е2 – выражения того же типа, что и параметр цикла, S – оператор, который и выполняется многократно в цикле, называемый телом цикла.
Заметим, что в Паскале после do должен стоять один оператор, если необходимо выполнить несколько действий, то они должны быть объединены в один составной оператор путем заключения в операторные скобки.
Этот оператор цикла Паскаля предусматривает присваивание параметру цикла V последовательных значений от начального значения, равного значению выражения Е1, до конечного значения, равного значению выражения Е2, т.е. при каждом повторении выполняется оператор присваивания V:= succ( V), и выполнение оператора S при каждом значении параметра цикла V. При этом значения выражений Е1 и Е2 вычисляются один раз, при входе в оператор цикла, а значение параметра цикла V не должно изменяться в результате выполнения оператора S. Если заданное конечное значение меньше начального значения (что допустимо), то оператор S не выполняется ни разу.
В Паскале считается, что при нормальном завершении выполнения оператора цикла значение параметра цикла не определено.
С использованием оператора цикла с параметром алгоритм вычисления суммы первых n членов гармонического ряда может быть задан следующим образом:
Пример кода программы для суммирования первых n членов гармонического ряда
Readln(n); Y:= 0; For i:= 1 to n do y:= y+1/i;
В некоторых случаях бывает удобно, чтобы параметр цикла Паскаля принимал последовательные, но не возрастающие, а убывающие значения. Для таких случаев в Паскале предусмотрен оператор цикла с параметром следующего вида:
For V:= E1 downto E2 do S,
где downto (уменьшаясь к) – служебное слово, а все остальные слова и выражения имеют прежний смысл. Изменение параметра цикла от большего значения к меньшему происходит при выполнении присваивания V:=pred( V). Заметим, что начальное значение может быть меньше конечного значения.
В этом случае оператор S не выполнится ни разу. Значение параметра цикла по завершении выполнения такого цикла так же считается неопределенным.
Следует запомнить и то, что для обоих вариантов записи цикла с параметром справедливо: если начальное и конечное значения равны, то тело цикла (оператор S) выполнится один раз.
Заметим так же, что параметр цикла может и не использоваться в теле цикла, так что основное его назначение – это управление числом повторений цикла. Например, значение y= x n, где n>=0 – целое, можно вычислить по следующему алгоритму: предварительно положить y=1, а затем n раз домножить это значение на x:
Пример кода программы цикла Паскаля
Readln(n); Readln(x); Y:= 1; For i:= 1 to n do y:= y*x;
Как видно, здесь параметр цикла i служит лишь для того, чтобы тело цикла (оператор y:= y* x) выполнилось нужное число раз.
Арифметический оператор цикла Паскаля с произвольным шагом
Естественным усложнением простого арифметического цикла Паскаля, является цикл, в котором параметр цикла изменяется не на 1, а на произвольную величину – шаг приращения. При этом в процессе выполнения цикла шаг изменяется по заданному закону. Стандартные операторы для реализации такого цикла есть в Форте, в других языках их приходится организовывать из простейшего арифметического цикла.
Итерационные операторы цикла Паскаля
Итерационные циклы отличаются от циклов с параметром тем, что в них заранее неизвестно число повторений.
Пусть мы отправляемся за грибами и возвращаемся домой, когда корзина наполнится. Все грибники делятся на 2 категории:
- Смотрят, есть ли место в корзине, а уже потом срывают грибы, если их можно поместить в корзину. (Правда, в жизни таких грибников встречать не приходилось)
- Сначала срывают грибы, а уже потом думают, как их положить в корзину.
Отсюда получаются два варианта реализации итерационных циклов: с предусловием и с постусловием.
В цикле с предусловием сначала проверяется условие, а потом делается шаг. Грибник придет с полной или почти полной корзиной. В цикле с постусловием – сначала шаг, а потом проверка. Как всякий нормальный грибник, этот принесет полную или слегка переполненную корзину.
Какой алгоритм выбрать? Это зависит от конкретной задачи.
Если, сделав шаг без проверки, можно свалиться в яму, то лучше проверка вначале (как слепой с палочкой). Ну, а если шаг без проверки вас не пугает, то можно отложить ее до завершения шага.
Нужно также проанализировать событие, которого мы ожидаем. Если оно может случиться до первого шага, то нужен цикл с предусловием. А если событие не может случиться до первого шага, то нужен цикл с постусловием.
Оператор цикла Паскаля с постусловием
Очевидно, что число повторений этого цикла заранее не известно. В подобного рода случаях мы можем лишь сформулировать условие, при выполнении которого процесс добавления к сумме очередного слагаемого должен завершиться.
Для задания таких вычислительных процессов и служит оператор цикла Паскаля с постусловием. Этот оператор имеет вид:
Repeat S1; S2;…; Si until B,
где repeat (повторять) и until (до) – служебные слова, через Si обозначен любой оператор Паскаля, а через В – логическое выражение.
При выполнении этого оператора цикла последовательность операторов, находящихся между словами repeat и until, выполнится один или более раз. Этот процесс завершается, когда после очередного выполнения заданной последовательности операторов логическое выражение В примет (впервые) значение true. Таким образом, с помощью логического выражения В задается условие завершения выполнения оператора цикла. Поскольку в данном случае проверка условия производится после выполнения последовательности операторов (тела цикла), этот оператор цикла и называется оператором цикла с постусловием.
С использованием этого вида оператора цикла Паскаля задача о суммировании первых членов гармонического ряда, удовлетворяющих заданному условию, может быть реализована следующим образом:
Пример кода оператора цикла Паскаля с постусловием
readln(e); i:=0; y:=0; Repeat i:=i+1; y:=y+1/i; Until 1/i<e;
Заметим, что оператор цикла с постусловием является более общим, чем оператор цикла с параметром — любой циклический процесс, задаваемый с помощью цикла с параметром можно представить в виде цикла с постусловием. Обратное утверждение неверно. Например, задача о суммировании первых n членов гармонического ряда, рассмотренная ранее, с оператором цикла с постусловием будет выглядеть так:
Пример кода оператора цикла Паскаля с постусловием
Readln(n); i:=0; y:=0; Repeat i:=i+1; y:=y+1/i; Until i>n;
Оператор цикла Паскаля с предусловием
В случае оператора цикла Паскаля с постусловием входящая в него последовательность операторов заведомо будет выполняться хотя бы один раз. Между тем довольно часто встречаются такие циклические процессы, когда число повторений цикла тоже неизвестно заранее, но при некоторых значениях исходных данных предусмотренные в цикле действия вообще не должны выполняться, и даже однократное выполнение этих действий может привести к неверным или неопределенным результатам.
Пусть, например, дано вещественное число М. Требуется найти наименьшее целое неотрицательное число k, при котором 3 k> M. Эту задачу можно решить по следующему алгоритму: предварительно положить y=1 и k=0; затем в цикле домножать значение y на 3 и увеличивать значение k на 1 до тех пор, пока текущее значение y впервые окажется больше значения М. На первый взгляд, здесь можно воспользоваться оператором цикла с постусловием:
Пример кода оператора цикла Паскаля с постусловием
y:=1; k:=0; Repeat y:=y*3; k:=k+1; Until y> M;
Для задания подобного рода вычислительных процессов, когда число повторений цикла заранее неизвестно и действия, предусмотренные в цикле, могут вообще не выполняться, и служит оператор цикла с предусловием. Этот оператор цикла имеет в Паскале следующий вид:
While B do S,
где while (пока), do (делать, выполнять) – служебные слова, В – логическое выражение, S – оператор. Здесь оператор S выполняется ноль или более раз, но перед каждым очередным его выполнением вычисляется значение выражения В, и оператор S выполняется только в том случае, когда значение выражения В true. Выполнение оператора цикла завершается, когда выражение В впервые принимает значение false. Если это значение выражение В принимает при первом же его вычислении, то оператор S не выполнится ни разу.
В рассматриваемой нами задаче правильное значение k при любом значении М может быть получено следующим образом:
Пример кода оператора цикла Паскаля с предусловием
y:=1; k:=0; While y=M do Begin y:=y*3; k:=k+1; End;
Оператор цикла Паскаля с предусловием можно считать наиболее универсальным – с использованием таких операторов можно задать и циклические процессы, определяемые операторами цикла с параметром и постусловием.
Источник: tpdn.ru
Цикл. Программирование циклов на Паскале
Цикл — это повторение некоторой группы действий по условию.
Различают два типа циклов: циклы с заданным числом повторений и итеративные циклы.
Цикл с заданным числом повторений (с параметром).
Для программирования циклов с заданным числом повторений при постоянном шаге изменения параметра цикла в Паскале существует цикл с параметром.
1) for i:= to do
2) for i:= downto do
Здесь, переменная i является счетчиком, поэтому должна быть целочисленной.
Выполнение оператора for в 1-м случае происходит по следующей схеме:
1) Вычисляются значения и . Это делается один раз, при входе в цикл.
2) Параметру i присваивается значение выражения 1.
3) Значение параметра цикла сравнивается со значением выражения 2. Если параметр цикла меньше или равен этому значению, то выполняется тело цикла. Иначе, выполнение цикла заканчивается.
4) Значение параметра цикла изменяется на следующее значение в его типе (для целых чисел — увеличивается на 1). Происходит возврат к п.3.
Во втором варианте, слово downto обозначает «движение вниз». В этом случае параметр цикла изменяется по убывающей. При каждом повторении цикла, параметр изменяет свое значение на предыдущее.
Правила:
1) параметр цикла не может иметь вещественный тип;
2) в теле цикла нельзя менять переменную — параметр цикла;
3) при выходе из цикла значение параметра является неопределенным.
В качестве параметра цикла здесь могут использоваться также символьные переменные.
Например, чтобы получить на экране десятичные коды букв латинского алфавита можно написать следующую программу:
for c:=’a’ to ‘z’ do begin
write(c,’ — ‘, ord(c)); end;
Переменная с в этом случае имеет тип char.
Вопрос: как вывести кодировку букв латинского алфавита в обратном порядке?

Итерационные циклы.
Итерационными циклами называются циклы, число повторений которых заранее не известно. Оно определяется в результате выполнения цикла.
В итерационном цикле при каждом его повторении происходит последовательное приближение к вычисляемой величине и проверка условия достижения искомого результата.
Выход из цикла происходит в случае выполнения заданного условия.
Существуют цикл с пред-условием и цикл с пост-условием.
Цикл — пока:
while (логическое выражение) do ;
— тело цикла. Цикл повторяет повторение, пока истинно логическое выражение.

Цикл — до:
Repeat until (логическое выражение);
Повторяется (логическое выражение) до тех пор, пока условие не станет истинным.


Задача.
Составить программу для вычисления суммы заданного количества слагаемых n.

Два варианта решения задачи. В первом случае — цикл с предусловием, во втором — с постусловием.

И тот и другой цикл повторится N раз. Переменная i является не только знаменателем дроби но и счетчиком числа повторений цикла. Такие переменные называют параметрами цикла.

21. Программирование циклов с условиями.
Виды циклов
Безусловные циклы
Иногда в программах используются циклы, выход из которых не предусмотрен логикой программы. Такие циклы называются безусловными, или бесконечными. Специальных синтаксических средств для создания бесконечных циклов, ввиду их нетипичности, языки программирования не предусматривают, поэтому такие циклы создаются с помощью конструкций, предназначенных для создания обычных (или условных) циклов. Для обеспечения бесконечного повторения проверка условия в таком цикле либо отсутствует (если позволяет синтаксис, как, например, в цикле LOOP…END LOOP языка Ада), либо заменяется константным значением (while true do … в Паскале). В языке С используется цикл for(;;) с незаполненными секциями.
Цикл с предусловием
Цикл с предусловием — цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно). В большинстве процедурных языков программирования реализуется оператором while, отсюда его второе название — while-цикл. На языке Pascal цикл с предусловием имеет следующий вид:
while dobegin end;
Цикл с постусловием
Цикл с постусловием — цикл, в котором условие проверяется после выполнения тела цикла. Отсюда следует, что тело всегда выполняется хотя бы один раз. В языке Паскаль этот цикл реализует оператор repeat..until; в Си — do…while.
На языке Pascal цикл с постусловием имеет следующий вид::
repeat until
В трактовке условия цикла с постусловием в разных языках есть различия. В Паскале и языках, произошедших от него, условие такого цикла трактуется как условие выхода (цикл завершается, когда условие истинно, в русской терминологии такие циклы называют ещё «цикл до»), а в Си и его потомках — как условие продолжения (цикл завершается, когда условие ложно, такие циклы иногда называют «цикл пока»).
Цикл с выходом из середины
Цикл с выходом из середины — наиболее общая форма условного цикла. Синтаксически такой цикл оформляется с помощью трёх конструкций: начала цикла, конца цикла и команды выхода из цикла. Конструкция начала маркирует точку программы, в которой начинается тело цикла, конструкция конца — точку, где тело заканчивается. Внутри тела должна присутствовать команда выхода из цикла, при выполнении которой цикл заканчивается и управление передаётся на оператор, следующий за конструкцией конца цикла. Естественно, чтобы цикл выполнился более одного раза, команда выхода должна вызываться не безусловно, а только при выполнении условия выхода из цикла.
Принципиальным отличием такого вида цикла от рассмотренных выше является то, что часть тела цикла, расположенная после начала цикла и до команды выхода, выполняется всегда (даже если условие выхода из цикла истинно при первой итерации), а часть тела цикла, находящаяся после команды выхода, не выполняется при последней итерации.
Легко видеть, что с помощью цикла с выходом из середины можно легко смоделировать и цикл с предусловием (разместив команду выхода в начале тела цикла), и цикл с постусловием (разместив команду выхода в конце тела цикла).
Часть языков программирования содержат специальные конструкции для организации цикла с выходом из середины. Так, в языке Ада для этого используется конструкция LOOP…END LOOP и команда выхода EXIT или EXIT WHEN:
LOOP. Часть тела цикла EXIT WHEN ;. Часть тела цикла IF THEN EXIT; END;. Часть тела циклаEND LOOP:
Здесь внутри цикла может быть любое количество команд выхода обоих типов. Сами команды выхода принципиально не различаются, обычно EXIT WHEN применяют, когда проверяется только условие выхода, а просто EXIT — когда выход из цикла производится в одном из вариантов сложного условного оператора.
В тех языках, где подобных конструкций не предусмотрено, цикл с выходом из середины может быть смоделирован с помощью любого условного цикла и оператора досрочного выхода из цикла (такого, как break в Си, exit в Турбо Паскале т. п.), либо оператора безусловного перехода goto.
Цикл со счётчиком
Цикл со счётчиком — цикл, в котором некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз. В большинстве процедурных языков программирования реализуется оператором for, в котором указывается счётчик (так называемая «переменная цикла»), требуемое количество проходов (или граничное значение счётчика) и, возможно, шаг, с которым изменяется счётчик. Например, в языке Оберон-2 такой цикл имеет вид:
FOR v:= b TO e BY s DO. тело цикла END
(здесь v — счётчик, b — начальное значение счётчика, e — граничное значение счётчика, s — шаг).
Неоднозначен вопрос о значении переменной по завершении цикла, в котором эта переменная использовалась как счётчик. Например, если в программе на языке Паскаль встретится конструкция вида:
i:= 100; for i:= 0 to 9 dobegin. тело цикла end;k:= i;
возникает вопрос: какое значение будет в итоге присвоено переменной k: 9, 10, 100, может быть, какое-то другое? А если цикл завершится досрочно? Ответы зависят от того, увеличивается ли значение счётчика после последней итерации и не изменяет ли транслятор это значение дополнительно. Ещё один вопрос: что будет, если внутри цикла счётчику будет явно присвоено новое значение?
Различные языки программирования решают данные вопросы по-разному. В некоторых поведение счётчика чётко регламентировано. В других, например, в том же Паскале, стандарт языка не определяет ни конечного значения счётчика, ни последствий его явного изменения в цикле, но не рекомендует изменять счётчик явно и использовать его по завершении цикла без повторной инициализации. Программа на Паскале, игнорирующая эту рекомендацию, может давать разные результаты при выполнении на разных системах и использовании разных трансляторов.
Радикально решён вопрос в языке Ада: счётчик считается описанным в заголовке цикла, и вне его просто не существует. Даже если имя счётчика в программе уже используется, внутри цикла в качестве счётчика используется отдельная переменная. Счётчику запрещено явно присваивать какие бы то ни было значения, он может меняться только внутренним механизмом оператора цикла. В результате конструкция
i:= 100;for i in (0..9) loop. тело циклаend loop;k:= i;
внешне аналогичная вышеприведённому циклу на Паскале, трактуется однозначно: переменной k будет присвоено значение 100, поскольку переменная i, используемая вне данного цикла, не имеет никакого отношения к счётчику i, который создаётся и изменяется внутри цикла. Подобное обособление счётчика удобно и безопасно: не требуется отдельное описание для него и минимальна вероятность случайных ошибок, связанных со случайным разрушением внешних по отношению к циклу переменных. Если программисту требуется включить в готовый код цикл со счётчиком, то он может не проверять, существует ли переменная с именем, которое он выбрал в качестве счётчика, не добавлять описание нового счётчика в заголовок соответствующей процедуры, не пытаться использовать один из имеющихся, но в данный момент «свободных» счётчиков. Он просто пишет цикл с переменной-счётчиком, имя которой ему удобно, и может быть уверен, что никакой коллизии имён не произойдёт.
Цикл со счётчиком всегда можно записать как условный цикл, перед началом которого счётчику присваивается начальное значение, а условием выхода является достижение счётчиком конечного значения; к телу цикла при этом добавляется оператор изменения счётчика на заданный шаг. Однако специальные операторы цикла со счётчиком могут эффективнее транслироваться, так как формализованный вид такого цикла позволяет использовать специальные процессорные команды организации циклов.
В некоторых языках, например, Си и других, произошедших от него, цикл for, несмотря на синтаксическую форму цикла со счётчиком, в действительности является циклом с предусловием. То есть в Си конструкция цикла:
фактически представляет собой другую форму записи конструкции [1] :
То есть в конструкции for сначала пишется произвольное предложение инициализации цикла, затем — условие продолжения и, наконец, выполняемая после каждого тела цикла некоторая операция (это не обязательно должно быть изменение счётчика; это может быть правка указателя или какая-нибудь совершенно посторонняя операция). Для языков такого вида вышеописанная проблема решается очень просто: переменная-счётчик ведёт себя совершенно предсказуемо и по завершении цикла сохраняет своё последнее значение.
Совместный цикл
Ещё одним вариантом цикла является цикл, задающий выполнение некоторой операции для объектов из заданного множества, без явного указания порядка перечисления этих объектов. Такие циклы называются совместными (а также циклами по коллекции, циклами просмотра) и представляют собой формальную запись инструкции вида: «Выполнить операцию X для всех элементов, входящих во множество M». Совместный цикл, теоретически, никак не определяет, в каком порядке операция будет применяться к элементам множества, хотя конкретные языки программирования, разумеется, могут задавать конкретный порядок перебора элементов. Произвольность даёт возможность оптимизации исполнения цикла за счёт организации доступа не в заданном программистом, а в наиболее выгодном порядке. При наличии возможности параллельного выполнения нескольких операций возможно даже распараллеливание выполнения совместного цикла, когда одна и та же операция одновременно выполняется на разных вычислительных модулях для разных объектов, при том что логически программа остаётся последовательной.
Совместные циклы имеются в некоторых языках программирования (C#, Eiffel, Java, JavaScript, Perl, Python, PHP, LISP, Tcl и др.) — они позволяют выполнять цикл по всем элементам заданной коллекции объектов. В определении такого цикла требуется указать только коллекцию объектов и переменную, которой в теле цикла будет присвоено значение обрабатываемого в данный момент объекта (или ссылка на него). В различных языках программирования синтаксис оператора различен:
for (type //использование item>
foreach (type item in set) < //использование item >
for item in [1..100] dobegin //Использование item (Работоспособность кода проверялась в Delphi 2010) end;
For Each item As type In set ‘использование item Next item
foreach ($item in $set)
for item in iterator_instance: # использование item
22. Программирование задач с множественным выбором.
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Это важно знать:
Организация приема граждан в органах социального обеспечения Отделы социальной защиты населения осуществляют прием граждан по вопросам: 1.
Действия машиниста при срабатывании устройств УКСПС под поездом Если перед станцией (искусственным сооружением), где установлено устройство контроля схода подвижного состава (далее УКСПС) при.
Философия Древнего Востока Древнеиндийская философия 1.Какие идеи, сюжеты, присутствующие в древнеинhttps://studopedia.ru/19_416913_tsikl-programmirovanie-tsiklov-na-paskale.html» target=»_blank»]studopedia.ru[/mask_link]