Salta al contenuto principale

Corso visual basic script/Lezione23-uso di elseif nelle istruzioni condizionali

Guido Ruggeri su wingudotecnica, 19\01\2010, h. 17.54.

Dal momento che qualcuno di voi sta cercando di
destreggiarsi in esercizi dove le istruzioni condizionali
raggiungono una certa complessità, allora è arrivato il
momento di parlare di qualcosa che, se bene usata, può
concorrere a semplificarle.
Sto parlando dell'istruzione ElseIf.
ElseIf si scrive come un'unica parola: Empoli, Livorno,
Salerno, Empoli, Imperia, Firenze.
Quindi, nessuno spazio tra Else ed If.
Ciò nonostante, il significato vuole essere quello delle
due parole distinte: "altrimenti se".
Abbiamo detto, qualche lezione fa, che un blocco di
istruzioni condizionali If - End If si apre con una riga del
tipo:

Ed ora, un po' di pubblicità

:

If espressione Then

dove l'espressione rappresenta la condizione che stiamo
esaminando.
Dopo questa riga, seguono le varie istruzioni da eseguire
nel caso in cui espressione sia vera. Chiamiamolo primo
blocco di istruzioni:

If espressione Then
primo blocco di istruzioni

abbiamo anche detto che, dopo quel primo blocco di
istruzioni, possiamo mettere una riga con l'espressione
Else.
Dopo Else, seguono le varie istruzioni da eseguire nel caso
contrario, cioè quando l'espressione alla prima riga non
risulta vera. Chiamiamolo ultimo blocco di istruzioni. Il
tutto poi si chiude con End If:

If espressione Then
primo blocco di istruzioni
Else
ultimo blocco di istruzioni
End If

Ma non è tutto qui, c'è di più. Nello stesso blocco If
- End If, abbiamo la possibilità di valutare non una sola
espressione, ma più espressioni, ricorrendo alle
istruzioni ElseIf.
Consideriamo questa struttura:

If espressione1 Then
primo blocco di istruzioni
ElseIf espressione2 Then
secondo blocco di istruzioni
ElseIf espressione3 Then
terzo blocco di istruzioni
Else
ultimo blocco di istruzioni
End If

Con questa struttura, si cominciano a valutare le
espressioni in sequenza, iniziando dalla prima, quella
associata all'istruzione If e poi continuando con quelle
associate alle istruzioni ElseIf.
Appena si trova una espressione che risulta vera, si passa
ad eseguire il blocco di istruzioni corrispondenti.
Le successive espressioni non vengono più valutate,
perché l'esecuzione del programma riprende dopo End If.
Se nessuna delle espressioni risulta vera, entra in funzione
l'istruzione Else finale, cioè viene eseguito l'ultimo
blocco di istruzioni.
Ho indicato tre blocchi di istruzioni più l'ultimo, ma in
realtà se ne possono fare quanti se ne vuole, anche più
di tre.
Proviamo a fare qualche esempio.

If Numero > 10 Then
MsgBox "E' maggiore di 10"
ElseIf Numero > 20 Then
MsgBox "E' maggiore di 20"
ElseIf Numero > 30 Then
MsgBox "E' maggiore di 30"
Else
MsgBox "E' minore di 10"
End If

Che succede se eseguiamo questo blocco dopo aver assegnato
un valore alla variabile Numero?
Succede che ci accorgiamo di aver fatto una grossa
stupidaggine.
Come mai?
Supponiamo che il nostro numero sia 5.
La condizione del primo confronto
If Numero > 10 Then
non è soddisfatta, perché 5 non è maggiore di 10.
Allora si passa al secondo confronto: ElseIf Numero > 20
Then
non è soddisfatta nemmeno questa, perché 5 non è
maggiore di 20.
Allora si passa al terzo confronto: ElseIf Numero > 30 Then
non è soddisfatta nemmeno questa, perché 5 non è
maggiore di 30.
A questo punto siamo arrivati all'istruzione Else, il che
significa che, senza altri confronti, viene eseguito quello
che segue.
Perciò ci appare il messaggio che dice: "E' minore di
10".
Beh, giusto, no? 5 è minore di 10. Qualcuno forse lo nega?
Allora dove sta la stupidaggine?
Mah, forse non c'è. Ma proviamo con un altro numero.
Supponiamo adesso che il nostro numero sia 15.
La condizione del primo confronto
If Numero > 10 Then
è soddisfatta, perché 15 è maggiore di 10.
Quindi appare il messaggio che dice: "E' maggiore di 10"
gli altri confronti non vengono eseguiti, e si riprende dopo
End If.
Beh, fin qui sembra che funzioni, no? sta a vedere che non
c'è nessuna stupidaggine.
Adesso proviamo con 25.
La condizione del primo confronto
If Numero > 10 Then
è soddisfatta, perché 25 è maggiore di 10.
Quindi appare il messaggio che dice: "E' maggiore di 10"
gli altri confronti non vengono eseguiti, e si riprende dopo
End If.
Certo, è giusto, ma qualcosa non va. Che 25 è anche
maggiore di 20, non ce l'ha detto.
Siamo d'accordo che 25 è maggiore di 10, ma a me
interessava sapere che è maggiore di 20.
Eppure avevamo messo anche il secondo confronto, era così:
ElseIf Numero > 20 Then
MsgBox "E' maggiore di 20"
Allora come mai questo messaggio non è apparso?
Eh già, non poteva apparire, perché quel secondo
confronto non l'ha nemmeno eseguito, dato che il primo era
soddisfatto.
Ma allora, per qualunque numero maggiore di 10 succederà
sempre la stessa cosa. Gli altri confronti, quindi, sono
inutili, è come se non ci fossero.
Eccola, la stupidaggine.
Forse se invertiamo l'ordine dei confronti funziona meglio.
Proviamo così:

If Numero > 30 Then
MsgBox "E' maggiore di 30"
ElseIf Numero > 20 Then
MsgBox "E' maggiore di 20"
ElseIf Numero > 10 Then
MsgBox "E' maggiore di 10"
Else
MsgBox "E' minore di 10"
End If

Adesso si che funziona. Provo con 5, mi dice "E' minore di
10".
Provo con 15, mi dice "E' maggiore di 10"
Provo con 25, mi dice "E' maggiore di 20"
Provo con 35, mi dice "E' maggiore di 30".

Insomma, anche questa dei blocchi If - End If con le
istruzioni ElseIf è una struttura molto potente che ci
offre molte possibilità, ma come sempre dobbiamo fare
attenzione a comprenderla e concepirla bene, altrimenti
rischiamo di prendere delle cantonate.

Alessandro Pannocchi
Confronto di numeri entro un intervallo.

Ecco, con la nuova istruzione Elseif, come viene ad essere semplificato l'esercizio che avevo proposto prima. come si può notare, dalle due If nidificate di cui consisteva il confronto, siamo passati ad una sola, con l'aggiunta al suo interno di un ElseIf. rimane ancora l'If esterno, che però serve non per il confronto vero e proprio, ma per verificare che sia stato immesso un valore.

Option Explicit
Const spaz = " ", Vuota = "", Max = 5000, Min = 500

Dim Cifra

Cifra = InputBox("immetti un numero ")

If Not Cifra = vuota then
'Se è stato immesso un numero
Cifra = CSng(Cifra)
' converte la variabile ottenuta da InputBox in numero a singola precisione
If Cifra > Max Then
MsgBox "Il numero " & Cifra & " è superiore al massimo ammesso."

elseIf Cifra => Min Then
MsgBox "Il numero " & Cifra & " è compreso nell'intervallo ammesso."
Else
MsgBox "Il numero " & Cifra & " è inferiore al valore minimo ammesso"
End If

Else 'cioè se non è stato immesso alcun numero
MsgBox "Non hai immesso nessun numero."
End If

Come funziona?
se il numero è maggiore del limite massimo, il programma avverte e non esegue le istruzioni successive, diventate inutili.
Se non lo è, passa ad eseguire l'istruzione vincolata alla condizione imposta da ElseIf, cioè se il numero è uguale o maggiore al minimo ammesso. Se questa condizione risulta vera, vuol dire che il numero inserito è compreso nell'intervallo, perchè non è maggiore del massimo, ma è uguale o maggiore al minimo.
Se neppure questa condizione è verificata, si passa ad eseguire l'istruzione subordinata ad Else, si dice cioè che il numero è inferiore al minimo ammesso, che poi è l'ultima probabilità che restava.
Speriamo di essere stato chiaro.

***
Giovanni taverna.

----- Original Message -----
Da : "Giovanni Taverna"
Vorrei anche aggiungere istruzioni per risposta in bianco
ma ho il dubbio che occorra tornare agli incistati.
Risposta:
No, è sufficiente aggiungere un'altra condizione ElseIf
prima dell'istruzione Else che conclude ognuno dei blocchi.
Del tipo:

ElseIf Quiz1 = "" Then
Msgbox "Gnente da dir? Poareto, ti se propri ignorante,
ciò!"
Else

OPTION EXPLICIT
Const rispa1= "Garibaldi", rispa2= "garibaldi",
rispb1=
"Mazzini", rispb2=
"mazzini"
Dim quiz1, quiz2
Quiz1 = inputbox (" Chi andò in pensione a Caprera?")
If strcomp (quiz1, rispa1, 0)=0 then
msgbox " L'è propri lù " & rispa1 & "!"
Elseif strcomp (quiz1, rispa2,0)= 0 then
Msgbox " Uei, bauscia! " & rispa2 &" el se scriv cun la
maiuscula"
Else
Msgbox " ma va là , babala, ti se propri nient!"
end if
Quiz2= inputbox(" Chi stufava con la Giovane Italia?")
If strcomp ( quiz2, rispb1, 0) = 0 then
msgbox" Ti ghè ciapà!"
Elseif strcomp ( quiz2, rispb2, 1) = 0 then
msgbox "Uei, pirla, e la miuscula? "
Else
Msgbox" Ma turna a scola kle mei!"
end if

Vorrei anche aggiungere istruzioni per risposta in bianco
ma ho il dubbio che occorra tornare agli incistati.
Risposta:
Guido Ruggeri.
No, è sufficiente aggiungere un'altra condizione ElseIf
prima dell'istruzione Else che conclude ognuno dei blocchi.
Del tipo:

ElseIf Quiz1 = "" Then
Msgbox "Gnente da dir? Poareto, ti se propri ignorante,
ciò!"
Else

OPTION EXPLICIT
Const rispa1= "Garibaldi", rispa2= "garibaldi",
rispb1=
"Mazzini", rispb2=
"mazzini"
Dim quiz1, quiz2
Quiz1 = inputbox (" Chi andò in pensione a Caprera?")
If strcomp (quiz1, rispa1, 0)=0 then
msgbox " L'è propri lù " & rispa1 & "!"
Elseif strcomp (quiz1, rispa2,0)= 0 then
Msgbox " Uei, bauscia! " & rispa2 &" el se scriv cun la
maiuscula"
Else
Msgbox " ma va là , babala, ti se propri nient!"
end if
Quiz2= inputbox(" Chi stufava con la Giovane Italia?")
If strcomp ( quiz2, rispb1, 0) = 0 then
msgbox" Ti ghè ciapà!"
Elseif strcomp ( quiz2, rispb2, 1) = 0 then
msgbox "Uei, pirla, e la miuscula? "
Else
Msgbox" Ma turna a scola kle mei!"
end if

Giovanni Taverna.

h. 01; E ci ho messo 2 ore... se dovessi scrivere un programma vero, mah!
Cmq ora distingue maiuscole, minuscole, risposte saltate e risposte errate.

OPTION EXPLICIT
Const rispa1= "Garibaldi", rispa2= "garibaldi", rispb1= "Mazzini", rispb2=
"mazzini"
const vuota= ""
Dim quiz1, quiz2
Quiz1 = inputbox (" Chi andò in pensione a Caprera?")
If strcomp (quiz1, rispa1, 0)=0 then
msgbox " L'è propri lù " & rispa1 & "!"
Elseif strcomp (quiz1, rispa2,0)= 0 then
Msgbox " Uei, bauscia! " & rispa2 &" el se scriv cun la maiuscula"
Elseif quiz1 = vuota then
msgbox " Ghe da scriv quaicoss"
Else
Msgbox " ma va là , babala, ti se propri nient!"
end if
Quiz2= inputbox(" Chi stufava con la Giovane Italia?")
If strcomp ( quiz2, rispb1, 0) = 0 then
msgbox" Ti ghè ciapà!"
Elseif strcomp ( quiz2, rispb2, 1) = 0 then
msgbox "Uei, pirla, e la maiuscula? "
Elseif quiz2 = vuota then
msgbox " Ghe da scriv quaicoss"
Else
Msgbox" Ma turna a scola kle mei!"
end if