Salta al contenuto principale

Corso vbs\Istruzioni condizionali-terza parte

Guido Ruggerui su winguidotecnica, 12\01\2010, h. 23.06.

Dato che ormai è trapelato, tanto vale venire al sodo.
Un'istruzione condizionale può essere completata anche
indicando, sempre in unica riga, l'istruzione alternativa da
eseguire se la condizione risulta falsa.
La parola che separa l'istruzione alternativa dal resto è:
Else, che in inglese significa: altrimenti.
Quindi il nostro costrutto è:

Ed ora, un po' di pubblicità

:

If Condizione Then Istruzione Else IstruzioneAlternativa

Se Condizione è True, viene abilitata l'istruzione che si
trova compresa tra Then ed Else.
Se invece Condizione è valse, viene abilitata l'istruzione
che si trova dopo Else.
In ogni caso, la valutazione di Condizione avviene una sola
volta.

Nel caso dell'esercizio 7, le ultime due righe possono
così essere sostituite da un'unica riga:

If s1 = s2 Then MsgBox "Risposta esatta: " & s2 Else
MsgBox "La risposta: " & s1 & ", è errata"

In questo modo il confronto tra le stringhe s1 ed s2 viene
eseguito una volta sola.
Ma ora cominciamo a parlare anche di istruzioni condizionali
scritte in blocchi di più righe.
Eh già, perché mettere tutto su un'unica riga rimarrebbe
limitato: se la condizione è vera possiamo abilitare una
sola istruzione, e al massimo un'altra se la condizione è
falsa.
Esaminiamo invece quest'altro costrutto che, si badi bene,
è scritto su più righe:

If Condizione Then
Istruzione1
Istruzione2
...eccetera...
IstruzioneUltima
End If

Qui succede qualcosa di interessante.
Succede che sto dicendo al programma di eseguire, in
conseguenza della condizione vera, una serie di istruzioni,
che può essere lunga quanto ci pare.
A differenza di prima, dopo la parola Then si va a capo.
Quindi incomincia la serie di istruzioni, da eseguire, una
dopo l'altra, solo se la condizione è vera.
Quando finisce quella serie? Quando si incontra la apposita
dicitura End If.
End If significa: fine del se.
Vale a dire: ecco, ho scritto tutto quello che voglio che
fai se l'istruzione è vera. Adesso ho finito.
Dopo End If, riprende il normale flusso del programma,
cioè possono esserci altre istruzioni che saranno eseguite
comunque, sia se la condizione è vera sia se è falsa.
Finché scrivevamo tutto in un'unica riga, non si doveva
scrivere End If perché non c'era bisogno, la fine delle
istruzioni era rappresentata dalla fine stessa della riga.
Adesso invece che scriviamo su più righe, c'è bisogno di
qualcosa che indichi all'interprete dov'è che quelle
istruzioni finiscono.
Se vi sembra difficile, non lamentatevi troppo. Quando
parleremo di JavaScript, vedremo che lì non ci sono le
parole Then e End If, ma i blocchi di istruzioni devono
essere racchiusi tra parentesi graffe. Quelle si, le
parentesi graffe aperte e chiuse, che confondono le idee.
Proviamo allora a perfezionare il nostro esercizio 7, in
questo modo:

s1 = InputBox("L'eroe dei due mondi")
s2 = "Garibaldi"
If s1 = s2 Then
MsgBox "Risposta esatta: " & s2
MsgBox "Infatti Garibaldi è passato alla storia per le
imprese militari compiute in Europa e in America Latina"
End If
If s1 <> s2 Then MsgBox "La risposta: " & s1 & ", è
errata"

Naturalmente, in questo costrutto si può inserire anche la
parola Else, seguita dalle istruzioni alternative.
Cioè:

If Condizione Then
Istruzione1
Istruzione2
...eccetera...
IstruzioneUltima
Else
IstruzioneAlternativa1
IstruzioneAlternativa2
...eccetera...
IstruzioneAlternativaUltima
End If

Anche la parola Else, quindi, deve stare in una riga
separata.
Proviamo allora a riscrivere ancora l'esercizio 7:

s1 = InputBox("L'eroe dei due mondi")
s2 = "Garibaldi"
If s1 = s2 Then
MsgBox "Risposta esatta: " & s2
MsgBox "Infatti Garibaldi è passato alla storia per le
imprese militari compiute in Europa e in America Latina"
Else
MsgBox "La risposta: " & s1 & ", è errata"
MsgBox "Invece la risposta giusta è: " & s2
MsgBox "Possibile che non hai mai sentito parlare di
Garibaldi?" & vbCr & "Ignorante che non sei altro, dovresti
tornare a scuola e ricominciare dalla prima elementare!"
End If

***
d.

innanzitutto ti faccio i complimenti per come
> stai gestendo il corso! Ho provato a riscrivere
> l'esercizio 8 (quello con if else) e volevo fare due
> appunti. 1: Per chi riscontrava errori copiando altri
> esercizi, in effetti è così. Facendo copia e incolla
su
> blocco note il programma fa dei ritorni a capo dove non
> dovrebbe e allora manda in errore il compilatore. Per
> questo è molto meglio riscrivere a mano anche perché
così
> si interiorizza l'esercizio. 2. Ascoltare il compilatore.
> Egli, è come un nostro amico, e quindi leggere i
messaggi
> d'errore e provare a correggerli è forse una tra le cose
> più avvincenti della programmazione. Quando ho scritto
> l'esercizio a mano, ad esempio, dimenticavo parentesi o
> degli e commerciale, e proprio osservando gli errori del
> compilatore si riesce ad autocorreggersi. Ho fatto quindi
> anch'io il programmino con if else che ti copio, ma vorrei
> chiedere se si può fare un'aggiunta. Ho provato ad
> aggiungerla io ma mi dà errore . Avevo provato ad
> aggiungere oltrela variabile s2 = "Garibaldi", anche s3
=
> "Garibaldi" So che esiste un altro modo per renderlo più
> tollerante verso maiuscole e minuscole. Ma volevo chiedere
> come aggiungere un altro if ad es
> s2 = "Garibaldi"
> s3 = "garibaldi"
> If s1 = s2 Then
> MsgBox "Bravo!" &Vbcr
> Msgbox "Infatti la risposta è proprio " & S2 & "!"
> If s1 = s3 then
> Msgbox "Bravo, ma i nomi propri cominciano sempre con la
> maiuscola!" La ringrazio per un suo chiarimento e le copio
> qui l'esercizio da me svolto.
>
> s1= InputBox ("L'eroe dei due mondi:")
> s2 = "Garibaldi"
> If s1 = s2 Then
> MsgBox "Bravo!" &Vbcr
> Msgbox "Infatti la risposta è proprio " & S2 & "!"
> Else
> Msgbox "Asinaccio!" &Vbcr
> Msgbox "La risposta non è " &S1 & "!"
> End If

r.

In questo caso, l'errore sta semplicemente nel non aver
chiuso i due bocchi If con le corrispondenti istruzioni di
chiusura End If.
Quindi il tuo esercizio va corretto così:

s2 = "Garibaldi"
s3 = "garibaldi"
If s1 = s2 Then
MsgBox "Bravo!"
Msgbox "Infatti la risposta è proprio " & S2 & "!"
End If
If s1 = s3 Then
Msgbox "Bravo, ma i nomi propri cominciano sempre con la
maiuscola!"
End If

In aternativa, le ultime tre righe, trattandosi di un'unica
istruzione eseguibile, si possono anche ridurre ad una sola,
facendo così a meno di scrivere End If. Ma deve stare
tutto in una riga:

If s1 = s3 Then Msgbox "Bravo, ma i nomi propri cominciano
sempre con la maiuscola!"

***
Varo Landi

nel fare prove ho messo una domanda alla
quinta riga ,ma ,poi mi sono ritrovato con la domanda in
prima riga ... cosa significa ? allego l'esercizio ,ciao
,varo.

msgbox "posso aggiungere altre cose?"
if true then msgbox "eseguita istruzione condizionale"
msgbox "programma concluso"
msgbox "passa alla riga 4"
msgbox "programma concluso"
msgbox "altra finestra"

riccardo Sisti.
nel tuo programma se la condizione è vera, vengono
eseguite le successive quattro istruzioni nell'ordine da
te indicato.
Guido Ruggeri.
Risposta:
Non è esatto.
In realtà il programma di Varo è fatto di 6 istruzioni,
ognuna con una chiamata a MsgBox.
Vengono eseguite tutte e 6 indistinatmente.
Infatti l'unica istruzione condizionale è nella seconda
riga, ma la condizione è if true then, per cui è sempre
verificata.
Quello che dice Richi invece sarebbe corretto se Varo avesse
fatto un blocco del tipo If - End If, cioè spezzando la
seconda riga e aggiungendo End If alla fine.
Così:

msgbox "posso aggiungere altre cose?"
if true then
msgbox "eseguita istruzione condizionale"
msgbox "programma concluso"
msgbox "passa alla riga 4"
msgbox "programma concluso"
msgbox "altra finestra"
End If

Non sarebbe comunque cambiato nulla, perché mettendo come
condizione If True Then, cioè una condizione che è
sempre verificata, il risultato sarà sempre e comunque lo
stesso: appariranno sempre indistintamente tutti e 6 i
messaggi.

d.

ho corretto l'esercizio come da te indicato ma
> dà un problema. Se si mette la risposta Garibaldi in
> maiuscolo da due risposte, sia risposta esatta e sia
> quella in cui dico asino, la risposta è errata. Ecco il
> programma: s1= InputBox ("L'eroe dei due mondi:")
> s2 = "Garibaldi"
> s3 = "garibaldi" 'per ora variabile inutilizzata'
> If s1 = s2 Then
> MsgBox "Bravo!" &Vbcr
> Msgbox "Infatti la risposta è proprio " & S2 & "!"
> End If
> If s1 = s3 then
> Msgbox "Bravo! Ma i nomi propri cominciano sempre per
> lettera maiuscola!" Else
> Msgbox "Asinaccio!" &Vbcr
> Msgbox "La risposta non è " &S1 & "!"
> End If
>
> Ho provato a mettere gli end if in varie posizioni, ma non
> sono mai riuscito a farlo andare in modo soddisfacente.
> L'unico modo con cui sono riuscito a risolverlo è
> introducendo Else If, di cui non si è ancora parlato per
> cui lo accenno solo. Grazie!
r.
Guido Ruggeri.

Anche senza introdurre ElseIf, possiamo cavarcela tenendo
conto che i blocchi If - End If li possiamo anche nidificare
tra di loro.
Cioè, un blocco If - End If ne può contenere altri al
suo interno.
Nota bene come ho riscritto il tuo esercizio.
Il tuo secondo blocco If - End If l'ho nidificato
all'interno della condizione Else del primo blocco.
Presta attenzione infatti alla chiusura finale con due End
If consecutivi.
Il primo End If chiude il secondo blocco, il secondo End If
chiude il primo blocco.
Questo significa che se la prima condizione è verificata,
cioè se s1 = s2, il secondo blocco non viene nemmeno
preso in considerazione, perché è tutto interno alla
condizione Else che non si attiva.
Perciò non c'è pericolo che scatti la condizione Else
del secondo blocco.

s1 = InputBox("L'eroe dei due mondi:")
s2 = "Garibaldi"
s3 = "garibaldi"
If s1 = s2 Then
MsgBox "Bravo!"
Msgbox "Infatti la risposta è proprio " & S2 & "!"
Else
If s1 = s3 then
Msgbox "Bravo! Ma i nomi propri cominciano sempre per
lettera maiuscola!"
Else
Msgbox "Asinaccio!" &Vbcr
Msgbox "La risposta non è " &S1 & "!"
End If
End If

Aniceto Fois

domanda = inputbox("chi ha comandato la Spedizione dei
Mille: Cavour, Garibaldi, Mazzini?")
risp1 = "Garibaldi"
risp2 = "Mazzini"
risp3 = "Cavour"
if domanda = risp1 then
msgbox "la risposta è esatta: " & risp1
Else
msgbox "la risposta " & risp2 & ", è sbagliata"
msgbox "infatti Mazzini è sempre un eroe del
Risorgimento italiano distintosi, però, per le sue idee
rivoluzionarie, per quei tempi, e per i tentativi di
coinvolgere i giovani nel Suo progetto"
End if
if domanda <> risp3 then
msgbox "la risposta " & risp3 & ", è sbagliata"
msgbox "cavour, infatti, è stato il primo ministro dello
Stato SardoPiemontese che con la sua politica ha contribuito
alla costituzione del Regno d'Italia e l'unificazione di
gran parte del territorio italiano"
End if

r.
Guido Ruggeri.

Io individuo due cose da cambiare.
Innanzitutto la condizione nell'undicesima riga:

if domanda <> risp3 then

Non deve essere una disuguaglianza, ma una uguaglianza,
perché tu vuoi prendere in considerazione il caso in cui
l'utente abbia risposto Cavour, non quelli in cui non abbia
risposto Cavour.
Infatti il messaggio che fai apparire è quello che spiega
perché la risposta Cavour non è giusta.
Quindi la condizione deve essere:

if domanda = risp3 then

Inoltre nella settima riga hai messo un Else a cui segue la
spiegazione del perché la risposta Mazzini è sbagliata.
Quell'Else si contrappone alla condizione della quarta riga:

if domanda = risp1 then

Ma se la risposta non è Garibaldi, è vero che può
essere Mazzini ma potrebbe anche essere Cavour.
Direi che, finché non avremo imparato a fare di meglio, in
un caso come questo ci conviene fare tre blocchi If - End If
separati, uno per ogni possibile risposta.
Così:

domanda = inputbox("chi ha comandato la Spedizione dei
Mille: Cavour, Garibaldi, Mazzini?")
risp1 = "Garibaldi"
risp2 = "Mazzini"
risp3 = "Cavour"
If domanda = risp1 then
msgbox "la risposta è esatta: " & risp1
End If
If domanda = risp2 Then
msgbox "la risposta " & risp2 & ", è sbagliata"
msgbox "infatti Mazzini è sempre un eroe del
Risorgimento italiano distintosi, però, per le sue idee
rivoluzionarie, per quei tempi, e per i tentativi di
coinvolgere i giovani nel Suo progetto"
End if
If domanda = risp3 then
msgbox "la risposta " & risp3 & ", è sbagliata"
msgbox "cavour, infatti, è stato il primo ministro dello
Stato SardoPiemontese che con la sua politica ha contribuito
alla costituzione del Regno d'Italia e l'unificazione di
gran parte del territorio italiano"
End if

Alessandro Ricotta.

Caro Aniceto,
l'esercizio non riesce perchè dopo aver inserito un blocco "if" che valuta il confronto tra la domanda e la risposta 1, tu inserisci un blocco "else" che, secondo l'interprete, deve scattare se la domanda non corrisponde alla prima risposta: ergo le istruzioni contenute nel blocco "else" vengono eseguite sia quando la risposta è "Mazzini", sia quando è "Cavour".
Nel secondo blocco "if" tu addirittura valuti se la domanda è diversa dalla terza risposta e quindi le istruzioni in esso contenute vengono eseguite se l'utente digita una delle prime due risposte e mai se la domanda corrisponde alla terza risposta.
L'esercizio potrebbe essere corretto ponendo due blocchi "if else" l'uno dentro l'altro e magari eseguendo un confronto di tipo testuale utilizzando la funzione "STRComp".

domanda = inputbox("chi ha comandato la Spedizione dei Mille: Cavour, Garibaldi, Mazzini?")
risp1 = "Garibaldi"
risp2 = "Mazzini"
risp3 = "Cavour"
if StrComp(domanda, risp1, VBTextCompare) = 0 then
msgbox "la risposta è esatta: " & risp1
Else
If STRComp(domanda, risp2, VBTextCompare) = 0 then
msgbox "la risposta " & risp2 & ", è sbagliata" & VBCRLF & "infatti Mazzini è sempre un eroe del Risorgimento italiano distintosi, però, per le sue idee rivoluzionarie, per quei tempi, e per i tentativi di coinvolgere i giovani nel Suo progetto"
else
msgbox "la risposta " & risp3 & ", è sbagliata" & VBCRLF & "cavour, infatti, è stato il primo ministro dello Stato SardoPiemontese che con la sua politica ha contribuito alla costituzione del Regno d'Italia e l'unificazione di gran parte del territorio italiano"
End if
End if

Si potrebbe pensare anche di fare in modo che il programma visualizzi un messaggio d'errore in caso l'utente digiti una risposta che non corrisponde a nessuno dei nomi proposti.
Quindi l'esercizio può essere a mio avviso migliorato inserendo tre blocchi "if else" anche essi l'uno dentro l'altro come scatole cinesi.

domanda = inputbox("chi ha comandato la Spedizione dei Mille: Cavour, Garibaldi, Mazzini?")
risp1 = "Garibaldi"
risp2 = "Mazzini"
risp3 = "Cavour"
if StrComp(domanda, risp1, VBTextCompare) = 0 then
msgbox "la risposta è esatta: " & risp1
Else
If STRComp(domanda, risp2, VBTextCompare) = 0 then
msgbox "la risposta " & risp2 & ", è sbagliata" & VBCRLF & "infatti Mazzini è sempre un eroe del Risorgimento italiano distintosi, però, per le sue idee rivoluzionarie, per quei tempi, e per i tentativi di coinvolgere i giovani nel Suo progetto"
else
If STRComp(domanda, risp3, VBTextCompare) then
MSGBox "Errore: devi scegliere tra le parole proposte nella domanda"
else
msgbox "la risposta " & risp3 & ", è sbagliata" & VBCRLF & "cavour, infatti, è stato il primo ministro dello Stato SardoPiemontese che con la sua politica ha contribuito alla costituzione del Regno d'Italia e l'unificazione di gran parte del territorio italiano"
End if
End if
end if

Nota come nel terzo blocco "if else" io valuto se la domanda è diversa e non uguale alla terza risposta (non dimentichiamo che se le stringhe da confrontare sono diverse, la funzione "STRComp" restituisce un valore diverso da 0 e quindi interpretato come vero): ergo, se la risposta è diversa da "Cavour", parte l'isttruzione contenuta nel blocco "if",, altrimenti parte quella contenuta nel blocco "else".