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.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow