progress-4gl
iteratie
Zoeken…
Invoering
Er zijn verschillende manieren om itereren (looping) in Progress ABL.
DOEN TERWIJL
Een DO WHILE
lus blijft doorgaan, tenzij aan het WHILE
wordt voldaan. Dit maakt het gemakkelijk om voor altijd te lopen en alle tijd op te eten van één CPU-kern.
DOEN terwijl uitdrukking :
EINDE.
expressie is elke combinatie van booleaanse logica, vergelijkingen, variabelen, velden enz. die resulteert in een echte waarde.
/* 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
U kunt een willekeurig aantal controles in het WHILE
-deel gebruiken:
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.
De compiler helpt u echter niet, dus controleer of het WHILE
-onderdeel uiteindelijk wordt gehaald:
/* 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 TO finish [BY step]
Deze iteratie verandert een waarde van een beginpunt naar een einde, optioneel met een opgegeven waarde voor elke stap. De standaard wijziging is 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.
Resultaat:
---------------i
10
11
12
13
14
15
Je kunt ook datums herhalen:
DEFINE VARIABLE dat AS INTEGER NO-UNDO.
DO dat = TODAY TO TODAY + 3:
END.
En meer dan decimalen. Maar dan wilt u waarschijnlijk BY
- anders zou een INTEGER
net zo goed hebben gedaan ...
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
DO de = 1.8 TO 2.6 BY 0.2:
DISPLAY "Value" de.
END.
Met behulp van BY
een negatief getal kunt u ook van een hogere naar een lagere waarde:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
De uitdrukking wordt getest totdat er niet meer aan wordt voldaan. Dit maakt de teller hoger (als u naar boven gaat) of lager (als u naar beneden gaat) als de lus klaar is:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
MESSAGE i. // Will message 0
Een ander voorbeeld:
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)
HERHALING
REPEAT, herhaalt zichzelf voor altijd, tenzij je expliciet de lus verlaat:
//Runs forever
REPEAT:
// Do stuff
END.
Om de lus te verlaten, kunt u het sleutelwoord LEAVE
. Met of zonder label. Zonder label heeft LEAVE
altijd invloed op de huidige lus. Met een naam kunt u opgeven welke lus moet worden 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.