FOR...NEXT

Da Gambas-it.org - Wikipedia.
FOR variabile = valore1 {TO | DOWNTO} valore2 [ STEP valore3 ]
<<vostro codice>> 
NEXT

Ripete un ciclo incrementando o decrementando un valore.


Dichiarazione della variabile all'interno del ciclo

E' possibile dichiarare il tipo della variabile all'interno del ciclo "FOR":

FOR variabile As Tipo_di_Dati = valore1 {TO | DOWNTO} valore2 [ STEP valore3 ]
<<vostro codice>> 
NEXT

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 di dato adatto a raggiungere il valore che interrompe il ciclo. Tale valore è rappresentato da quello immediatamente superiore al valore massimo indicato nel ciclo.
Quanto detto, può essere verificato dal seguente esempio:

Public Sub Main()

 Dim b As Byte

 For b = 1 To 9
   Print "\e[32m";b
 Next

' Il ciclo "FOR...NEXT" prima di uscire incrementa (o decrementa a seconda dell'impostazione) sempre di un'unità il valore della propria variabile.
' In questo caso il valore assunto dalla variabile "b" all'uscita del ciclo "FOR...NEXT" è pari all'unità immediatamente superiore (10) al valore massimo (9) del ciclo medesimo.
' Il valore 10 è "raggiungibile", "rappresentabile" dal tipo di dati "BYTE", e ciò ha consentito di uscire dal ciclo.
 Print "\n\e[31m"; b

End

Se invece il predetto valore, adatto ad interrompere il ciclo, non è raggiungibile dal tipo di dato della variabile del ciclo "FOR...NEXT", si avrà un ciclo infinito.

Esempio:

Public Sub Main()
 
 Dim b As Byte
 
 For b = 0 To 255   ' Ciclo infinito !
   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.