Elementi di Programmazione
Tipi di Dati e Conversioni
Istruzioni di controllo del flusso
EP 11/12 - PB
Lezione 3
1
Problemi con i tipi di dati
Proviamo a leggere da inputBox un numero
• Creiamo un bottone
• Nel codice di gestione del click creiamo
una inputBox e leggiamo un dato
• Il dato lo convertiamo in una variabile
“numero” di tipo integer
• Scriviamo numero in una casella
EP 11/12 - PB
Lezione 3
2
Problemi con i tipi di dati (sol)
Private Sub CommandButton1_Click()
Dim numero As Integer
Dim str_in As String
str_in = InputBox("Dato")
numero = CInt(str_in)
Range("E5") = numero
End Sub
EP 11/12 - PB
Lezione 3
3
Controllo delle conversioni di Tipo
• Alcune funzioni che permettono di evitare
errori di conversione
IsNumeric(espr)
True se espr è compatibile con un numero (decimale o
intero)
IsDate(espr)
True se espr è compatibile con un formato data
EP 11/12 - PB
Lezione 3
4
Istruzioni di controllo del flusso
• Nei linguaggi di programmazione imperativi
(come VBA, C, Pascal) l’ordine di esecuzione è
strettamente sequenziale.
• Molto spesso questo modo di eseguire i
programmi non è sufficiente per gestire tutte le
necessità.
• Esistono dei modi per variare questo ordine:
–
–
–
–
Istruzioni condizionali
Istruzioni cicliche
Richiamo di sottoprogrammi/funzioni
Esiste anche un quarto modo in disuso: istruzioni di
salto
EP 11/12 - PB
Lezione 3
5
Istruzioni condizionali (1)
• Ogni linguaggio di programmazione possiede
un’istruzione che permette di scegliere fra due
strade in base ad una condizione
• L’istruzione VBA è:
If condizione Then
istruzioni quando condizione è vera
Else
istruzioni quando condizione è falsa
End If
EP 11/12 - PB
Lezione 3
6
Istruzioni condizionali (2)
• La seconda parte (ramo Else) è facoltativa, non
è facoltativa l’istruzione End If.
• Supponiamo di voler verificare se il valore della
cella D3 è positivo scrivendo un opportuno
messaggio nella cella F3:
Private Sub CommandButton1_Click()
If Range("D3") > 0 Then
Range("F3") = "positivo"
Else
Range("F3") = "NON positivo"
End If
End Sub
EP 11/12 - PB
Lezione 3
7
Istruzioni condizionali (3)
Nella forma più generale l’istruzione è:
If condizione Then
istruzioni
ElseIf condizione Then
istruzioni
Else
istruzioni
End If
EP 11/12 - PB
Lezione 3
8
Istruzioni condizionali (4)
• I rami ElseIf ed Else sono facoltativi.
• Ci possono essere più rami ElseIf ma
un sol ramo Else
– Ciascun ramo può valutare una condizione
diversa
– Per evitare l’uso di molti rami ElseIf in ceri
casi è preferibile usare l’istruzione Select
Case
• Le istruzioni If possono essere nidificate
EP 11/12 - PB
Lezione 3
9
Istruzioni condizionali (5)
• Il codice che segue viene mandato in
esecuzione per stabilire il contenuto della cella
D3:
Private Sub commento()
If Range("D3") > 0 Then
Range("F3").Value = "POSITIVO"
Else
If Range("D3") < 0 Then
Range("F3") = "NEGATIVO"
Else
Range("F3") = "Nullo"
End If
End If
End Sub
EP 11/12 - PB
Lezione 3
10
Istruzioni condizionali (6)
Esempio complesso:
determiniamo di che tipo sono le soluzioni
(radici) di un’equazione di secondo grado
a*(X^2) + b*X + c = 0
EP 11/12 - PB
Lezione 3
11
Istruzioni condizionali (7)
• Il codice che segue presume che nelle
celle A5, B5 e C5 ci siano i coefficienti di
una equazione di secondo grado. Nella
cella D5, in base al valore di delta, scrive il
numero di radici dell’equazione (si usa un
bottone per attivare l’elaborazione)
EP 11/12 - PB
Lezione 3
12
Istruzioni condizionali (8)
Private Sub Eq2Grado_Click()
Delta = Range("B5") ^ 2
Delta = Delta - 4 * Range("A5") * Range("C5")
If Delta > 0 Then
Range("D5") = "2 radici reali"
Else
If Delta = 0 Then
Range("D5") = "radici reali coincidenti"
Else
Range("D5") = "coniugate complesse"
End If
End If
End Sub
EP 11/12 - PB
Lezione 3
13
Istruzioni condizionali CASE (1)
Select Case espressione
Case espressioneConfronto
Istruzioni
CaseElse
Istruzioni
End Select
EP 11/12 - PB
Lezione 3
14
Istruzioni condizionali CASE (2)
• Le parti Case e CaseElse sono facoltative
• Ci possono essere più rami Case ma di Case Else ve
ne può essere uno solo
• L’istruzione valuta una sola volta espressione e
quindi
valuta
questo
risultato
con
ogni
espressioneConfronto fino a trovare la prima per la
quale è vera
– Al primo caso in cui Case è vero termina l’istruzione
• Si comporta in modo differente dal C
– Il ramo Case Else si utilizza per dare un risultato quando
nessuna delle condizioni si è verificata
– Può sostituire solo parzialmente If in quanto espressione è
valutata solo una volta
EP 11/12 - PB
Lezione 3
15
Istruzioni condizionali CASE (3)
– espressioneConfronto può essere
• Un solo valore
• Più valori separati da virgola
• Un intervallo di valori (inizio To fine)
• Operatori di confronto:
– IS operatoreConfronto valore
» Operatori confronto: >, <, >=, <=, =, <>
EP 11/12 - PB
Lezione 3
16
Istruzioni condizionali
Equivalenza espressiva (1)
Select Case par
Case Is < 0
usoSelect = "negativo"
Case 0
usoSelect = "ZERO“
Case 1, 2, 3, 4, 5, 6, 7, 8, 9
usoSelect = " una cifra"
Case 10 To 99
usoSelect = "due cifre"
Case Else
usoSelect = "Più di due cifre"
End Select
EP 11/12 - PB
If Not IsNumeric(par) Then
Messaggi = "non è un numero"
ElseIf par < 0 Then
Messaggi = "Negativo"
ElseIf par <= 9 Then
Messaggi = "Una Cifra"
ElseIf par < 100 Then
Messaggi = "Due cifre"
Else
Messaggi = "piu' di 2 cifre"
End If
Lezione 3
17
Istruzioni condizionali
Equivalenza espressiva (2)
• L’esempio con Select non rispecchia
l’esempio analogo fatto con l’istruzione If
• Il primo ramo If
If Not IsNumeric(par) Then
Messaggi = "non è un numero“
– Non può essere reso con Select Case
perché usa una espressione condizionale
diversa da quella usata negli altri rami
• Occorre usare un If con un Select Case in un
ramo
EP 11/12 - PB
Lezione 3
18
Istruzioni condizionali
Equivalenza espressiva (3)
If Not IsNumeric(par) Then
usoSelectEqv = "non è un numero"
Else
Select Case par
Case Is < 0
usoSelectEqv = "negativo"
Case 0
usoSelectEqv = "ZERO"
Case 1, 2, 3, 4, 5, 6, 7, 8, 9
usoSelectEqv = "cifra"
Case 10 To 99
usoSelectEqv = "due cifre"
Case Else
usoSelectEqv = "Più di due cifre"
End Select
End If
EP 11/12 - PB
Lezione 3
19
Esempio
• Data una equazione di secondo grado
stabile usando la regola dei segni di
Cartesio il segno delle radici reali distinte
– il cambiamento di segno fra due coefficienti
consecutivi produce una radice positiva, la
permanenza una radice negativa
a*(X^2) + b*X + c = 0
EP 11/12 - PB
Lezione 3
20
Esempio
•
•
•
•
•
•
+++
- - +- +
- +-++
++-
EP 11/12 - PB
2 permanenze -> 2 negative
2 permanenze -> 2 negative
2 variazioni -> 2 positive
2 variazioni -> 2 positive
1 var, 1 perm -> 1 pos, 1 neg
1 perm, 1 var -> 1 neg, 1 pos
Lezione 3
21
Option Explicit
Private Sub Radici_Click()
Dim a As Double, b As Double
Dim c As Double, delta As Double
Dim permanenza As Integer
a = Range("A5")
b = Range("B5")
c = Range("C5")
delta = b ^ 2 - 4 * a * c
If delta < 0 Then
Range("D5") = "coniugate complesse"
ElseIf delta = 0 Then
Range("D5") = "coincidenti"
Else
Range("D5") = "2 distinte"
'segno delle radici
permanenza = 0
If a * b > 0 Then
permanenza = permanenza + 1
End If
If b * c > 0 Then
permanenza = permanenza + 1
End If
If permanenza = 2 Then
Range("F5") = "2 radici negative"
ElseIf permanenza = 0 Then
Range("F5") = "2 radici positive"
Else
Range("F5") = "1 radice positiva ed 1 negativa"
End If
End If
End Sub
EP 11/12 - PB
Lezione 3
22
Scarica

Lezione 03