Differenze tra le versioni di "FOR...NEXT"
(Una versione intermedia di uno stesso utente non è mostrata) | |||
Riga 5: | Riga 5: | ||
---- | ---- | ||
+ | ===Dichiarazione della variabile all'interno del ciclo=== | ||
E' possibile dichiarare il tipo della ''variabile'' all'interno del ciclo "FOR": | E' possibile dichiarare il tipo della ''variabile'' all'interno del ciclo "FOR": | ||
− | '''FOR''' ''variabile'' '''As | + | '''FOR''' ''variabile'' '''<FONT Color=red>As</font> Tipo_di_Dati''' = ''valore1'' {TO | DOWNTO} ''valore2'' [ STEP ''valore3'' ] |
<<vostro codice>> | <<vostro codice>> | ||
'''NEXT''' | '''NEXT''' | ||
Riga 35: | Riga 36: | ||
oppure usando l'istruzione '''DOWNTO''': | oppure usando l'istruzione '''DOWNTO''': | ||
DIM variabile AS Integer | DIM variabile AS Integer | ||
− | '''FOR variabile = 10 <FONT Color= | + | '''FOR variabile = 10 <FONT Color=red>DOWNTO</font> 0''' |
Print variabile | Print variabile | ||
'''NEXT''' | '''NEXT''' | ||
Riga 117: | Riga 118: | ||
===Ciclo su array stringa=== | ===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: | 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'' | ''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. | 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. | ||
Riga 131: | Riga 132: | ||
===Modificare arbitrariamente il valore della variabile del ciclo FOR=== | ===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: | 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 | Dim '''b''' As Byte | ||
Riga 147: | Riga 148: | ||
Next | 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". | 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". | ||
---- | ---- | ||
Riga 154: | Riga 155: | ||
Un ciclo '''FOR''', per terminare, deve avere una variabile del <SPAN Style="text-decoration:underline">tipo di dato adatto a raggiungere</span> il valore che interrompe il ciclo. Tale valore è rappresentato da quello immediatamente superiore al valore massimo indicato nel ciclo. | Un ciclo '''FOR''', per terminare, deve avere una variabile del <SPAN Style="text-decoration:underline">tipo di dato adatto a raggiungere</span> il valore che interrompe il ciclo. Tale valore è rappresentato da quello immediatamente superiore al valore massimo indicato nel ciclo. | ||
<BR>Quanto detto, può essere verificato dal seguente esempio: | <BR>Quanto detto, può essere verificato dal seguente esempio: | ||
− | + | Public Sub Main() | |
Dim b As Byte | Dim b As Byte | ||
Riga 167: | Riga 168: | ||
Print "\n\e[31m"; b | Print "\n\e[31m"; b | ||
− | + | End | |
<SPAN Style="text-decoration:underline">Se</span> invece il predetto valore, adatto ad interrompere il ciclo, <SPAN Style="text-decoration:underline">non</span> è raggiungibile dal tipo di dato della variabile del ciclo "FOR...NEXT", si avrà un ciclo infinito. | <SPAN Style="text-decoration:underline">Se</span> invece il predetto valore, adatto ad interrompere il ciclo, <SPAN Style="text-decoration:underline">non</span> è raggiungibile dal tipo di dato della variabile del ciclo "FOR...NEXT", si avrà un ciclo infinito. | ||
Esempio: | Esempio: | ||
− | + | Public Sub Main() | |
− | + | Dim b As <FONT Color=red><B>Byte</b></font> | |
− | <B>For</b> b = 0 To <FONT Color= | + | <B>For</b> b = 0 To <FONT Color=red><B>255</b></font> <FONT Color=gray>' ''Ciclo infinito !''</font> |
Print b | Print b | ||
Wait 0.01 | Wait 0.01 | ||
<B>Next</b> | <B>Next</b> | ||
− | + | 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 <SPAN Style="text-decoration:underline">valore superiore</span> a 255 (ossia 256); pertanto, si avrà un ciclo infinito. | 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 <SPAN Style="text-decoration:underline">valore superiore</span> a 255 (ossia 256); pertanto, si avrà un ciclo infinito. |
Versione attuale delle 12:04, 5 lug 2024
FOR variabile = valore1 {TO | DOWNTO} valore2 [ STEP valore3 ] <<vostro codice>> NEXT
Ripete un ciclo incrementando o decrementando un valore.
Indice
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.