- 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 visual basic script\Confronto tra numeri
Guido Ruggeri su winguidotecnica, 29\12\2009, h. 14.15.
Adesso che abbiamo cominciato a prendere confidenza con le
variabili e i loro tipi, dobbiamo parlare di logiche di
confronto.
Ricordate cosa avevamo detto in una delle prime lezioni,
parlando del processore? che il processore realizza la
logica di calcolo e di confronto.
Di calcoli abbiamo cominciato a parlare. Abbiamo infatti
visto, nell'esercizio 6, che se definiamo due variabili
numeriche possiamo poi farci sopra le quattro operazioni.
Per rispondere anche a Marta che lo chiedeva, chi alla fine
svolge fisicamente i calcoli è il processore. Certo, prima
di arrivare al processore dobbiamo passare attraverso il
linguaggio di programmazione, il suo interprete, che a sua
volta dialoga col sistema operativo, eccetera.
Ma alla fine tutto ciò che è calcolo deve passare per il
processore.
Abbiamo però detto che il processore non solo calcola, ma
anche confronta. Cioè: se al processore diamo due numeri,
ci sa dire se sono uguali, oppure quale è maggiore
dell'altro.
Detta così può sembrare una banalità, invece è una
cosa importantissima perché su questo si basa tutto il
funzionamento di quello che facciamo col computer, fino ad
arrivare ai grandi database che ormai regolano la nostra
vita di tutti i giorni. Ad esempio, quando arriviamo in
ufficio e passiamo il nostro badge personale nel suo lettore
all'entrata: il lettore acquisisce un identificativo dal
badge, quindi lo passa ad un sistema che deve confrontarlo
con tutti quelli registrati per riconoscere chi siamo, e
quindi memorizzare l'ora in cui siamo entrati.
Infatti cercare dei dati in un database, selezionarli,
metterli in ordine, tutto si basa su logiche di confronto.
E allora, parliamone un po', di questi confronti.
Iniziamo dal confronto tra numeri, perché sul confronto
tra stringhe c'è qualche complicazione in più su cui
dovremo soffermarci.
Innanzitutto, un confronto è come se fosse una funzione
che restituisce un valore booleano: True se il confronto è
verificato, False se non lo è.
Il primo confronto che ci viene in mente di fare è quello
di uguaglianza, cioè: dati due numeri, verificare se sono
uguali.
In VBScript l'operatore per il confronto di uguaglianza è
il simbolo di =
il che rappresenta uno degli aspetti antipatici del Basic.
Infatti il simbolo = è lo stesso che usiamo anche nelle
istruzioni di assegnazione.
Ricordate, infatti, quando scrivevamo:
Cognome = "Ruggeri"
usavamo il simbolo = per dire all'interprete di assegnare
il valore "Ruggeri" alla variabile Cognome.
Lo stesso simbolo di = lo useremo anche per i confronti di
uguaglianza, il che significa che quando andremo a leggere
un codice sorgente ci potrà capitare, se non stiamo
attenti a rifletterci sopra, di confondere delle istruzioni
di assegnazione con dei confronti di uguaglianza.
In Javascript, invece, non c'è questo problema perché in
quel linguaggio l'assegnazione si fa, come in VBScript, con
il segno di uguale, ma il confronto si fa con un doppio
segno di uguale. Così: ==
Anche altri linguaggi, come il C, seguono criteri simili.
Ciò premesso, proviamo a svolgere questo esercizio.
n1 = 6
n2 = 15
msgbox n1 = n2
se eseguiamo questo codice, otterremo una finestra che ci
dice: Falso.
Infatti il parametro che passiamo a msgbox non è né il
numero n1 né il numero n2, ma è il risultato del loro
confronto, che in questo caso è falso perché i due
numeri non sono uguali.
Notate poi che, quando siamo in msgbox, il nostro interprete
ha anche la bontà di tradurre le parole standard False e
True nella lingua del sistema operativo, perciò, se il
sistema è in italiano, ci dice Falso o Vero.
Adesso proviamo con un confronto che risulti vero.
n1 = 8
n2 = 8
msgbox n1 = n2
e questa volta otterremo il messaggio: Vero.
Adesso, per meglio comprendere la logica, proviamo ad
introdurre una variabile che chiameremo Confronto.
n1 = 5
n2 = 12
Confronto = n1 = n2
msgbox Confronto
Il risultato è lo stesso di prima, nella terza riga la
variabile Confronto ha assunto un valore booleano.
Notate però la pessima leggibilità della terza riga,
dove si trovano mischiate un'istruzione di assegnazione e
una di confronto.
Infatti il secondo segno di = realizza il confronto tra n1
ed n2, mentre il primo segno di = assegna il risultato del
confronto alla variabile Confronto.
Con righe del genere è facile confondersi. Io di solito
cerco di rimediare mettendo tra parentesi le operazioni di
confronto.
Così:
Confronto = (n1 = n2)
Per l'interprete non cambia nulla, ma visivamente appare
più chiaro il ruolo dei due segni di =
Abbiamo visto il confronto di uguaglianza, ma ci sono altri
operatori di cui dobbiamo parlare.
L'operatore > serve per valutare se il valore a sinistra del
segno è maggiore di quello a destra del segno.
Facciamo un esempio:
n1 = 2
n2 = 5
msgbox n1 > n2
otterremo Falso, perché 2 non è maggiore di 5.
Altro esempio:
n1 = 8
n2 = 5
msgbox n1 > n2
questa volta otterremo Vero, perché 8 è maggiore di 5.
Naturalmente, oltre all'operatore > esiste anche
l'operatore <
Se riprendiamo l'esempio di prima con il <, avremo:
n1 = 2
n2 = 5
msgbox n1 < n2
e questa volta otterremo Vero.
Esistono poi altri operatori che si rappresentano con un
doppio simbolo:
>= il confronto è vero se il primo numero è maggiore
oppure uguale al secondo.
<= il confronto è vero se il primo numero è minore
oppure uguale al secondo.
<> il confronto è vero se i due numeri sono diversi.
Ormai avrete capito, quindi potete inventarvi le vostre
prove da soli.
Per concludere questa lezione, parliamo dell'operatore Not.
Not ha l'effetto di ribaltare un valore booleano: da True si
ottiene False, e da False si ottiene True.
Quindi può essere usato per ribaltare l'esito di un
confronto.
Ad esempio, vogliamo verificare se due numeri sono diversi.
Abbiamo visto che si può fare con l'operatore <>, ma si
può fare anche applicando Not al confronto con l'operatore
=
Proviamo a scrivere:
n1 = 6
n2 = 6
msgbox n1 <> n2
msgbox Not n1 = n2
Le ultime due righe sono equivalenti, danno cioè come
risultato, in questo caso, Falso, perché non è vero che
i due numeri sono diversi.
Provate a fare un po' di prove per prendere confidenza con
gli operatori di confronto.
Poi parleremo del confronto tra stringhe.
Ed ora, un po' di pubblicità
:***
Antonio De Angelis.
d.
ok che se scrivo in lire 1936.27 non mi accetta il punto ma e normale che mi da un errore nel calcolo e anzicche' darmi 1 mi da 100.
ma perche se inserisco lire 1 il risultato non e 0,xxxxxx ma 1,xxxxxx?
r.
Attenzione ai decimali.
Quando li scriviamo nel codice sorgente del programma, vale la notazione inglese, cioè: il separatore tra la parte intera e la parte decimale deve essere il punto, non la virgola.
Ma quando li immettiamo attraverso la finestra di dialogo aperta da inputbox, valgono gli standard di Windows, cioè le notazioni corrispondenti alle impostazioni di nazionalità del computer.
Il che, per l'Italia, significa: il separatore per la parte decimale è la virgola, mentre il punto è il separatore per le migliaia.
Questo vuol dire che il punto viene ignorato. Tu non hai immesso 1936 virgola 27, ma 193627, che corrisponde a 100 euro. Invece quando inserisci una lira ottieni il risultato in notazione esponenziale, per questo ti confondi. Dobbiamo ancora imparare a dare il formato desiderato alle stringhe numeriche che vogliamo far apparire. Guido Ruggeri.
Aniceto fois
Euro = csng(inputbox("valore dell'euro"))
Dollari = csng(inputbox("valore del dollaro"))
Cambio = csng(inputbox("valore del cambio"))
Cambio = 1,4492
Euro = 12,30
Dollari = Euro * Cambio
msgbox = "Dollari = " & Dollari
***
Nel codice di Aniceto ci sono diversi errori, sia di programmazione, sia sotto l'aspetto concettuale. Gli errori tecnici sono: nella quarta e nella quinta riga ci sono istruzioni di assegnazione a valori decimali, dove come segno di separatore dei decimali viene usata la virgola. Invece quando si scrivono righe di programma si deve usare la notazione anglosassone, con uso del punto, anziché della virgola, come separatore dei decimali. Altro errore tecnico: nella settima riga, si è cercato di assegnare il valore "Dollari = " & Dollari alla variabile msgbox. Ma msgbox è una parola riservata del linguaggio di programmazione, che non può essere usata come nome per una variabile. Rivedendo invece la cosa sotto l'aspetto concettuale, si nota: Il valore dell'euro viene impostato a scelta dell'utente nella prima riga, ma poi, nella quinta riga, viene riassegnato al valore costante 12,30. In questo modo la scelta dell'utente è superflua perché viene comunque poi annullata da tale assegnazione. Stesso discorso per la variabile Cambio. La variabile Dollari, invece, viene impostata a scelta dell'utente nella seconda riga, ma poi tale scelta diventa inutile perché Dollari viene ricalcolata nella sesta riga come prodotto di Euro per Cambio. Infine, la settima riga voleva evidentemente avere lo scopo di far apparire una finestra con il risultato del valore in dollari, invece, essendo stato inserito un simbolo di assegnazione che non doveva esserci, è un tentativo di assegnazione alla variabile msgbox. Tentativo che il linguaggio non consente, perché la parola msgbox corrisponde ad una funzione predefinita e quindi non può essere usata come nome di una variabile. Guido Ruggeri.
Aniceto
Ecco il testo che funziona, corretto con le precisazioni successive dell'ingegnere
Euro = csng(inputbox("valore dell'euro"))
Cambio = csng(inputbox("valore del Cambio"))
Cambio = 1.4492
Euro = 12.30
msgbox "Dollari = " & Cambio*euro
Guido Ruggeri.
Così funziona, però non ha senso. I valori di Euro e di Cambio, che l'utente immette nelle prime due righe, vengono poi annullati dalle assegnazioni a valori costanti che avvengono nelle righe 3 e 4. Perciò, quali che siano i valori di Euro e di Cambio che l'utente immetterà, alla fine apparirà sempre e comunque lo stesso risultato, cioè Dollari = 17,825. Guido Ruggeri.
Aniceto Fois
Mi scuso, ma negli esercizi inviati ho fatto errori imperdonabili e, soprattutto, grossolani; non so spiegarmelo, ma dovrò stare più attento le prossime volte. Seguendo le sue correzioni ho apportato le correzioni opportune. Inollo l'esercizio e lo sottopongo alla Sua cortese attenzione.
Saluta e porge i più sinceri auguri di buon 2010 a Lei e a tutta la lista
Aniceto
euro = csng(inputbox("importo in euro"))
dollari = csng(inputbox("importo in dollari"))
cambio = 1.4492
msgbox "dollari= " & cambio*euro
msgbox "euro= " & dollari/cambio
__._,_.___
Roberto Pellizzaro.
quando ho lanciato la provocazione del convertitore di valuta, speravo di
riuscire a crearne uno valido per tutti gli usi, ma non ci sono riuscito.
Quindi, ne ho fatti due:
1) Convertitore da euro: nel primo campo si immette il cambio di
qualsivoglia valuta rispetto all'euro, nel secondo, il totale degli euro che
si vuole convertire, il risultato sarà il totale della valuta inserita.
Cambio = CCur(InputBox("Cambio"))
Totale = CCur(InputBox("Totale"))
Conversione = Totale * Cambio
MsgBox "Totale = " & Conversione, 0, "Convertitore da Euro"
2) Convertitore in euro: nel primo campo si immette il cambio della
qualsivoglia valuta rispetto all'euro, nel secondo il totale della valuta
stessa posseduta, il risultato sarà il controvalore in euro.
Cambio = CCur(InputBox("Cambio"))
Totale = CCur(InputBox("Totale"))
Conversione = Totale / Cambio
MsgBox "Totale = " & Conversione, 0, "Convertitore in Euro"
Guido Ruggeri.
Sarebbe bene evitare la dicitura "Totale" negli InputBox delle seconde righe, dato che la stessa dicitura la usi anche per la finestra col risultato.
Perciò sarebbe meglio mettere rispettivamente "Euro" nel primo convertitore, e qualcosa come "Valuta" nel secondo.
Inoltre, per il Cambio, che è un coefficiente da moltiplicare, sarebbe più adatto il tipo Single piuttosto che il tipo Currency.
Massimiliano Matteoni.
ho provato a correggere l'esercizio nel modo seguente:
Euro = csng(inputbox("valore dell'euro"))
Cambio = 1.4492
msgbox "Dollari = " & Cambio*euro
se il fine è quello di calcolare il valore del dollaro immettendo una cifra
in euro, credo di aver raggiunto lo scopo.
Alessandro Ricotta.
provo anch'io a realizzare un rudimentale convertitore euro-lira.
Prova 1: convertitore euro-lira
Cambio = 1936.27
euro = CCur(InputBox("Inserire il valore in euro:"))
lire = euro * cambio
MSGBox"Valore in lire:" & VBCRLF & lire
Prova 2: convertitore lira-euro
lire = CCur(InputBox("Inserire il valore in lire:"))
euro = lire / cambio
MSGBox "Valore in euro:" & VBCRLF & euro
Attenzione: se si manda in esecuzione lo script, nelle finestre di
editazione che appaiono bisogna scrivere i valori numerici richiesti
nella notazione italiana, separando gli interi dai decimali con la
virgola e non con il punto, altrimenti l'interprete effettua calcoli errati.
***
Guido Ruggeri.
Molto bene, Aniceto, la cosa importante è che stai
cominciando a prendere confidenza col meccanismo.
E' chiaro che come convertitore di valuta è ancora poco
logico, però con le prossime nozioni che apprenderemo
arriveremo a sistemarlo.
Adesso ti consiglio di provare liberamente ad inventarti
altri esercizi simili, e di farceli vedere, come hai fatto
con questo. Non preoccuparti per gli errori che fai,
l'importante è che ti eserciti: serve per scioglierti e
cominciare a comprendere certi meccanismi.
Ma adesso è bene non voler forzare la mano ad andare
oltre, perché rischiamo di lasciare indietro qualcuno.
Io proporrei di lasciar passare il capodanno.
Poi, quando mi direte di essere pronti, riprenderemo e
andremo avanti.
Quello che vorrei fare è:
una lezione sul confronto tra stringhe;
qualche esercizio sul contronto tra numeri e stringhe;
lezione ed esercizi sull'uso dei confronti per operare delle
scelte;
riprendere l'esercizio sul ciclo Do Loop aggiungendoci le
possibilità di uscita;
lezione ed esercizi su altri tipi di ciclo;
lezioni ed esercizi sulla manipolazione delle stringhe;
prime lezioni ed esercizi sulla costruzione di funzioni
personalizzate.
Se saremo bravi arriveremo a fare tutte queste cose prima
della primavera...
***
d.
> volendo creare un'applicazione che mi consentisse di
> provare in un'unica soluzione la lezione sul confronto
> tra numeri, ho scritto:
N1 = InputBox("Primo numero")
N2 = InputBox("Secondo numero")
Confronto1 = (N1 <> N2)
MsgBox "Risultanza: " & Confronto1, 0, "Confronto diverso
da..." Confronto2 = (N1 < N2)
MsgBox "Risultanza: " & Confronto2, 0, "Confronto minore
di..." Confronto3 = (N1 > N2)
MsgBox "Risultanza: " & Confronto3, 0, "Confronto maggiore
di..." Confronto4 = (N1 = N2)
MsgBox "Risultanza: " & Confronto4, 0, "Confronto uguale
a..." Confronto5 = (Not N1 = N2)
MsgBox "Risultanza: " & Confronto5, 0, "Confronto not uguale
a..."
> Ebbene, mentre il confronto 1-4-5 mi ritornano un responso
> corretto, il 2 e il 3, me lo danno inverso, dove sta
> l'errore?
>
> Ho inserito 10 nel primo box e 6 nel secondo.
r.
Guido Ruggeri.
L'errore sta nell'aver fatto dei confronti tra stringhe
anziché tra numeri.
Come esito di un confronto tra stringhe, è corretto:
infatti la stringa "10" è minore della stringa "6".
Per fare un confronto tra numeri basta aggiungere nelle
prime due righe una funzione di conversione, quale CInt
oppure CSng.
Non dobbiamo infatti dimenticare che la funzione InputBox ci
restituisce stringhe, e tali restano se non le convertiamo.
Nel confronto tra numeri, non ci sono dubbi che 10 sia
maggiore di 6.
Del confronto tra stringhe dobbiamo ancora parlare, ma posso
anticipare che in quel caso il confronto si fa carattere per
carattere. Quindi, nel nostro caso, il confronto è tra il
carattere "1" e il carattere "6", e quindi la stringa "10"
risulta minore della stringa "6".