- presentazione del sito
- Registrazione
- Eventi, mostre, convegni ed iniziative segnalate dalle aziende
- Recensioni ed articoli
- Le Mailing Lists
- La rivista Pc Ciechi
- Wiki
- Chi siamo
- Donazioni
- Un progetto degno di nota: Wintalbra
- Come navigare in questo sito
- rss
- Bancomat Accessibili sul territorio nazionale
- Contattaci
- I sostenitori di SpazioAusili
Corso vbs\Istruzioni condizionali
Guido Ruggeri su winguidotecnica, 11\01\2010, h. 13.06.
Se siete pronti, allora cominciamo a parlare delle
istruzioni condizionali.
Ne ho appena enunciata una.
Ragioniamo un po' su quello che ho scritto: c'è una prima
proposizione, "se siete pronti", che esprime una condizione.
Poi ce n'è una seconda, "allora cominciamo a parlare delle
istruzioni condizionali".
Questa esprime una azione da eseguire nel caso in cui la
condizione, espressa nella prima proposizione, risultasse
vera.
La parola "se" è quella che introduce la prima
proposizione, mentre la parola "allora" è quella che
introduce la seconda.
Bene. Una volta compreso questo concetto, cari amici,
abbiamo tutto il mondo della programmazione nelle nostre
mani.
Solo che, dato che programmando dobbiamo scrivere in
inglese, le due parole, se e allora, diventano: If e Then.
If, due lettere: I come Imperia e F come Firenze.
Then, quattro lettere: T come Torino, H come Hotel, E come
Empoli, N come Napoli.
Adesso mettiamo mano al nostro VBScript e proviamo a
scrivere un semplice programmino, di due sole righe.
Scriviamo così:
Ed ora, un po' di pubblicità
:If True Then MsgBox "Eseguita istruzione condizionale"
MsgBox "Programma concluso"
Come al solito, salviamolo in un file .vbs ed eseguiamolo.
Otterremo due finestre con i due messaggi. La stessa cosa,
cioè, che avremmo ottenuto anche se, nella prima riga,
avessimo scritto direttamente MsgBox, senza farlo precedere
da If True Then.
Adesso modifichiamo la prima riga, scrivendo False anziché
True.
If False Then MsgBox "Eseguita istruzione condizionale"
MsgBox "Programma concluso"
Salviamo ed eseguiamo.
Cosa succede? Che otteniamo soltanto il secondo messaggio,
quello che ci dice "Programma concluso".
La prima riga è come se non ci fosse, non ha prodotto
nessun effetto.
Quindi sembrerebbe di capire che If True Then abbia il
potere di abilitare quella parte di riga che viene dopo la
parola Then.
Mentre invece If False Then ha il potere di disabilitare la
parte di riga dopo Then.
Interessante, no?
Eh, già, perché True e False, ormai lo sappiamo, sono
due costanti mnemoniche che rappresentano valori numerici
booleani, corrispondenti a meno 1 e 0.
Quindi sembra di capire che tra If e Then ci debba stare
qualcosa di booleano, cioè qualcosa che possa valere vero
o falso. Se è vero, la parte di riga che sta dopo Then
viene eseguita, se è falso viene disabilitata.
Allora potrebbe starci anche una qualsiasi variabile
booleana.
Proviamo a riscrivere il programma in tre righe, questa
volta introducendo una variabile booleana che chiameremo
Condizione.
Condizione = True
If Condizione Then MsgBox "Eseguita istruzione condizionale"
MsgBox "Programma concluso"
Naturalmente si può fare anche la variante con Condizione
= False, e funziona come prima: quando mettiamo Condizione
= True, le finestre con i messaggi appaiono entrambe,
invece quando mettiamo Condizione = False il primo
messaggio non appare.
Quindi, ciò che sta tra If e Then può essere un
qualsiasi booleano.
Non dimentichiamo, però, quello che abbiamo detto nelle
ultime lezioni, cioè che si possono fare confronti che
danno, come risultato, un valore booleano: True se il
confronto è verificato, False se non lo è.
Non sarà che, abbinando istruzioni condizionali e
confronti, arriviamo ad avere in mano potenti strumenti che
ci permettono di fare quello che ci eravamo riproposti tempo
fa, cioè indirizzare il programma in modo che, a seconda
delle circostanze, esegua o non esegua certe istruzioni?
Se fosse così, sarebbe una prospettiva molto allettante.
***
istruzioni condizionali-lezione 19-esercizio 7.
Proviamo ad applicare il concetto di istruzioni condizionali
all'esercizio che era stato proposto qualche giorno fa da
Aniceto.
Ricordate? Iniziava con due assegnazioni di stringhe:
s1 = InputBox("L'eroe dei due mondi")
s2 = "Garibaldi"
e poi faceva il confronto.
Adesso proviamo a scriverlo così:
s1 = InputBox("L'eroe dei due mondi")
s2 = "Garibaldi"
If s1 = s2 Then MsgBox "Risposta esatta: " & s2
If s1 <> s2 Then MsgBox "La risposta: " & s1 & ", è
errata"
Salvare su file .vbs, eseguire, e provare più volte con
varie risposte.
Alessandro Ricotta.
L'esercizio 7, come è stato scritto, riconosce solo come risposta valida
Garibaldi scritto con la G maiuscola, perchè se l'utente prova a
scriverlo con la G minuscola, la risposta viene considerata errata anche
se il nome è giusto.
L'esercizio potrebbe essere corretto eseguendo un confronto di tipo
testuale.
Ecco la modifica:
s1 = InputBox("L'eroe dei due mondi")
s2 = "Garibaldi"
If STRComp(s1, s2, 1) = 0 then MSGBox "Risposta esatta: " & s2
if STRComp(s1, s2, 1) then MSGBox "La risposta " & s1 & " è errata"
In questo modo, anche se l'utente scrive "garibaldi", la risposta viene
considerata ugualmente esatta.
Da notare che, poichè la funzione STRComp, in caso le due stringhe
passate come parametri risultano uguali, restituisce come valore 0 e
poichè l'istruzione condizionale IF invece esegue il comando dopo la
parola then solo se la condizione è vera, cioè un valore diverso da 0,
bisogna per forza, nella prima istruzione IF che valuta un confronto di
uguaglianza, invertire il valore restituito da STRComp e questo si può
fare in due modi:
o scrivere: if STRComp(s1, s2, 1) = 0 then ...
oppure: if not STRComp(s1, s2, 1) then ...
Correggimi per favore Guido se sbaglio.
Guido Ruggeri.
Nulla da correggere!
Alessandro Pannocchi.
per l'esercizio 7, si può fare anche così:
risp = InputBox("Cognome del primo cosmonauta: ")
giusta = "Gagarin"
controllo = StrComp(risp, giusta, 1) = 0
if controllo = true then msgbox "Bravo, hai risposto esattamente."
if controllo = false then msgbox "Risposta errata."
Ci sarebbe un modo ancora più elegante, ma ...... ci tengo alla pelle.......
d.
copiato, salvato e partito: da errore
> di scrittura codice, . Accade solo a me?
Risposta:
Ma non dovete copiare da quello che scrivo io. Dovete
capirne la logica, e poi rifarlo.
d.
> poter scrivere garibaldi sia maiuscolo che minuscolo: il
> primo if da risposta corretta ma il secondo continua a
> dare risposta errata... dove sbaglio?
Risposta:
L'errore sta nell'aver usato StrComp per fare un confronto
tra numeri, anziché tra stringhe.
Quarda bene quello che hai scritto e ti accorgerai che è
così.
s1 = InputBox("L'eroe dei due mondi")
s2 = "Garibaldi"
If strcomp(s1 = s2,0) Then MsgBox "Risposta esatta"
If strcomp(s1 <> s2,0) Then MsgBox "La risposta: " & s1 & ",
è errata"
Consideriamo ad esempio la tua terza riga.
E' questa:
If strcomp(s1 = s2,0) Then MsgBox "Risposta esatta"
Hai scritto StrComp con due argomenti, omettendo il terzo il
che significa che stai facendo un confronto binario.
Qual è il tuo primo argomento di StrComp?
E' s1 = s2, cioè il risultato del confronto di
uguaglianza tra s1 ed s2.
E il risultato di un confronto, lo sappiamo, è un valore
booleano che può valere True oppure False.
Qual è il tuo secondo argomento di StrComp?
E' il numero 0.
Quindi stai usando StrComp per confrontare due numeri: il
primo è un booleano, il secondo è 0.
Per StrComp, funzione concepita per confontare due stringhe,
sono due cose che non sarenno mai uguali.
Perciò strcomp(s1 = s2,0) non darà mai 0. Non
dimentichiamo, infatti, che quando usiamo StrComp 0 vuol
dire uguaglianza.
Quindi strcomp(s1 = s2,0) restituirà sempre un valore
non nullo.
Di conseguenza, l'istruzione che segue If strcomp(s1 =
s2,0) Then sarà sempre eseguita.
Nel tuo caso, significa the, indipendentemente da quello che
l'utente scriverà come risposta, il messaggio "Risposta
esatta" apparirà sempre.
Cioè, è come se nella terza riga tu avessi scritto:
If True Then MsgBox "Risposta esatta"
Analogo discorso per la quarta riga.
Alessandro Ricotta.
a me lo script funziona sia quando Scrivo "Garibaldi" con la G
maiuscola, sia quando lo scrivo con la G minuscola.
Comunque riinvio l'esercizio con una piccola correzione:
s1 = InputBox("L'eroe dei due mondi")
s2 = "Garibaldi"
If STRComp(s1, s2, 1) = 0 then MSGBox "Risposta esatta: " & s2
if STRComp(s1, s2, 1) <> 0 then MSGBox "La risposta " & s1 & " è errata"
In pratica dico all'interprete:
interprete mio bello, se la funzione STRComp durante il confronto
testuale delle variabili "s1" ed "s2" restituisce un valore pari a 0 (in
pratica quando le due stringhe risultano identiche in un confronto
testuale) allora notifica pure all'utente che la risposta immessa è esatta;
se il valore restituito dalla funzione STRComp è minore o maggiore di 0
(se le variabili "s1" ed "s2" risultano diverse in un confronto
testuale) allora avverti l'utente con un messaggio d'errore.
Guido Ruggeri.
Se la piccola correzione consiste nell'aver aggiunto, nella
quarta riga, la disuguaglianza da zero, allora posso dirti
che è superflua.
Cioè: scrivere
if STRComp(s1, s2, 1) then
oppure:
if STRComp(s1, s2, 1) <> 0 then
non fa differenza.
Infatti l'operatore If già, di per sé, valuta se ciò
che si trova tra lui e then è uguale o diverso da zero.
Nel caso di StrComp, che restituisce un valore numerico che
può valere 0 oppure meno 1 oppure 1, in questo caso non
serve altro.
d.
S1= csng( inputbox("primo numero"))
S2= csng(inputbox ("secondo numero"))
If S1=S2 Then msgbox "i due numeri sono uguali"
If S1 < >S2 Then msgbox "i due numeri sono diversi"
> Neppure questo va...
Guido Ruggeri.
Nella quarta riga c'è uno spazio di troppo tra il simbolo
di minore e quello di maggiore.
Finché parliamo degli spazi tra i valori e gli operatori,
quelli l'interprete li ignora.
Ma l'operatore per il confronto di disuguaglianza deve
essere minore seguito da maggiore. Se ci metti uno spazio in
mezzo, l'operatore non è più quello.
d.
Il nome delle variabili definite vanno sempre fra
virgolette,
Risposta:
Assolutamente mai!
Tra virgolette vanno soltanto i valori di stringa.
Messaggio originale:
per indicare che stiamo scrivendo un a variabile, dobbiamo
mettere sempre prima il segno =
Risposta:
Assolutamente mai!
Il segno di uguale è l'operatore per le istruzioni di
assegnazione.
Inoltre, è anche l'operatore per i confronti di
uguaglianza.
Messaggio originale:
quando si devono mettere i :
Risposta:
Dei due punti non ne abbiamo ancora mai parlato. Perché
quindi ti poni il problema?
Messaggio originale:
, e quando sì e quando no gli spazi in bianco
(per queste due cose, la regola non l'ho capita).
Risposta:
Non c'è nessuna regola, VBScript ignora gli spazi in
eccesso.
Messaggio originale:
potresti farci un riepilogo così. In fin dei conti, la
programmazione non è altro che una lingua in più, e
quindi
, pernso che queste regole siano fondamentali per capirne
di più la logica.
Risposta:
In un codice sorgente VBScript abbiamo una seguenza di
istruzioni, che l'interprete esegue una dopo l'altra.
Di norma, ogni istruzione occupa una riga, anche se può
anche non essere così, cioè è anche possibile mettere
più istruzioni nella stessa riga, ma di questo non abbiamo
ancora parlato perciò lasciamolo stare.
Ogni istruzione fa uso di operatori, che sono costituiti da
simboli o parole riservate del linguaggio.
Inoltre, nel codice sorgente compaiono valori, variabili e
costanti.
Per i valori, vale la regola: se sono stringhe, devono
essere racchiusi tra virgolette. Altrimenti sono numeri.
I nomi delle variabili e delle costanti devono sempre essere
scritti senza virgolette. I nomi di variabili e di costanti
possono contenere solo lettere o numeri, esclusi quindi gli
spazi e gli altri segni vari. Inoltre devono iniziare con
una lettera, mai con un numero.
Poi ci sono le chiamate alle routine.
Anche per i nomi delle routine vale la stessa regola: solo
lettere e numeri, e inizio con una lettera.
Quindi, recapitolando:
In VBScript, se incontriamo una parola che è compresa tra
virgolette, è un valore di tipo stringa.
Se incontriamo una parola che non è compresa tra
virgolette, ma è fatta di caratteri numerici, è un
valore di tipo numero.
Tutto il resto, cioè qualsiasi parola che non inizi con un
numero e che non sia compresa tra virgolette, rientra negli
altri possibili casi: operatore, nome di variabile, nome di
costante, nome di routine.
L'operazione più semplice è quella di assegnazione. Con
quella, assegnamo ad una stringa un valore.
L'assegnazione si fa usando, come operatore, il simbolo di
uguale.
La variabile va posta a sinistra del simbolo di uguale.
Il valore, oppure l'espressione che lo restituisce, va posto
a destra del simbolo di uguale.
Esempio:
Cognome = "Ruggeri"
con questa istruzione, ho assegnato il valore di stringa
Ruggeri alla variabile Cognome.
Altro esempio:
Anni = 48
con questa istruzione, ho assegnato il valore numerico 48
alla variabile Anni.
Altro esempio ancora:
Nominativo = "Guido" & " " & "Ruggeri"
con questa istruzione, ho assegnato alla variabile
nominativo il risultato di una espressione, che consiste nel
concatenamento di tre stringhe.
Altro esempio ancora:
Area = 15 * 20
con questa istruzione, ho assegnato alla variabile Area il
risultato di una espressione, che consiste nella
moltiplicazione di due numeri.
Tutto qui. Qualsiasi altra cosa, è frutto di fantasie,
incubi o cattiva digestione.
d.
> Dei due punti non ne abbiamo ancora mai parlato. Perché
> quindi ti poni il problema?
> Risposta: Invece, ne abbiamo parlato (sono comparsi)
> quando abbiamo parlato della funzione Inputbox, ad esempio
> , nell'esercizio 4. Ai miei dubbi, aggiungo anche l'uso
> dei parentesi... Maria
r.
Smentisco di aver mai parlato dei due punti.
Quanto alle parentesi, si usano per racchiudere l'insieme
degli argomenti nelle chiamate alle funzioni.
Ad esempio: la funzione InputBox ormai la conosciamo per
averla usata più volte.
Quando la chiamiamo, InputBox vuole obbligatoriamente, come
primo argomento, la stringa di richiesta che dovrà
apparire all'utente nella finestra, insieme al campo dove
l'utente dovrà scrivere.
Perciò, supponendo di aver già definito una tale stringa
nella variabile Richiesta, la sintassi di una chiamata a
InputBox è:
Risposta = InputBox(Richiesta)
cioè la variabile Richiesta, in quanto argomento da
passare nella chiamata a InputBox, deve essere messa tra
parentesi.
Nel caso in cui gli argomenti da passare siano più di uno,
devono essere messi, tutti insieme, tra parentesi, e
separati tra di loro mediante virgole.
Facciamo, come esempio, una chiamata a StrComp con due
stringhe S1 e S2:
Confronto = StrComp(S1,S2)
Quando invece chiamiamo una procedura, anziché una
funzione, gli argomenti non devono essere messi tra
parentesi.
Ad esempio, nelle chiamate a MsgBox le parentesi non
servono.
Infatti, se ho assegnato un messaggio qualsiasi alla
variabile Frase, per farla apparire devo scrivere:
MsgBox Frase
Le parentesi, in questo caso non servono, perché MsgBox
viene usata non come una funzione, ma come una procedura.
Cioè: la chiamiamo perché faccia quello che deve fare al
suo interno, non ci interessa che poi ci restituisca
qualcosa.