progress-4gl
Итерация
Поиск…
Вступление
Существует несколько способов итерации (циклизации) в Progress ABL.
ДЕЛАТЬ ПОКА
Цикл DO WHILE
будет продолжаться до тех пор, пока не будет выполнена WHILE
. Это упрощает работу навсегда и все время питается от одного ядра процессора.
DO WHILE выражение :
КОНЕЦ.
выражение представляет собой любую комбинацию логической логики, сравнения, переменных, полей и т. д., которая оценивает истинное значение.
/* This is a well defined DO WHILE loop that will run as long as i is lower than 10*/
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO WHILE i < 10:
i = i + 1.
END.
DISPLAY i. // Will display 10
Вы можете использовать любое количество проверок в WHILE
-part:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO WHILE TODAY = DATE("2017-02-06") AND RANDOM(1,100) < 99:
i = i + 1.
END.
MESSAGE i "iterations done" VIEW-AS ALERT-BOX.
Однако компилятор не поможет вам проверить, что WHILE
-part в конечном итоге выполняется:
/* Oops. Didnt increase i. This will run forever... */
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO WHILE i < 10:
i = 1.
END.
DO var = start Закончить [BY step]
Эта итерация изменяет значение от начальной точки до конца, необязательно по заданному значению для каждого шага. По умолчанию установлено значение 1.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 10 TO 15:
DISPLAY i WITH FRAME x1 6 DOWN .
DOWN WITH FRAME x1.
END.
Результат:
---------------i
10
11
12
13
14
15
Вы также можете выполнять итерацию по датам:
DEFINE VARIABLE dat AS INTEGER NO-UNDO.
DO dat = TODAY TO TODAY + 3:
END.
И над десятичными знаками. Но тогда вы, скорее всего, захотите использовать BY
- иначе INTEGER
сделал бы так же хорошо ...
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
DO de = 1.8 TO 2.6 BY 0.2:
DISPLAY "Value" de.
END.
Использование BY
отрицательного числа вы можете также перейти от более высокого к более низкому значению:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
Выражение будет проверяться до тех пор, пока оно больше не будет выполнено. Это делает счетчик выше (если движение вверх) или ниже (если движение вниз) после завершения цикла:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
MESSAGE i. // Will message 0
Другой пример:
DEFINE VARIABLE da AS DATE NO-UNDO.
DISPLAY TODAY. //17/02/06
DO da = TODAY TO TODAY + 10:
END.
DISPLAY da. //17/02/17 (TODAY + 11)
ПОВТОРЕНИЕ
REPEAT, будет повторяться навсегда, если вы явно не выйдете из цикла:
//Runs forever
REPEAT:
// Do stuff
END.
Чтобы выйти из цикла, вы можете использовать ключевое слово LEAVE
. С этикеткой или без нее. Без метки LEAVE
всегда будет выполнять текущий цикл. С именем вы можете указать, какой цикл следует использовать для LEAVE
.
/* Without a label */
REPEAT:
//Do stuff
IF TRUE THEN LEAVE.
END.
/* With a label */
loopLabel:
REPEAT:
//Do stuff
IF <somecondition> THEN LEAVE loopLabel.
END.
/* Two nested REPEATS */
DEFINE VARIABLE i AS INTEGER NO-UNDO.
loopLabelOne:
REPEAT:
loopLabelTwo:
REPEAT:
i = i + 1.
IF RANDOM(1,100) = 1 THEN LEAVE loopLabelTwo.
IF RANDOM(1,100) = 1 THEN LEAVE loopLabelOne.
END.
IF RANDOM(1,100) = 1 THEN LEAVE loopLabelOne.
END.
DISPLAY i.