Оператор цикла DO в PL/I

Последовательность операторов a1a2…an образует цикл, если a1 – оператор заголовка цикла, an – оператор конца END. Различают четыре типа оператора заголовка цикла.

Оператор первого типа имеет вид или

DO WHILE (e1) u;

или

DO UNTIL (e2) w;

где ei (i=1,2)– скалярное выражение, а u либо пусто, либо конструкция UNTIL (e2), w либо пусто, либо конструкция WHILE (e1). Перед очередным (в том числе и первом) выполнением цикла вычисляется значение выражения e1 (если оно присутствует в операторе), которое преобразуется при необходимости в строку битов. Если все биты в строке равны нулю, или строка пуста, то управление передаётся оператору, следующему за циклом. В противном случае выполняются операторы, входящие в цикл. После каждого выполнения цикла вычисляется значение выражения e2 (при его наличии в операторе), которое преобразуется при необходимости в строку битов. Если все биты строки равны нулю, или строка пуста, то осуществляется переход на начало цикла. Если хотя бы один бит в строке равен единице, то осуществляется переход к оператору, следующему за циклом.

Здесь ei1 – скалярное выражение; ci – конструкция одного из следующих видов:

tibi , biti , ri , ui , di ,

где ti – либо пусто либо TO ei2, где ei2 –скалярное выражение; bi – либо пусто, либо конструкция вида BY ei3, где ei3 –скалярное выражение; ri – либо пусто, либо REPEAT ei6, где ei6 – скалярное выражение; ui –либо пусто, либо UPTHRU ei2; di – либо пусто, либо конструкция вида DOWNTHRU ei2. ki – конструкции идентичные конструкциям оператора DO первого типа.

Каждая спецификация задаёт несколько (возможно, ни одного) выполнений цикла. Как только цикл в соответствии со спецификацией si заканчивает выполняться, то начинает выполняться цикл в соответствии со спецификацией si+1 и так далее, пока список спецификаций не будет исчерпан. Затем управление передаётся оператору, следующему непосредственно за циклом.

При переходе к очередной спецификации si (в том числе и к первой) вычисляется значение выражения ei1, а также тех из выражений eij, (j=2,3,4), которые присутствуют в спецификации. Выражения ei1, ei2, ei3 не изменяются в процессе выполнения цикла. Затем значение выражения ei1 присваивается переменной v. Число выполнений цикла зависит от вида спецификации. Если спецификация имеет вид ei1, то цикл выполняется один раз. Если спецификация имеет вид ei1 TO ei2, то цикл будет выполняться до тех пор, пока значение переменной v не превысит значение выражения ei2. При этом перед каждым повторным выполнением цикла к переменной v прибавляется 1. Сравнение v и ei2 осуществляется перед первым выполнением оператора цикла – после присвоения v значения ei1, а перед повторным выполнением – после прибавления к v единицы. Если спецификация имеет вид ei1 BY ei3. то цикл будет повторяться до тех пор, пока не будет остановлен каким-либо оператором, нарушающим нормальный порядок выполнения операторов цикла, или условиями в конструкциях WHILE, UNTIL. При этом перед каждым повторным выполнением цикла к переменной v будет прибавляться значение выражения ei3.

Если спецификация имеет вид ei1 TO ei2 BY ei3 или ei1 BY ei3 TO ei2 и при этом ei3>0, то выполнение цикла также будет продолжаться до тех пор, пока значение переменной v не превысит ei2. Отличие от предыдущего случая заключается в том, что перед повторным выполнением к v прибавляется не 1, а значение ei3.

Если спецификация имеет вид, аналогичный рассмотренному выше, но ei3<0, то цикл будет выполняться до тех пор, пока значение переменной не станет меньше значения выражения ei2. В остальном данная спецификация применяется аналогично предыдущей.

Если спецификация имеет вид ei1 REPEAT ei6, то после каждого выполнения цикла выражение ei6 вычисляется и присваивается переменной v. Цикл повторяется да тех пор, пока не будет остановлен каким-либо оператором, нарушающим нормальный порядок выполнения операторов цикла, или условиями в конструкциях WHILE, UNTIL.

Если спецификация имеет вид ei1 UPTHRU ei2, то при входе в цикл выражение ei2 вычисляется и сохраняется. Оно определяет предельное максимальное значение переменной v. Значение переменной v сравнивается с сохранённым значением ei2 после каждого выполнения цикла, но до того как v изменяется в соответствии со спецификацией. Поэтому цикл будет выполнен хотя бы один раз. Увеличение v после каждого повторения цикла происходит на единицу. Использование опции UPTHRU удобно при организации выполнения цикла по упорядоченным множествам (описатель ORDINAL).

Использование спецификации ei1 DOWNTHRU ei2 аналогично предыдущему случаю, с той лишь разницей, ei2 указывает предельное минимальное значение для переменной v и при выполнении цикла происходит уменьшение v на единицу.

Использование конструкций WHILE и UNTIL аналогично их применению в операторе DO первого типа.

Управление во внутрь цикла, начинающегося с оператора заголовка цикла 1-го и 2-го типов, не может быть передано извне.

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

Данный тип определяет циклы с неограниченным количеством выполнений. Для выхода из цикла необходимо использовать операторы GO TO, LEAVE или завершить выполнение процедуры либо программы.

Приведём примеры операторов цикла.

DO I=1 TO 10;

-

-

-

END;

В данном примере цикл выполниться 10 раз со значениями I от 1 до 10.

DO name=’Tom’, ‘Dick’, ‘Harry’;

Выполнение цикла осуществляется три раза со значениями для переменной name равными ‘Tom’, ‘Dick’, ‘Harry’.

Следующий оператор определяет выполнение тринадцати повторений цикла

DO I=1 TO 10, 13 TO 15;

Следующий оператор определяет DO-группу с пятью выполнениями цикла..

DO I=2 TO 10 BY 2;

I принимает значения 2, 4, 6, 8, 10.

Пример использования отрицательного приращения даёт следующий оператор DO

DO I=10 TO –2 BY –2;

В следующем примере цикл выполняется три раза со значениями для переменной I равными 1, 3, 5.

I=1;
DO I=1 TO I+1 BY I;
Опции WHILE и UNTIL иллюстрируются следующими примерами.
DO WHILE (A=B);
-
-
-
END;

DO UNTIL (A=B);
-
-
-
END;
В следующих примерах цикл выполняется пять раз
DO I=1 UPTHRU 5;
-
-
-
END;

DO I=25 DOWNTHRU 21;
-
-
-
END;
Следующий пример даёт бесконечное выполнение цикла со значениями I равными 1, 2, 4 и т.д.
DO I=1 REPEAT 2*I;
-
-
-
END;

Отправить комментарий

  • Доступны HTML теги: <b> <i> <u> <br> <hr> <div> <span> <code> <pre>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <pli>.

Подробнее о форматировании

   __     ____  
/ /_ | ___|
| '_ \ |___ \
| (_) | ___) |
\___/ |____/
Enter the code depicted in ASCII art style.