Capita spessissimo di dover eseguire un controllo per verificare se vigono certe condizioni.
È possibile attuare tale operazione tramite un costrutto di controllo, la cui forma più comune e diffusa è il costrutto If.
Questo permette di controllare se una condizione è vera. Ad esempio: in
un programma che calcoli l'area di un quadrato si deve imporre di
visualizzare un messaggio di errore nel caso l'utente immetta una
misura negativa, poichè, come è noto, non esistono lati la cui misura è
un numero negativo:
Module Module1
Sub Main()
Dim Lato As Single
Console.WriteLine("Inserire il lato di un quadrato:")
Lato = Console.ReadLine
If Lato < 0 Then 'Se Lato è minore di 0...
Console.WriteLine("Il lato non può avere una misura negativa!")
Else 'Altrimenti, se non lo è...
Console.WriteLine("L'area del quadrato è: " & Lato * Lato)
End If 'Fine controllo
Console.ReadKey()
End Sub
End Module
Come
sicuramente avrete intuito, questo controllo si può associare al
costrutto italiano "Se avviene qualcosa Allora fai questo Altrimenti
fai quell'altro". Si può eseguire qualsiasi tipo di comparazione tra If
e Then utilizzando i seguenti operatori di confronto:
- > : maggiore
- < : minore
- = : uguaglianza
- <> : diverso
- >= : maggiore o uguale
- <= : minore o uguale
- Is : identicità (solo per tipi reference)
- IsNot : negazione di Is (solo per tipi reference)
Ma l'importante è ricordarsi di attenersi a questa sintassi:
If [Condizione] Then
[istruzioni]
Else
[istruzioni alternative]
End If
If nidificati
Quando si trova un costrutto If all'interno di un altro costrutto If, si dice che si tratta di un Costrutto If Nidificato. Questo avviene abbastanza
spesso, specie se si ha bisogno di fare controlli multipli:
Module Module1
Sub Main()
Dim Numero As Int16
Console.WriteLine("Inserisci un numero:")
Numero = Console.ReadLine
If Numero > 0 Then
If Numero < 5 Then
Console.WriteLine("Hai indovnato il numero!")
End If
Else
Console.WriteLine("Numero errato!")
End If
Console.ReadKey()
End Sub
End Module
Se
il numero inserito da tastiera è compreso fra 0 e 5, estremi esclusi,
allora l'utente ha indovinato il numero, altrimenti no. Si può trovare
un numero illimitato di If nidificati, ma è meglio limitarne l'uso e,
piuttosto, fare utilizzo di connettivi logici.
I connettivi logici
I connettivi logici sono 4: And, Or, Xor e Not. Servono per costruire
controlli complessi. Di seguito un'illustrazione del loro
funzionamento:
- If A And B : la condizione risulta verificata se sia A che B sono vere contemporaneamente
- If A Or B : la condizione risulta verificata se è vera almeno una delle due condizioni
- If A Xor B: la condizione risulta vera se una sola delle due condizioni è vera
- If Not A: la condizione risulta verificata se è falsa
Un esempio pratico:
Module Module1
Sub Main()
Dim a, b As Double
Console.WriteLine("Inserire i lati di un rettangolo:")
a = Console.ReadLine
b = Console.ReadLine
'Se tutti e due i lati sono maggiori di 0
If a > 0 And b > 0 Then
Console.WriteLine("L'area è: " & a * b)
Else
Console.WriteLine("Non esistono lati con misure negative!")
End If
Console.Readkey()
End Sub
End Module
Continuare il controllo: ElseIf
Nei precedenti esempi, la seconda parte del costrutto è sempre stata Else, una parola riservata che indica cosa fare se nonsi
verifica la condizione proposta dalla prima parte. Il suo valore è,
quindi, di pura alternativa. Esiste, tuttavia, una variante di Else
che consente di continuare con un altro controllo senza dover ricorrere
ad If nidificati (a cui è sempre meglio supplire con qualcosa di
più ordinato). Ammettiamo, ad esempio, di avere un codice 'autocritico'
simile:
Module Module1
Sub Main()
Dim Voto As Single
Console.WriteLine("Inserisci il tuo voto:")
Voto = Console.ReadLine
If Voto < 3 Then
Console.WriteLine("Sei senza speranze!")
Else
If Voto < 5 Then
Console.WriteLine("Ancora un piccolo sforzo...")
Else
If Voto < 7 Then
Console.WriteLine("Stai andando discretamente")
Else
If Voto < 9 Then
Console.WriteLine("Molto bene, continua così")
Else
Console.WriteLine("Sei praticamente perfetto!")
End If
End If
End If
End If
Console.ReadKey()
End Sub
End Module
E' abbastanza disordinato... La variante ElseIf è molto utile per migliore la leggibilità del codice:
Module Module1
Sub Main()
Dim Voto As Single
Console.WriteLine("Inserisci il tuo voto:")
Voto = Console.ReadLine
If Voto < 3 Then
Console.WriteLine("Sei senza speranze!")
ElseIf Voto < 5 Then
Console.WriteLine("Ancora un piccolo sforzo...")
ElseIf Voto < 7 Then
Console.WriteLine("Stai andando discretamente")
ElseIf Voto < 9 Then
Console.WriteLine("Molto bene, continua così")
Else
Console.WriteLine("Sei praticamente perfetto!")
End If
Console.ReadKey()
End Sub
End Module
Notate che tutti gli ElseIf fanno parte dello stesso
costrutto: mentre nell'esempio ogni If nidificato era un blocco a sé
stante,
dotato infatti di un proprio End If, in questo caso ogni
alternativa-selettiva fa comunque parte dell'unico If iniziale,
protratto solamente un
poco più a lungo.
Blocchi di istruzioni
Fino a questo punto, gli esempi proposti non hanno mai dichiarato una
variabile dentro un costrutto If, ma solo all'inizio del programma,
dopo
Sub Main(). È possibile dichiarare variabili in altri punti del codice
che non siano all'inizio della Sub? Certamente sì. A differenza
di altri, i linguaggi .NET permettono di dichiarare variabili in
qualunque punto del sorgente, dove occorre, evitando un gigantesco
agglomerato
di dichiarazioni iniziali, fortemente dispersive per chi legge. Questo
è un grande vantaggio, ma bisogna fare attenzione ai blocchi di
codice.
Con questo termine ci si riferisce a parti del sorgente comprese tra
due parole riservate, che in VB si solito sono accoppiante in
questo modo:
[Keyword]
'Blocco di codice
End [Keyword]
Ad
esempio, tutto il codice compreso tra Sub ed End Sub costituisce un
blocco, così come lo costituisce quello compreso tra If ed End If
(se non vi è un Else), tra If ed Else o
addirttura tra Module ed End Module. Facendo questa distinzione sarà
facile intuire che una variabile dichiarata in un blocco non è
visibile
al di fuori di esso. Con questo voglio dire che la sua dichiarazione
vale solo all'interno di quel blocco. Ecco una dimostrazione:
Module Module1
Sub Main()
'a, b e c fanno parte del blocco delimitato da Sub ... End Sub
Dim a, b, c As Single
'Semplice esempio di risoluzione di equazione di secondo grado
Console.WriteLine("Equazione: ax2 + bx + c = 0")
Console.WriteLine("Inserisci, in ordine, a, b e c:")
a = Console.ReadLine
b = Console.ReadLine
c = Console.ReadLine
If a = 0 Then
Console.WriteLine("L'equazione si abbassa di grado")
Console.ReadKey()
'Con Exit Sub si esce dalla Sub, che in questo caso
'coincide con il programma
Exit Sub
End If
'Anche delta fa parte del blocco delimitato da Sub ... End Sub
Dim delta As Single = b ^ 2 - 4 * a * c
'Esistono due soluzioni distinte
If delta > 0 Then
'Queste variabili fanno parte del blocco di If ... ElseIf
Dim x1, x2 As Single
'È possibile accedere senza problemi alla variabile
'delta, poiché questo blocco è a sua volta
'all'interno del blocco in cui è dichiarato delta
x1 = (-b + Math.Sqrt(delta)) / (2 * a)
x2 = (-b - Math.Sqrt(delta)) / (2 * a)
Console.WriteLine("Soluzioni: ")
Console.WriteLine("x1 = " & x1)
Console.WriteLine("x2 = " & x2)
'Esiste una soluzione doppia
ElseIf delta = 0 Then
'Questa variabile fa parte del blocco ElseIf ... Else
Dim x As Single
x = -b / (2 * a)
Console.WriteLine("Soluzione doppia: ")
Console.WriteLine("x = " & x)
'Non esistono soluzioni in R
Else
Console.WriteLine("Non esistono soluzioni in R")
End If
Console.ReadKey()
End Sub
End Module
Se
in questo codice, prima del Console.ReadKey(), finale provassimo a
usare una fra le variabili x, x1 o x2, otterremmo un errore:

Questo succede perchè nessuna variabile dichiarata all'interno di un blocco è accessibile al di fuori di esso. Con questo
schemino rudimentale sarà più facile capire:
 Le
frecce verdi indicano che un codice può accedere a certe variabile,
mentre quelle rosse indicano che non vi può accedere. Come
salta subito agli occhi, sono permesse tutte le richieste che vanno
dall'interno di un blocco verso l'esterno, mentre sono proibite tutte
quelle
che vanno dall'esterno verso l'interno. Questa regola vale sempre, in
qualsiasi circostanza e per qualsiasi tipo di blocco: non ci sono
eccezioni. |