FOR...NEXT
FOR variabile = valore1 {TO | DOWNTO} valore2 [ STEP valore3 ] <<vostro codice>> NEXT
Ripete un ciclo incrementando o decrementando un valore.
E' possibile dichiarare il tipo della variabile all'interno del ciclo "FOR":
FOR variabile As Integer = valore1 {TO | DOWNTO} valore2 [ STEP valore3 ] <<vostro codice>> NEXT
Indice
Cicli semplici
I cicli semplici sono cicli privi di "passo", ossia di salto nel conteggio.
I cicli semplici possono essere "crescenti" o "decrescenti".
Ciclo crescente semplice
DIM variabile AS Integer FOR variabile = 0 TO 10 Print variabile NEXT
Spiegazione
Per ogni valore da 0 a 10 che può assumere "variabile", mostra il messaggio "Numero" ed il valore di "variabile". In questo caso saranno mostrati tutti i messaggi con i seguenti numeri: 0-1-2-3-4-5-6-7-8-9-10.
Ciclo decrescente semplice
Nel caso si utilizzi la parola chiave "TO", per ottenere il ciclo decrescente è comunque necessario usare anche l'istruzione STEP accompagnata da un valore negativo ad indicare il passo. Nel caso di un ciclo decrescente semplice il passo sarà impostato a -1.
DIM variabile AS Integer FOR variabile = 10 TO 0 STEP -1 Print variabile NEXT
oppure usando l'istruzione DOWNTO:
DIM variabile AS Integer FOR variabile = 10 DOWNTO 0 Print variabile NEXT
Cicli con passo
I cicli con passo sono quelli che prevedono un salto nel conteggio crescente o decrescente del valore usato nel ciclo.
Anche i cicli con passo possono essere "crescenti" o "decrescenti".
Ciclo crescente con passo
DIM variabile AS Integer FOR variabile = 0 TO 10 STEP 2 Print variabile NEXT
Spiegazione
Per ogni valore da 0 a 10 con passo (STEP) 2 che può assumere variabile, mostra il messaggio "Numero" ed il valore di variabile. In questo caso saranno mostrati i messaggi con questi numeri: 0-2-4-6-8-10.
Ciclo decrescente con passo
DIM variabile AS Integer FOR variabile = 10 TO 0 STEP -2 Print variabile NEXT
Spiegazione
Per ogni valore da 10 a 0 con passo (STEP) -2 che può assumere variabile, mostra il messaggio "Numero" ed il valore di variabile. In questo caso saranno mostrati i messaggi con questi numeri: 10-8-6-4-2-0. Siccome per definizione di linguaggio un ciclo FOR...NEXT è crescente (1-2-3-ecc.) in caso venga omesso il comando STEP -2 non sarà mostrato alcun messaggio in quanto il nostro codice risulterà soddisfatto immediatamente.
In caso di ciclo decrescente con passo mediante l'uso dell'istruzione DOWNTO, il valore del passo sarà invece sempre positivo.
DIM variabile AS Integer FOR variabile = 10 DOWNTO 0 STEP 2 Print variabile NEXT
Nota
Chi ha già esperienza di programmazione in Visual Basic, avrà notato che dopo l'istruzione NEXT non è stato specificato a quale variabile si fa riferimento:
Visual Basic = NEXT variabile Gambas = NEXT
In realtà questo è superfluo per il semplice motivo che un ciclo FOR...NEXT è fine a se stesso e di tipo concentrico: ogni istruzione FOR deve concludersi con una istruzione NEXT.
Cicli nidificati
DIM variabile AS Integer DIM variabile1 AS Integer DIM variabile2 AS Integer FOR variabile = 0 TO 10 FOR variabile1 = 0 TO 10 FOR variabile2 = 0 TO 10 Message.Info("Numero " & Str$(variabile) & Str$(variabile1) & Str$(variabile2)) NEXT NEXT NEXT
Spiegazione
Al primo avvio variabile assume il valore 0, variabile1 assume il valore 0 e variabile2 assume il valore 0. Il primo valore che viene incrementato è quello riferito a variabile2, quando questa arriva a 10 il sistema passa il controllo a variabile1 e così via fino a che variabile assume valore 10, variabile1 valore 10 e variabile2 valore 10. Possiamo quindi notare che all'interno di un codice FOR...NEXT composto da vari cicli nidificati la priorità di esecuzione è sempre riferita all'ultimo ciclo scritto.
Uscita anticipata
DIM variabile AS Integer FOR variabile = 0 TO 10 IF variabile = 5 then Message.Info("Esco dal ciclo.") BREAK ENDIF Print variabile NEXT
Spiegazione
Il programma mostrerà i messaggi per ogni valore di variabile da 0 a 4; quando variabile raggiunge il valore 5 il sistema uscirà (BREAK) dal ciclo e non mostrerà più alcun messaggio.
Ciclo su array stringa
La sintassi FOR...NEXT viene in aiuto anche nel caso di loop su array e oggetti array, nel caso ci interessi solo il contenuto dell'array e non il numero di cicli effettuati:
DIM variabile AS String[10] DIM valore as String FOR EACH valore IN variabile Print valore NEXT
Spiegazione
Come si può vedere dall'esempio, sono state inserite le parole chiave EACH e IN, che indicano al ciclo di prendere tutti i valori includi nell'array 'variabile', uno per volta, di copiarli in 'valore', e di renderli disponibili alle istruzioni incluse nel loop. A questo punto pare evidente che la gestione di come e dove andare a prendere i dati è demandata al ciclo FOR, e a noi non resta che prenderci il valore restituito ogni volta, e manipolarlo come vogliamo, senza doverci neppure preoccupare di modificare l'array stesso, dato che la variabile 'value' contiene solo una copia del corrente elemento dell'array.
La sintassi è valida per ogni tipo di oggetto di tipo array, comprese le Collection.
Modificare arbitrariamente il valore della variabile del ciclo FOR
E' possibile modificare mediante il codice la variabile del passo del ciclo "FOR...NEXT", incrementandone o decrementandone arbitrariamente all'interno del ciclo il valore:
Public Sub Main() Dim b As Byte For b = 1 To 9 Print "pre--> "; b ' Incrementa arbitrariamente il valore della variabile del ciclo: Inc b Print "post--> "; b Print Next End
In questo esempio nella console vedremo scritto con pre--> il valore della variabile del ciclo incrementato dal ciclo "FOR" medesimo; mentre con post--> il valore sarà incrementato di un'unità. Tale ultimo incremento non andrà perso, poiché il ciclo ne terrà conto incrementando comunque la variabile del ciclo appena prima incrementata dal codice con l'istruzione "Inc".
Ciclo infinito
Un ciclo FOR, per terminare, deve avere una variabile del tipo adatto a raggiungere il valore che interrompe il ciclo, altrimenti si avrà un ciclo infinito. Tale valore è rappresentato da quello immediatamente superiore al valore massimo indicato nel ciclo.
Esempio:
Public Sub Main() Dim b As Byte For b = 0 To 255 Print b Wait 0.01 Next End
Poiché con una variabile di tipo Byte si possono ottenere valori che variano da 0 a 255 (in esadecimale: da "00" a "FF"), la variabile "b" di tipo Byte dell'esempio è incapace di raggiungere il valore superiore a 255 (ossia 256); pertanto, si avrà un ciclo infinito.