DO
повторитель:
условие:
DO используется для того, чтобы объединить некоторые инструкции и, необязательно, неоднократно их выполнить. В процессе неоднократного выполнения инструкций управляющая переменная (имя) может наращиваться, принимая различные значения из некоторого диапазона.
Примечания по синтаксису:
- Значения exprr, expri, exprb, exprt и exprf (если они указаны) представляют собой выражения, результат вычисления которых - число. Значения exprr и exprf представляют собой выражения, результат вычисления которых - целое неотрицательное число. При необходимости числа округляются в соответствии с установкой NUMERIC DIGITS.
- Значения exprw или expru (если они указаны) могут быть любым выражением, результат вычисления которого равен 1 или 0.
- Фразы TO, BY и FOR могут указываться в любом порядке, если они используются.
- Инструкции могут включать в себя операторы присваивания, команды и ключевые инструкции (которые сами могут включать любую из более сложных конструкций, таких, как IF, SELECT и инструкцию DO).
- Вложенные ключевые слова TO, BY, FOR, WHILE и UNTIL зарезервированы внутри инструкции DO, в которой они не могут использоваться в качестве имен переменных в выражениях, но могут выступать в качестве имени управляющей переменной. Вложенное ключевое слово FOREVER также зарезервировано, но только в том случае, если оно непосредственно следует за ключевым словом DO.
- Значение exprb по умолчанию принимается равным 1, если это имеет отношение к делу.
Простая группа DO:
Если не указан ни повторитель, ни условие, то конструкция DO просто группирует вместе некоторое число инструкций. Они выполняются один раз. В противном случае группа инструкций образует повторяющийся цикл DO, который выполняется несколько раз, в зависимости от заданного повторителя и условия, которое может его изменять.
В следующем примере инструкции выполняются один раз.
Пример: /* Две инструкции между DO и END будут */ /* выполнены в случае, если A = 3. */ If a=3 then Do a=a+2 Say 'Улыбнитесь!' End
Простые повторяющиеся циклы:
Если повторитель опущен, но указано условие, или если повторителем является FOREVER, то группа инструкций, вообще говоря, будет выполняться постоянно, т.е. до тех пор, пока не удовлетворится требуемое условие, или не выполнится инструкция REXX, которая осуществит выход из цикла (например, LEAVE).
В простой форме повторяющегося цикла выражение exprr вычисляется немедленно (результат должен быть целым неотрицательным числом), и цикл выполняется указанное число раз.
Пример: /* Выводит "Привет" пять раз */ Do 5 say 'Привет' end
Помните, чем отличается команда от оператора присваивания? Также и в инструкции DO: если первый знак exprr- символ, а второй - знак "=", то будет использоваться, скорее всего, управляемая форма повторителя.
Управляемые повторяющиеся циклы:
При использовании управляемой формы цикла указывается управляющая переменная имя, которой присваивается начальное значение (результат вычисления выражения expri, выполненного таким образом, как если бы был добавлен 0). Затем при каждом выполнении группы инструкций управляющая переменная наращивается (т.е. к ее значению в конце цикла добавляется результат вычисления exprb). Выполнение группы инструкций продолжается до тех пор, пока не встретится конечное условие (определенное как результат вычисления выражения exprt). Если значение exprb - положительное число или нуль, то цикл будет завершен, когда значение имени превысит значение exprt. В противном случае (если значение exprb - отрицательное число), цикл завершится, когда значение имени станет меньше значения exprt.
Результаты вычисления выражений expri, exprt и exprb должны быть числами. Они вычисляются только один раз, перед началом цикла и перед присваиванием управляющей переменной ее начального значения. По умолчанию значение выражения exprb равно 1. Если опущено выражение exprt, то цикл выполняется бесконечно, пока его не завершит какое-либо другое условие.
Пример: Do I=3 to -2 by -1 /* Выведет: */ say i /* 3 */ end /* 2 */ /* 1 */ /* 0 */ /* -1 */ /* -2 */
Числа не обязательно должны быть целыми.
Пример: X=0.3 /* Выведет: */ Do Y=X to X+4 by 0.7 /* 0.3 */ say Y /* 1.0 */ end /* 1.7 */ /* 2.4 */ /* 3.1 */ /* 3.8 */
Управляющую переменную можно изменить внутри цикла, но это может повлиять на количество повторений цикла. Изменение значения управляющей переменной считается дурным стилем программирования, хотя при некоторых обстоятельствах это может быть вполне приемлемо.
Следует отметить, что конечное условие проверяется в начале каждой итерации (повторения); а также после наращивания управляющей переменной, на второй и всех последующих итерациях. Поэтому группа инструкций может быть полностью пропущена, как только удовлетворится конечное условие. Отметим также, что на управляющую переменную ссылаются по ее имени. Если, например, для управляющей переменной используется составное имя A.I, то изменение I внутри цикла приведет к изменению управляющей переменной.
Количество итераций управляемого цикла может быть дополнительно ограничено с помощью фразы FOR. В этом случае должно быть указано выражение exprf, и результатом его вычисления должно быть целое неотрицательное число. Это число играет роль счетчика повторений в простом повторяющемся цикле, устанавливая предел количества итераций внутри цикла, если никакое другое условие не завершит его прежде. Подобно выражениям во фразах TO и BY, выражение во фразе FOR вычисляется только один раз: когда инструкция DO выполняется первый раз и управляющая переменная получает свое начальное значение. Аналогично условию TO, условие FOR проверяется в начале каждой итерации.
Пример: Do Y=0.3 to 4.3 by 0.7 for 3 /* Выведет: */ say Y /* 0.3 */ end /* 1.0 */ /* 1.7 */
В управляемых циклах имя, описывающее управляющую переменную, может быть указано в предложении END. Это имя должно совпадать с именем в предложении DO во всех отношениях, кроме регистра клавиатуры - строчные буквы или прописные - (отметим, что никакие подстановки для составных переменных не производятся); в противном случае выдается сообщение о синтаксической ошибке.
Данная возможность с минимальными издержками позволяет автоматически контролировать вложенность циклов.
Пример: Do K=1 to 10 ... ... End k /* Определяет конец цикла K */
Прим. Значения, которые принимает управляющая переменная, могут находиться под влиянием установок NUMERIC, так как вычисление приращения управляющей переменной выполняется по обычным арифметическим правилам, используемым REXX.
Условные фразы (WHILE и UNTIL):
Любой из типов повторителей (никакой, FOREVER, простой или управляемый) может предшествовать условной фразе, с помощью которой можно завершить цикл. Если Вы указали WHILE или UNTIL, то соответствующие выражения exprw или expru вычисляются при каждом проходе по циклу, используя при этом последние значения всех переменных (результатом вычисления должен быть либо 0, либо 1). При этом группа инструкций повторно выполняется, либо пока результат равен 1, либо до тех пор, пока результат не станет равным 1.
Для цикла WHILE проверяемое условие вычисляется в начале группы инструкций; для цикла UNTIL проверяемое условие вычисляется в конце, перед наращиванием управляющей переменной.
Пример: Do I=1 to 10 by 2 until i>6 say i end /* Выведет на экран: 1, 3, 5, 7 */
Прим. Способ выполнения повторяющихся циклов может быть изменен инструкцией LEAVE или ITERATE.