Differenze tra le versioni di "FOR...NEXT"

Da Gambas-it.org - Wikipedia.
(21 versioni intermedie di 5 utenti non mostrate)
Riga 1: Riga 1:
  '''FOR''' ''variabile'' '''=''' ''valore1'' '''TO''' ''valore2'' [ '''STEP''' ''valore3'' ] <<vostro codice>> '''NEXT'''
+
  '''FOR''' ''variabile'' '''=''' ''valore1'' {'''TO''' | '''DOWNTO'''} ''valore2'' [ '''STEP''' ''valore3'' ]
 +
<<vostro codice>>  
 +
'''NEXT'''
 +
''' Ripete un ciclo incrementando o decrementando un valore. '''
 +
----
  
''' 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'' '''<FONT Color=#B22222>As</font> Tipo_di_Dati''' = ''valore1'' {TO | DOWNTO} ''valore2'' [ STEP ''valore3'' ]
 +
<<vostro codice>>
 +
'''NEXT'''
 
----
 
----
  
''Esempio 1'' - '''Ciclo crescente semplice'''
+
===Cicli semplici===
 +
I cicli semplici sono cicli privi di "passo", ossia di salto nel conteggio.
 +
<BR>I cicli semplici possono essere "crescenti" o "decrescenti".
 +
====Ciclo crescente semplice====
  
 
  DIM variabile AS Integer
 
  DIM variabile AS Integer
     FOR variabile = 0 TO 10
+
     '''FOR variabile = 0 TO 10'''
       Message.Info("Numero " & Str$(variabile))
+
       Print variabile
     NEXT  
+
     '''NEXT'''
 
''Spiegazione''
 
''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.
+
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.
 +
----
 +
 
  
  
''Esempio 2'' - '''Ciclo crescente con passo'''
+
====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 <SPAN STYLE="text-decoration:underline>negativo</span> 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 <FONT Color=#B22222>DOWNTO</font> 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.
 +
<BR>Anche i cicli con passo possono essere "crescenti" o "decrescenti".
 +
====Ciclo crescente con passo====
  
 
  DIM variabile AS Integer
 
  DIM variabile AS Integer
     FOR variabile = 0 TO 10 STEP 2
+
     '''FOR variabile = 0 TO 10 STEP 2'''
       Message.Info("Numero " & Str$(variabile))
+
       Print variabile
     NEXT  
+
     '''NEXT'''
 
''Spiegazione''
 
''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.
 
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.
 +
----
  
  
''Esempio 3'' - '''Ciclo decrescente con passo'''
+
====Ciclo decrescente con passo====
  
 
  DIM variabile AS Integer
 
  DIM variabile AS Integer
    FOR variabile = 10 TO 0 STEP -2
+
      Message.Info("Numero " & Str$(variabile))
+
  '''FOR variabile = 10 TO 0 STEP -2'''
    NEXT  
+
    Print variabile
 +
  '''NEXT'''
 
''Spiegazione''
 
''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.
+
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 <SPAN STYLE="text-decoration:underline>positivo</span>.
 +
DIM variabile AS Integer
 +
 +
  '''FOR variabile = 10 DOWNTO 0 STEP <FONT Color=#B22222><B>2</b></font>'''
 +
    Print variabile
 +
  '''NEXT'''
  
 
----
 
----
 
''Nota''
 
''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:
+
''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''
''Visual Basic'' = '''NEXT''' ''variabile''
 
 
   
 
   
''Gambas'' = '''NEXT'''
+
''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.''
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===
''Esempio 4'' - '''Cicli nidificati'''
 
  
 
  DIM variabile AS Integer
 
  DIM variabile AS Integer
 
  DIM variabile1 AS Integer
 
  DIM variabile1 AS Integer
 
  DIM variabile2 AS Integer
 
  DIM variabile2 AS Integer
     FOR variabile = 0 TO 10
+
     '''FOR variabile = 0 TO 10'''
       FOR variabile1 = 0 TO 10
+
       '''FOR variabile1 = 0 TO 10'''
           FOR variabile2 = 0 TO 10
+
           '''FOR variabile2 = 0 TO 10'''
 
             Message.Info("Numero " & Str$(variabile) & Str$(variabile1) & Str$(variabile2))
 
             Message.Info("Numero " & Str$(variabile) & Str$(variabile1) & Str$(variabile2))
           NEXT  
+
           '''NEXT'''
       NEXT
+
       '''NEXT'''
     NEXT
+
     '''NEXT'''
 
''Spiegazione''
 
''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.
 
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===
''Esempio 5'' - '''Uscita anticipata'''
 
  
 
  DIM variabile AS Integer
 
  DIM variabile AS Integer
     FOR variabile = 0 TO 10
+
     '''FOR variabile = 0 TO 10'''
 
         IF variabile = 5 then  
 
         IF variabile = 5 then  
 
             Message.Info("Esco dal ciclo.")
 
             Message.Info("Esco dal ciclo.")
    EXIT
+
            '''BREAK'''
 
         ENDIF
 
         ENDIF
       Message.Info("Numero " & Str$(variabile))
+
       Print variabile
     NEXT
+
     '''NEXT'''
 
''Spiegazione''
 
''Spiegazione''
 
 
Il programma mostrerà i messaggi per ogni valore di variabile da 0 a 4; quando variabile raggiunge il valore 5 il sistema uscirà (EXIT) dal ciclo e non mostrerà più alcun messaggio.
+
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
 +
 +
<FONT Color=gray>' ''Incrementa arbitrariamente il valore della variabile del ciclo:''</font>
 +
    '''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 <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:
 +
'''Public''' Sub Main()
 +
 +
  Dim b As Byte
 +
 +
  For b = 1 To 9
 +
    Print "\e[32m";b
 +
  Next
 +
 +
<FONT Color=gray>' ''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.''</font>
 +
  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.
 +
 
 +
Esempio:
 +
'''Public''' Sub Main()
 +
 
 +
  Dim b As <FONT Color=#B22222><B>Byte</b></font>
 +
 
 +
  <B>For</b> b = 0 To <FONT Color=#B22222><B>255</b></font>  <FONT Color=gray>' ''Ciclo infinito !''</font>
 +
    Print b
 +
    Wait 0.01 
 +
  <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.

Versione delle 17:01, 15 gen 2022

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.