Guida al Visual Basic .NET
Capitolo 7° - Il costrutto If
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:
Ma l'importante è ricordarsi di attenersi a questa sintassi:
If [Condizione] Then [istruzioni] Else [istruzioni alternative] End If If nidificatiQuando 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 logiciI connettivi logici sono 4: And, Or, Xor e Not. Servono per costruire controlli complessi. Di seguito un'illustrazione del loro funzionamento:
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: ElseIfNei 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 istruzioniFino 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:
C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...
|