progress-4gl
Iteracja
Szukaj…
Wprowadzenie
Istnieje kilka sposobów iteracji (zapętlania) w Progress ABL.
ZRÓB TO
Pętla DO WHILE
będzie kontynuowana, chyba że część WHILE
zostanie spełniona. To sprawia, że łatwo jest działać wiecznie i jeść cały czas z jednego rdzenia procesora.
ZRÓB, GDY wyrażenie :
KONIEC.
wyrażenie to dowolna kombinacja logiki boolowskiej, porównań, zmiennych, pól itp., która daje prawdziwą wartość.
/* 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
Możesz użyć dowolnej liczby czeków w części WHILE
:
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.
Jednak kompilator nie pomoże, więc sprawdź, czy WHILE
-part w końcu został spełniony:
/* 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 DO zakończenia [BY step]
Ta iteracja zmienia wartość od punktu początkowego do końca, opcjonalnie o określoną wartość dla każdego kroku. Domyślna zmiana to 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.
Wynik:
---------------i
10
11
12
13
14
15
Możesz także iterować według dat:
DEFINE VARIABLE dat AS INTEGER NO-UNDO.
DO dat = TODAY TO TODAY + 3:
END.
I ponad dziesiętne. Ale najprawdopodobniej chcesz użyć BY
- w przeciwnym razie INTEGER
zrobiłby tak samo dobrze ...
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
DO de = 1.8 TO 2.6 BY 0.2:
DISPLAY "Value" de.
END.
Używając BY
liczby ujemnej, możesz również przejść z wyższej na niższą wartość:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
Wyrażenie będzie testowane, dopóki nie zostanie spełnione. To sprawia, że licznik będzie wyższy (jeśli porusza się w górę) lub niższy (jeśli porusza się w dół) po zakończeniu pętli:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
MESSAGE i. // Will message 0
Inny przykład:
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)
POWTARZAĆ
POWTÓRZ, powtórzy się zawsze, chyba że wyjdziesz z pętli:
//Runs forever
REPEAT:
// Do stuff
END.
Aby wyjść z pętli, możesz użyć słowa kluczowego LEAVE
. Z etykietą lub bez. Bez etykiety LEAVE
zawsze będzie działać na bieżącą pętlę. Za pomocą nazwy możesz określić, która pętla 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.