progress-4gl
iterazione
Ricerca…
introduzione
Esistono diversi modi per iterare (loop) in Progress ABL.
FARE MENTRE
Un ciclo DO WHILE
continuerà ad effettuare il ciclo a meno che non venga soddisfatta la parte WHILE
. Questo rende facile girare all'infinito e consumare tutto il tempo da un core della CPU.
DO WHILE espressione :
FINE.
espressione è una qualsiasi combinazione di logica booleana, confronti, variabili, campi ecc. che valuta un valore reale.
/* 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
Puoi utilizzare qualsiasi numero di controlli nella parte 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.
Tuttavia, il compilatore non ti aiuterà a controllare che la parte WHILE
sia soddisfatta:
/* 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]
Questa iterazione modifica un valore da un punto iniziale a un fine, facoltativamente da un valore specificato per ogni passaggio. La modifica predefinita è 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.
Risultato:
---------------i
10
11
12
13
14
15
Puoi anche scorrere le date:
DEFINE VARIABLE dat AS INTEGER NO-UNDO.
DO dat = TODAY TO TODAY + 3:
END.
E oltre i decimali. Ma molto probabilmente vorrai usare BY
- altrimenti un INTEGER
avrebbe fatto altrettanto bene ...
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
DO de = 1.8 TO 2.6 BY 0.2:
DISPLAY "Value" de.
END.
Usando BY
un numero negativo puoi anche passare da un valore superiore a un valore inferiore:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
L'espressione sarà testata fino a quando non sarà più soddisfatta. Questo fa sì che il contatore sia più alto (se si muove verso l'alto) o più basso (se si muove verso il basso) una volta che il ciclo è finito:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
MESSAGE i. // Will message 0
Un altro esempio:
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)
RIPETERE
REPEAT, si ripeterà per sempre a meno che tu non esca esplicitamente dal ciclo:
//Runs forever
REPEAT:
// Do stuff
END.
Per uscire dal ciclo puoi usare la parola chiave LEAVE
. Con o senza etichetta. Senza un'etichetta LEAVE
avrà sempre effetto sul loop corrente. Con un nome è possibile specificare quale ciclo 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.