Salta al contenuto principale

Corso vbs\Istruzioni condizionali-seconda parte

Guido Ruggeri su winguidotecnica, 12\01\2010, h. 16.22.

Per ragionare un poco sull'esercizio 7, vi racconto una
storiella.
C'era una volta una coppia di coniugi.
Lui totalmente cieco, lei ipovedente.
Una sera, lui dice a lei:
"Cara, prima sono stato giù in cantina, ma non sono sicuro
se ho lasciato la luce accesa o spenta.
Perciò vorrei che tu scendessi giù a vedere se la luce
è accesa."
Lei scende in cantina, poi torna su e dice:
"No, la luce non è accesa."
Lui dice:
"Bene, cara. Adesso però vorrei che tu scendessi di nuovo
giù, a vedere se la luce è spenta."
Lei risponde:
"Certo che è spenta, ti ho appena detto che non è
accesa."
Lui:
"Si, però vorrei che tu andassi a vedere."
Lei:
"Cosa? ma se ci sono già andata!"
Lui:
"Sì, sei andata a vedere se la luce fosse accesa, però
adesso vorrei che tu ci tornassi per vedere se è spenta."
Lei:
"Beh, se non è accesa, allora è spenta, no?"
Lui:
"Si, però vorrei che tu andassi giù a controllarlo".
Lei:
"Ma tu sei completamente scemo! Ti ho detto che ci sono
già stata, ho visto che non è accesa, e adesso secondo
te dovrei tornare lì, scendere le scale e risalirle, per
andare a vedere se è spenta? Ma non ci penso nemmeno! Non
sto mica a fare su e giù per le tue fissazioni!"
La cosa sfociò in una lite coniugale, con conseguente
causa di separazione e richiesta di divorzio. E naturalmente
lei la vinse, perché nessun giudice ritenne fondato il
comportamento di lui.
Adesso, torniamo a noi e rivediamo un poco l'esercizio 7.
Nelle prime due righe, assegniamo due stringhe a s1 ed s2.
Poi, la terza e la quarta riga erano:

Ed ora, un po' di pubblicità

:

If s1 = s2 Then MsgBox "Risposta esatta"
If s1 <> s2 Then MsgBox "Risposta errata"

Non vi sembra che somigli un po' alla nostra storiella?
Infatti nella terza riga facciamo un confronto per vedere se
le due stringhe sono uguali.
Poi nella quarta riga ne facciamo un altro per vedere se le
due stringhe sono diverse.
Viene da pensare: se le stringhe non sono uguali, allora
sono diverse. Perché quindi dovremmo ripetere due volte il
confronto? Non potrebbe bastare una volta sola?
Nel nostro caso non si tratterebbe di un vero problema,
perché un semplice confronto tra due stringhe impegna
talmente poco il nostro processore che glielo potremmo far
ripetere quante volte vogliamo, all'utente la velocità del
programma apparirebbe sempre la stessa.
Ciò nonostante, dobbiamo abituarci ad ottimizzare il
nostro programma in modo da evitare, per quanto possibile,
inutili ripetizioni di operazioni già svolte.
Perché è vero che adesso stiamo facendo semplici
confronti tra stringhe. Ma supponiamo invece di dover
chiamare una routine che faccia qualcosa di molto più
complesso e lento, tipo collegarsi ad Internet per
verificare se in un certo server è presente un certo file.
Supponiamo che quella routine si chiami EsisteSuInternet, e
che sia fatta in modo da restituire True se il file nel
server è stato trovato, False se non è stato trovato.
E ora supponiamo di scrivere le seguenti due righe:

If EsisteSuInternet = True Then MsgBox "Il file è stato
trovato nel server"
If EsisteSuInternet = False Then MsgBox "Il file non è
stato trovato nel server"

Quando le andremo ad eseguire, è probabile che la funzione
EsisteSuInternet ci metta anche qualche decina di secondi,
prima di concludersi: infatti dovrà cercare un
collegamento ad Internet, quindi collegarsi ad un certo
server, e verificare se esiste un certo file.
Supponiamo che ci metta 10 secondi.
Noi però quella funzione la chiamiamo due volte, quindi i
secondi diventano 20.
Se la cosa succede frequentemente nel programma, vuol dire
che stiamo facendo un programma che all'utente appare
pesantemente lento, quando forse organizzandolo meglio
potremmo fare in modo che basti chiamare quella funzione una
volta sola, e così dimezzeremmo i tempi.
Nel caso dei confronti tra stringhe, è vero che per
l'utente la differenza sarebbe impercettibile, ma è anche
vero che quando un programma comincia a diventare complesso
e fatto da migliaia di istruzioni, ogni dettaglio che si
riesce ad ottimizzare concorre a rendere il programma più
performante.
In definitiva, direi che ci vorrebbe un modo migliore per
organizzare le nostre istruzioni condizionali, rispetto a
come abbiamo fatto nell'esercizio 7.
Non vi viene in mente nulla?

d.

L'errore deriva dall'aver scritto male la costante
VbTextCompare.
Infatti, in due casi su 4, hai scritto VbTexCompare, senza
la t dopo la x.
In questo modo, StrComp non riceve la costante
VbTextCompare, ma una variabile VbTexCompare che, non
essendo mai stata assegnata, considera come se valesse 0.
Perciò esegue un confronto binario anziché testuale.
Allora, dato che il confronto prima è binario, e poi il
confronto opposto è testuale, ci possono essere dei casi
che sfuggono, e per quelli non appare nessun messaggio.
Almeno per quando riguarda Garibaldi, mentre, per quanto
riguarda 1945, essendo una stringa numerica non c'è
differenza tra confronto binario e testuale.
A questo punto vi starete chiedendo: ma ci sono dei modi per
avere un maggiore controllo su quello che stiamo scrivendo,
in modo che quando si fanno errori di scrittura almeno sia
possibile accorgersene?
La risposta è: si, il modo c'è, e ne dovremo parlare in
una delle prossime lezioni.
Certamente uno dei modi possibili è fare uso di un
ambiente di sviluppo appositamente attrezzato, come Visual
Interdev.
Però, anche senza arrivare a tanto, quando ne parleremo
scopriremo che, anche così come stiamo facendo noi,
possiamo migliorare di molto la situazione in modo da
rendere meno probabile fare errori di scrittura senza che ce
ne accorgiamo.
Guido Ruggeri
d.

> vorrei capire il perché la prima risposta se è esatta,
me
> la fa vedere che è esatta. Se è sbagliata, non me la
fa
> vedere. La seconda invece, me la fa vedere in tutti e due
> i casi. Ora le incollo l'esercizio.
>
> S1 = Inputbox("L'eroe dei due mondi")
>
> S2 = "Garibaldi"
>
> S3 = InputBox("L'anno della fine della seconda guerra
> mondiale: ")
>
> S4 = "1945"
>
> If StrComp(S1, S2, VbTexCompare) = 0 Then MsgBox "la
> risposta esatta è: " & S2
>
> If StrComp(S1, S2, VbTextCompare) Then MsgBox "La risposta
> " & S1 & " è errata"
>
> If StrComp(S3, S4, VbTexCompare) = 0 Then MsgBox "La
> risposta esatta è: " & S4
>
> If StrComp(S3, S4, VbTextCompare) Then MsgBox "La risposta
> " & S3 & " è errata"

d.

avevo pensato di creare una semplice stringa
> in più, e giocare su bquesta evitando di fare eseguire 2
> volte operazioni che potrebbero essere rallentanti e
> pesanti, nel caso specifico se la risposta esatta era
> Garibaldi, creo una variabile chiamata interrogazione e
> assegnando il valore si, poi facevo apparire i relativi
> messaggi a seconda della stringa assegnata a
> interrogazione, comunque incollo quì sotto il testo, poi
> iil messaggio di Riccardo ha illustrato questa funzione,
> ma immaginavo che qualcosa doveva esistere, anzi ne ero
> sicuro, esiste su excelle quando si vuol cammbiare il
> messaggio su una cella a seconda dei contenuti di
> altre.....figuriamoci!
>
> s1= Inputbox("L'eroe dei due mondi?")
> s2 = "Garibaldi"
> if strcomp(s1, s2, 1)=0 then interrogazione = "si"
> if interrogazione = "si" then msgbox"La risposta è
esatta"
> if not interrogazione = "si" then msgbox"la risposta è
> sbagliata"
r.

E' giusto il ragionamento di memorizzare il risultato del
confronto in una variabile, in modo da poterlo riutilizzare
senza dover ripetere il confronto.
In questo caso, però, tu poni interrogazione = "si".
Fai uso, cioè, di un valore di stringa che metti nella
variabile Interrogazione.
Questo significa che poi devi comunque fare il confronto if
interrogazione = "si" che è ancora un confronto tra
stringhe, così come anche il suo opposto che è if not
interrogazione = "si".
Cioè, per cercare di non fare dei confronti tra stringhe,
finisci comunque per fare dei confronti che sono sempre
confronti tra stringhe.
In termini di prestazioni del processore, non ci sarebbe
alcun vantaggio, se non per il fatto di fare uso, per il
confronto, della stringa "si", più breve e quindi più
veloce da confrontare.
Invece ci sarebbero dei vantaggi usando un valore booleano.
Se nella tua terza riga metti così:

if strcomp(s1, s2, 1)=0 then interrogazione = True

cioè ponendo Interrogazione uguale al booleano True,
anziché alla stringa "si", ottieni che i successivi
confronti diventano confronti tra numeri:

if interrogazione = True then msgbox "La risposta è
esatta"
if not interrogazione = True then msgbox "la risposta è
sbagliata"

Allora sì che ci sarebbe un vantaggio, perché per il
processore manipolare numeri è sempre molto più veloce e
meno impegnativo che manipolare stringhe.
Parliamo comunque di differenze di velocità che per
l'utente sono irrilevanti, ma che, come dicevamo, quando un
programma comincia ad essere composto da migliaia di
istruzioni finiscono, tutte insieme, per avere un qualche
peso.