definizioni di variabili e costanti ed esempi pratici di gestione tipi di dati con funzioni di conversione
Open Eye realizzazione siti web- info@open-eye.it

Visual Basic Script: Cicli e tipi di dati



Nella prime lezioni abbiamo visto come tradurre quello che vogliamo far fare al nostro computer in una serie di macroistruzioni per lui comprensibili (istruzioni “semplici”, condizionali e cicli) con alcuni esempi pratici, ed abbiamo fatto una breve digressione teorica sui tipi dati. In questa terza lezione faremo ancora un po’ di teoria, guardando cosa sono e come vengono gestite le variabili e costanti, guarderemo come scoprire il loro tipo dati e scriveremo alcuni programmi per imparare a gestirli.

Scripting in visual basic - Variabili e costanti

Nelle lezioni precedenti abbiamo già utilizzato le variabili per i nostri esempi, ma non le abbiamo definite, se non brevemente.

Abbiamo detto che si può pensare alle variabili come a dei contenitori all’interno dei quali inserire dei valori, che possono essere di uno qualsiasi dei tipi di dati definiti in precedenza. Detto con maggiore precisione si può dire che le variabili sono dei riferimenti a delle aree di memoria dove il computer memorizza i valori assegnati alla variabile stessa. In realtà, a noi non interessa sapere quali siano le aree di memoria interessate, in quanto è una cosa che possiamo demandare al computer.
Oltre alle variabili, esistono le costanti; la differenza tra variabili e costanti è abbastanza intuibile dal nome: il valore assegnato ad una variabile è modificabile durante il programma, mentre quello delle costanti è fisso.

Vediamo come si dichiarano queste due entità in vbs; per le costanti la nomenclatura dice

Const Nome = valore

Ovvero, ad esempio

Const sEsempio = “stringa di esempio”
Const iNumero = 6
Const dDataCompleanno = #16-8-79#

Mentre per le variabili si utilizza la parola Dim

Dim Nome

Ovvero

Dim iNumVar

Come potete vedere dagli esempi, potete assegnare qualsiasi nome alle variabili ed alle costanti, basta che il nome non sia più lungo di 40 caratteri e cominci con uno dei caratteri dell’alfabeto (quindi niente numeri o segni di interpunzione). Inoltre, il vbs non fa distinzione tra maiuscole e minuscole per quanto riguarda i nomi delle variabili, quindi sEsempio è uguale a sesempio.

Scripting in visual basic - Ottenere il tipo dati: TestVarType.vbs


Dopo aver visto un po’ di definizioni teoriche su variabili e tipi dati, vediamo come fare a capire da programma il tipo di dato di una variabile e prendiamo confidenza con la funzione VarType e l’operatore Select Case.

Creiamo un nuovo programma, e chiamiamolo TestVarType.vbs

'-------------------------------
' Name: TestVarType.vbs
' Author: Jeff Skyrunner
' Date: 23/06/10
' Desc: Esempi di recupero tipi dati
'------------------------------

' Dichiarazione delle variabili
Dim vVariabile
Dim sTipoVariabile

' Leggo il tipo dato della variabile vVariant
iTipo = VarType(vVariabile)

' Visualizzo un messaggio con il numero restituito dalla funzione
Msgbox iTipo

' Uso la funzione Select ... Case per evitare di scrivere
' tantissimi If ... Then ... Else
Select Case iTipo
Case 0
sTipoVariabile = "Vuoto (non inizializzato)"
Case 1
sTipoVariabile = "Null (dato non valido)"
Case 2
sTipoVariabile = "Intero"
Case 3
sTipoVariabile = "Long"
Case 4
sTipoVariabile = "Single"
Case 5
sTipoVariabile = "Double"
Case 6
sTipoVariabile = "Currency"
Case 7
sTipoVariabile = "Date"
Case 8
sTipoVariabile = "String"
Case 9
sTipoVariabile = "Oggetto"
Case 10
sTipoVariabile = "Errore"
Case 11
sTipoVariabile = "Booleano"
Case 12
sTipoVariabile = "Variant"
Case 13
sTipoVariabile = "Oggetto per accesso a dati"
Case 17
sTipoVariabile = "Byte"
Case 8192
sTipoVariabile = "Array"
Case Else
sTipoVariabile = "Tipo non previsto"

End Select

' Visualizzo il tipo dati
msgbox "Il tipo di dato di vVariabile è " & sTipoVariabile

' Assegno un nuovo valore alla variabile
vVariabile = 1


Non spaventatevi: è lungo (e prossimamente vedremo come fare a renderlo molto migliore in termini di leggibilità) ma è semplice da capire, tenendo d’occhio un paio di passaggi chiave.

Andiamo ad analizzarlo riga per riga:

' Dichiarazione delle variabili
Dim vVariabile
Dim sTipoVariabile
Dim iTipo


Qui c’è poco da dire: dichiariamo le variabili che utilizzeremo; per quanto sia vero che il vbscript non richiede che le variabili vengano dichiarate esplicitamente prima di utilizzarle, adesso che state muovendo i primi passi nel mondo della programmazione è meglio che vi abituiate a farlo, per semplici motivi di ordine mentale… diciamo che ci sarà tempo più tardi per diventare disordinati!

' Leggo il tipo dato della variabile vVariant
iTipo = VarType(vVariabile)

In questa istruzione utilizziamo la funzione VarType di vbscript che ci permette di leggere il tipo di dati associato ad una variabile ed assegnarlo a iTipo; tuttavia, leggendo sul manuale la descrizione della funzione (il manuale si può scaricare dal sito della microsoft http://www.microsoft.com/downloads/details.aspx?FamilyId=01592C48-207D-4BE1-8A76-1C4099D7BBB9&displaylang=en ) possiamo vedere che la funzione restituisce un valore intero a seconda del tipo di dati.
La dimostrazione che la funzione abbia funzionato correttamente, ce la da l’istruzione successiva:

' Visualizzo un messaggio con il numero restituito dalla funzione
Msgbox iTipo

Che ci fa comparire a video il numero che abbiamo inserito in iTipo, ovvero 0

Evidentemente, un numero non ci fa capire chiaramente di fronte a che tipo dati siamo di fronte, quindi rendiamo più leggibile il risultato, usando il blocco di istruzioni successive:

' Uso la funzione Select ... Case per evitare di scrivere
' tantissimi If ... Then ... Else
Select Case iTipo
Case 0
sTipoVariabile = "Vuoto (non inizializzato)"
Case 1
sTipoVariabile = "Null (dato non valido)"
Case 2
sTipoVariabile = "Intero"
Case 3
sTipoVariabile = "Long"
Case 4
sTipoVariabile = "Single"
Case 5
sTipoVariabile = "Double"
Case 6
sTipoVariabile = "Currency"
Case 7
sTipoVariabile = "Date"
Case 8
sTipoVariabile = "String"
Case 9
sTipoVariabile = "Oggetto"
Case 10
sTipoVariabile = "Errore"
Case 11
sTipoVariabile = "Booleano"
Case 12
sTipoVariabile = "Variant"
Case 13
sTipoVariabile = "Oggetto per accesso a dati"
Case 17
sTipoVariabile = "Byte"
Case 8192
sTipoVariabile = "Array"
Case Else
sTipoVariabile = "Tipo non previsto"

End Select

Come indica chiaramente il commento, la funzione case serve per risparmiarci un po’ di if: invece di scrivere
If iTipo = 0 Then
sTipoVariabile = "Vuoto (non inizializzato)"
Elseif iTipo = 1 Then
sTipoVariabile = "Null (dato non valido)"
Elseif iTipo = 1 Then
sTipoVariabile = "Intero"

...


Preferiamo questo sistema che è più leggibile ed organico; sostanzialmente diciamo al computer “scegli il caso in cui si trova iTipo (Select case iTipo): in caso sia 0 (case 0) allora assegna a sTipoVariabile il valore “Vuoto (non inizializzato)” (sTipoVariabile = "Vuoto (non inizializzato)"), in caso sia 1 (case 1) allora assegna a sTipoVariabile il valore “Null (dato non valido)” (sTipoVariabile = "Null (dato non valido)") e così via.
Così facendo abbiamo assegnato a sTipoVariabile una stringa che sia descrittiva per l’utente, oltre che più chiara, ed infatti l’istruzione successiva

' Visualizzo il tipo dati
msgbox "Il tipo di dato di vVariabile è " & sTipoVariabile

ci dice che “il tipo di dato di vVariabile è Vuoto (non inizializzato)”, il che corrisponde sia a quanto restituito dalla funzione VarType, sia da quanto ci aspettiamo, in quanto, effettivamente, vVariabile non ha nessun valore associato.

Piccola precisazione prima di procedere: l’operatore “&” è l’operatore che ci permette di fare l’unione di due stringhe (in gergo, appending) e lo adoperiamo quando vogliamo “costruire” una frase unica unendo due stringhe, come in questo caso; lo vedremo meglio nel prossimo paragrafo.

Vediamo cosa succede assegnando alla variabile vVariabile il valore 1

' Assegno un nuovo valore alla variabile
vVariabile = 1

Questa volta il msgbox successivo

' Ne leggo il nuovo tipo
iTipo = VarType(vVariabile)

' Visualizzo un messaggio con il numero restituito dalla funzione
Msgbox iTipo


Ci restituirà il valore 2, che con la select case successiva (che non ripetiamo in quanto identica a prima) ed il msgbox ci fa visualizzare il messaggio “il tipo di dato vVariabile è Intero”.

Scripting in visual basic - Funzioni di conversione: TestConversione.vbs

Spesso e volentieri saremo costretti a convertire i vari tipi di dati fra loro, per essere sicuri di manipolarli correttamente ed ovviare ad errori grossolani.

Creiamo un nuovo programma, e chiamiamolo TestConversione.vbs e vediamo cosa succede se non stiamo attenti:

'-------------------------------
' Name: TestConversione.vbs
' Author: Jeff Skyrunner
' Date: 23/06/10
' Desc: Esempi di conversione tra tipi dati
'------------------------------

' Dichiarazione delle variabili
Dim vVar1
Dim vVar2
Dim vVar3

' Faccio digitare all'utente due numeri
vVar1 = InputBox("Digita un numero intero")
vVar2 = InputBox("Digita un secondo numero intero")

' Faccio la somma dei due numeri
vVar3 = vVar1 + vVar2

' Visualizzo il risultato
msgbox "Il risultato è " & vVar3


Lanciando il programma e provando ad inserire due numeri interi a caso (ad esempio 9 e 6) ci accorgeremo che il risultato finale è… 96!
Questo perché quando utilizziamo la InputBox il computer traduce automaticamente quanto inserito dall’utente in una stringa… d’altra parte, il computer non può sapere cosa l’utente sta digitando, in quanto si aspetta che siate voi, il programmatore, a dirglielo.

Vediamo quindi di realizzare il programma in maniera più corretta;

'-------------------------------
' Name: TestConversione.vbs
' Author: Jeff Skyrunner
' Date: 23/06/10
' Desc: Esempi di conversione tra tipi dati
'------------------------------

' Dichiarazione delle variabili
Dim vVar1
Dim vVar2
Dim vVar3

' Faccio digitare all'utente due numeri
vVar1 = InputBox("Digita un numero intero")
vVar2 = InputBox("Digita un secondo numero intero")

' Faccio la somma dei due numeri
vVar3 = CInt(vVar1) + CInt(vVar2)

' Visualizzo il risultato
msgbox "Il risultato è " & CStr(vVar3)


Apparentemente il programma è lo stesso, ma sono state inserite due funzioni fondamentali: CInt e CStr che vogliono dire, rispettivamente, “Converti in intero” e “Converti in stringa”. Queste due funzioni ci permettono di ottenere il risultato voluto, in quanto l’istruzione

' Faccio la somma dei due numeri
vVar3 = CInt(vVar1) + CInt(vVar2)


Corrisponde a dire assegna a vVar3 il risultato di vVar1 convertito in intero sommato a vVar2 convertito in intero.

Per quanto riguarda l’istruzione successiva, invece

' Visualizzo il risultato
msgbox "Il risultato è " & CStr(vVar3)


Non è strettamente obbligatorio fare la conversione: quando si fa un appending di una stringa vbscript tenta in automatico di convertire tutti gli elementi dell’appending in stringa… ma per una questione di correttezza formale è sempre meglio convertire esplicitamente tutti i dati che ne hanno bisogno.

Le funzioni di conversioni previste da vbscript sono


Una tabella con i tipi di dati per visual basic script
È da notare che non tutte le funzioni sono applicabili a tutti i tipi dati: la funzione Sgn, ad esempio, non può essere applicata ad una stringa.

Scripting in visual basic - Punto della situazione: Operazioni.vbs

Arrivati a questo punto, vediamo di costruire un piccolo programma che utilizzi un po’ tutte le funzioni e strutture che abbiamo visto fino ad adesso.

Creiamo un nuovo programma Operazioni.vbs


'-------------------------------
' Name: Operazioni.vbs
' Author: Jeff Skyrunner
' Date: 23/06/10
' Desc: Esempi di funzioni varie
'------------------------------

' Dichiarazioni costanti
Const RIPETIZ = 5

' Dichiarazione delle variabili
Dim sVar1
Dim sVar2
Dim sVar3
Dim sOperatore

sVar2 = ""


' Ciclo fino a che l'utente non digita un numero
Do
' Faccio digitare all'utente due numeri
sVar1 = InputBox("Digita un numero intero; numeri non interi saranno convertiti.")
Loop while not IsNumeric(sVar1)

' Ciclo fino a che l'utente non digita un numero
Do while not IsNumeric(sVar2)
sVar2 = InputBox("Digita un secondo numero intero; numeri non interi saranno convertiti.")
if not IsNumeric(sVar2) Then
msgbox "Quanto digitato non e' un numero!"
else
msgbox "Entrambi i numeri sono validi."
end if

Loop

' Faccio scegliere all'utente un'operazione
sOperatore = InputBox("Digita l'operazione da ripetere " & CStr(RIPETIZ) & " volte. (* o +)")

' Se l'utente ha scelto somma o prodotto facciamo eseguire l'operazione, altrimenti diamo errore
Select case sOperatore
case "*"
' Faccio il prodotto dei due numeri per RIPETIZ volte
sVar3 = CInt(sVar1) * CInt(sVar2) * RIPETIZ
case "+"
' Faccio la somma dei due numeri
sVar3 = (CInt(sVar1) + CInt(sVar2)) * RIPETIZ
case else
sVar3 = “Stringa”
End select

if IsNumeric(sVar3) Then
' Lo trasformo in un double per far vedere il risultato con la virgola
sVar3 = CDbl(sVar3)

' Visualizzo il risultato
msgbox "Il risultato è " & CStr(sVar3)
Else
msgbox "L'operazione scelta non è valida!"
End if



Dopo quanto detto fino ad adesso il programma dovrebbe essere abbastanza leggibile; vediamo i punti essenziali:

' Ciclo fino a che l'utente non digita un numero
Do
' Faccio digitare all'utente due numeri
sVar1 = InputBox("Digita un numero intero; numeri non interi saranno convertiti.")
Loop while not IsNumeric(sVar1)


Nel ciclo utilizziamo la funzione IsNumeric di vbscript che restituisce “vero” se il numero passato tra parentesi è un numero; con questa funzione ci assicuriamo che il ciclo continui fino a che l’utente non digita un numero, dato che diciamo al computer “fai (Do) inserire all’utente un numero (sVar1 = InputBox("Digita un numero intero; numeri non interi saranno convertiti.")) ripetendo fino a che quanto scritto in sVar1 non è un numero (Loop while not IsNumeric(sVar1))”.

Il secondo blocco è sostanzialmente uguale, con la differenza che questa volta usiamo l’operatore Do while … loop; in aggiunta, questa volta diamo un messaggio di errore all’utente nel caso non digiti un numero.

Infine, chiediamo all’utente di inserire l’operazione da ripetere per un numero di volte pari a RIPETIZ, dove RIPETIZ è una costante definita all’inizio del programma.

Guardiamo l’istruzione select, ed in particolare il case else:

' Se l'utente ha scelto somma o prodotto facciamo eseguire l'operazione, altrimenti diamo errore
Select case sOperatore
case "*"
' Faccio il prodotto dei due numeri per RIPETIZ volte
sVar3 = CInt(sVar1) * CInt(sVar2) * RIPETIZ
case "+"
' Faccio la somma dei due numeri
sVar3 = (CInt(sVar1) + CInt(sVar2)) * RIPETIZ
case else
sVar3 = “Stringa”
End select


Nel caso in cui non sia stata scelta né * né + (è quello che vuol dire case else: “in tutti gli altri casi diversi dai precedenti”) viene assegnato alla variabile sVar3 un valore di stringa; in questa maniera quando arriviamo all’ultima istruzione sappiamo che se abbiamo un valore non numerico di sVar3 vuol dire che l’operazione non è valida, e ne diamo opportuna segnalazione all’utente.

A cura di Jeff Skyrunner