Abbiamo visto che esistono costrutti per verificare condizioni, o anche per verificare in modo semplice e veloce molte ugualiglianze.
Ora vedremo i
cicli o costrutti iterativi (dal latino iter, itineris = "viaggio", ma anche "per la seconda volta"). Essi hanno il compito di ripetere un blocco di istruzioni
un numero determinato o indeterminato di volte. Il primo che analizzeremo è, appunto, il costrutto Do Loop, di cui esistono molte varianti.
La più semplice è ha questa sintassi:
Do
'istruzioni
Loop
Il suo compito consiste nel ripete delle istruzioni comprese tra
Do e
Loop un numero infinito di volte: l'unico modo per uscire dal
ciclo è usare una speciale istruzione: "Exit Do", la quale ha la capacità di interrompere il ciclo all'istante ed uscire da esso.
Questa semplice variante viene usata in un numero ridotto di casi, che si possono ricondurre sostanzialmente a due: quando si lavora con
la grafica e le librerie DirectX, per disegnare a schermo i costanti cambiamenti del mondo 2D o 3D; quando è necessario verificare le condizioni
di uscita dal ciclo all'interno del suo blocco di codice. Ecco un esempio di questo secondo caso:
Module Module1
Sub Main()
Dim a, b As Single
Do
'Pulisce lo schermo
Console.Clear()
'L'underscore serve per andare a capo nel codice
Console.WriteLine("Inserire le misure di base e altezza " & _
"di un rettangolo:")
a = Console.ReadLine
b = Console.ReadLine
'Controlla che a e b non siano nulli. In quel caso, esce
'dal ciclo. Se non ci fosse questo If in mezzo al codice,
'verrebbe scritto a schermo il messaggio:
' "L'area del rettangolo è: 0"
'cosa che noi vogliamo evitare. Se si usasse un'altra
'variante di Do Loop, questo succederebbe sempre. Ecco
'perchè, in questa situazione, è meglio
'servirsi del semplice Do Loop
If a = 0 Or b = 0 Then
Exit Do
End If
Console.WriteLine("L'area del rettangolo è: " & (a * b))
Console.ReadKey()
Loop
End Sub
End Module
Le altre versioni del costrutto, invece, sono le seguenti:
Do
'istruzioni
Loop While [condizione]
Esegue le istruzioni specificate fintanto che una condizione rimane valida, ma tutte le istruzioni vengono eseguite almeno una volta,
poichè While si trova dopo Do. Esempio:
Module Module1
Sub Main()
Dim a As Int32 = 0
Do
a += 1
Loop While (a < 2) And (a > 0)
Console.WriteLine(a)
Console.ReadKey()
End Sub
End Module
Il codice scriverà a schermo "2".
Do While [condizione]
'istruzioni
Loop
Esegue le istruzioni specificate fintanto che una condizione rimane valida, ma se la condizione non è valida all'inizio, non viene
eseguita nessuna istruzione nel blocco. Esempio:
Module Module1
Sub Main()
Dim a As Int32 = 0
Do While (a < 2) And (a > 0)
a += 1
Loop
Console.WriteLine(a)
Console.ReadKey()
End Sub
End Module
Il codice scriverà a schermo "0". Bisogna notare come le stesse condizioni del caso precedente, spostate da dopo Loop a dopo Do, cambino il
risultato di tutto l'algoritmo. In questo caso, il codice nel ciclo non viene neppure eseguito perchè la condizione nel While diventa
subito falsa (in quanto a = 0, e la proposizione "a < 0" risulta falsa). Nel caso precedente, invece, il blocco veniva eseguito almeno una
volta poiché la condizione di controllo si trovava dopo di esso: in quel caso, a era ormai stato incrementato di 1 e perciò soddisfaceva
la condizione affinché il ciclo continuasse (fino ad arrivare ad a = 2, che era il risultato visualizzato).
Do
'istruzioni
Loop Until [condizione]
Esegue le istruzioni specificate fino a che non viene verificata la condizione, ma tutte le istruzioni vengono eseguite almeno una volta,
poichè Until si trova dopo Do. Esempio:
Module Module1
Sub Main()
Dim a As Int32 = 0
Do
a += 1
Loop Until (a <> 1)
Console.WriteLine(a)
Console.ReadKey()
End Sub
End Module
A schermo apparirà "2".
Do Until [condizione]
'istruzioni
Loop
Esegue le istruzioni specificate fino a che non viene soddisfatta la condizione, ma se la condizione è valida all'inizio, non viene eseguita
nessuna istruzione del blocco. Esempio:
Module Module1
Sub Main()
Dim a As Int32 = 0
Do Until (a <> 1)
a += 1
Loop
Console.WriteLine(a)
Console.ReadKey()
End Sub
End Module
A schermo apparirà "0".
Un piccolo esempio finale:
Module Module1
Sub Main()
Dim a, b, c As Int32
Dim n As Int32
Console.WriteLine("-- Successione di Fibonacci --")
Console.WriteLine("Inserire un numero oltre il quale terminare:")
n = Console.ReadLine
If n = 0 Then
Console.WriteLine("Nessun numero della successione")
Console.ReadKey()
Exit Sub
End If
a = 1
b = 1
Console.WriteLine(a)
Console.WriteLine(b)
Do While c < n
c = a + b
b = a
a = c
Console.WriteLine(c)
Loop
Console.ReadKey()
End Sub
End Module
Suggerimento
Per impostare il valore di Default (ossia il valore predefinito) di una variabile si può usare questa sintassi:
Dim [nome] As [tipo] = [valore]
Funziona solo per una variabile alla volta. Questo tipo di istruzione si chiama
inizializzazione in-line.