Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
Loop WHILE/UNTIL Condizione_DI_Uscita
Questa tipologia potrebbe essere eseguita all'infinito quindi è necessario sincerarsi che si verifichi almeno una volta la condizione di uscita, che permette l'arresto dell'esecuzione.
Esempio: una subroutine che utilizza il ciclo Do Loop
Public Sub DL()
Dim i As Integer
i = 1
Debug.Print("Primo esempio i = " & i) 'mostro primo valore del contatore
'ciclo while classico
Do While i<10 'fai il ciclo fino a quando il contatore è minore di dieci
i = i + 2 'incremento di due il contatore, come esempio
Debug.Print(i)
Loop
'ciclo while - secondo esempio
Debug.Print("Secondo esempio i = " & i)
Do While i<9 'in questo caso non parte perché prima ho portato i a 10
Loop
'ciclo while - terzo esempio
sempre basato su While ma almeno una volta viene eseguito
Do
i = i + 2
Debug.Print(i)
Loop While i<9
'ciclo while - quarto
esempioesempio: vediamo come convertire un numero in base 10 a base 2.
Per convertire un numero a base 2 da base 10 si avanza per iterazioni sino a quando il quoziente del divisore risulta uguale a zero.
Con il ciclo while la procedura sarà quella di andare a leggere il resto della divisione sino a quando non si verificherà una condizione.
Public Function Binario(Dec As Integer) As Long
Dim R As Integer, Q As Integer
Dim S_Bin As String
Do
Q = Dec \ 2
R = Dec - Q*2
'Il numero che ora devo andare a dividere deve essere scambiato: a ogni iterazione devo andare a dividere il risultato della divisione intera precedentemente svolta.
Dec = Q
S_Bin = CStr(R) & S_Bin 'incollo ogni volta il valore del risultato
Loop Until Q = 0
'Rimane ora da scrivere la funzione di uscita: riconverto stringa in long
Binario = CLng(S_Bin)
End Function
Le variabili Para-standard
Approfondiremo queste tre tipologie di variabili para-standard: Enum, Type, Vettori a Matrice.
Ogni volta che creo una
nuova variabile di tipo personalizzata è opportuno andare a farlo in un nuovo modulo, destinato esclusivamente per la personalizzazione e la configurazione delle variabili. Il nome che segue Enum è il nome del tipo, non il nome della variabile!
Enum OperazioniEnum è un tipo di insieme che può assumere solo un determinato numero di elementi che vado ad inserire in elenco
Somma = 1 stiamo creando etichette che saranno richiamate
Differenza = 2
Moltiplicazione = 3
Divisione = 4
End Enum
esempio: operazioni matematiche dopo aver definito una variabile di tipo enum
[le funzioni vengono scritte in un modulo a parte - non dove sono personalizzate le variabili]
Public Function Operations(A As Integer, B As Integer, Op As Operazioni) As Integer
If Op = "1" Then Operations = A + B
If Op = "2" Then Operations = A - B
If Op = "3" Then Operations = A * B
If Op = "2" Then Operations = A / B
End Function
Per rendere ancora più chiaro il
funzionamento del codice andiamo ad utilizzare ilSelect Case
il quale permette di selezionare una procedura a seconda dell'input che viene fornito dall'utente: completando ora l'esempio di prima:
Public Function Operations(A As Integer, B As Integer, Op As Operazioni) As Integer
Select Case Op
Case 1: Operations = A + B
Case 2: Operations = A - B
Case 3: Operations = A * B
Case 4: Operations = A / B
Case Else: condizione di uscita o allert in questo caso inutile
End Select
End Function
La funzione Para-Standard Record
(o detta anche Type
) ha una struttura tabellare, simile a quella di un DataBase. È una tipologia di variabile simile a quella delle enumerato vista ora però, più precisamente, Type
è una sorta di scatola personalizzata con le dimensioni che vengono stabilite dal programmatore al cui interno vado a porre delle ulteriori scatole più piccole. Ogni piccola scatola è una caratteristica della variabile, in questo esempio che siillustrare il nome, cognome, matricola, data di nascita e età di uno studente utilizzando tag html.
<p>Type Student</p>
<p>Name As String</p>
<p>Cognome As String</p>
<p>Matricola As String</p>
<p>DoB As Date</p>
<p>Age As Integer</p>
<p>End Type</p>
<p>Definire una variabile studente pertanto significherà settare in modo prestabilito il contenuto che questa</p>
<p>variabile deve avere. Per attribuire i valori alla variabile Student nelle "scatole" corrette allora devo</p>
<p>specificare:</p>
<p>Dim St As Student</p>
<p>St.Name = Mario</p>
<p>St.Age = 10</p>
<p>Lezione 5 - 01/10</p>
<p>Riprendiamo l'argomento della scorsa lezione, vale a dire il record o type.</p>
<p>Type Student</p>
<p>Name As String</p>
<p>Surname As String</p>
<p>DoB As Date</p>
<p>St_Id As String</p>
<p>Age As Integer</p>
<p>End Type</p>
<p>A questo punto, nel modulo per le funzioni e procedure, creiamo una semplice sub che restituisce un</p>
<p>studente: si noti che questa può essere utilizzata sia come funzione di input sia come funzione di output.</p>
<p>Uno dei modi per "stampare" un tipo di dato personalizzato è</p>
```html
quello di usare una struttura ricorsiva. La funzione riceverà un nome e un cognome, opzionalmente una data, e crea uno studente: solo a questo punto verrà creata in automatico una matricola e un'età calcolata in funzione della data di nascita e la data corrente.
Public Function Make_St(Nm As String, Sm As String, _Optional D As Date = #01/01/1900#) As Student
'a questo punto devo creare lo studente in funzione del Type personalizzato
per assegnare si usa la dicitura Make
Make_St.Name = Nm
Make_St.Surname = Sm
//il metodo più pratico è quello di usare la funzione DateSerial
If D = #01/01/1900# Then
Make.St.DoB = DateSerial(1990 +Int(Rnd()*20),1+Int(Rnd()*12),1)
Else Make.St.DoB = D
End If
Make_St.St_Id = CStr(Int(Rnd()*10000)) & UCase(Left(Nm,1)) & UCase(Left(Sm,1))
'età deve essere in funzione della data attuale quindi nella sua assegnazione andiamo a scrivere una apposita funzione che qui richiamiamo
Make_St.Age = Age(Make_St.DoB)
```
<html>
<head>
<title>Function</title>
</head>
<body>
<p>Creiamo la funzione che trasforma una data di nascita in una età in funzione della data attuale: usiamo una predefinita DateDiff che chiede un intervallo temporale, ossia la data di nascita e la data attuale. Per mettere la data attuale posso usare la funzione Date oppure la funzione Now che fornisce anche l'ora.</p>
<p>Public Function Age(DoB As Date) As Integer<br>Dim Today As Date<br>Today = Date<br>Age = DateDiff("yyyy",D,Date)<br>If Mounth(DoB) > Mounth(Today) _Or (Month(DoB) = Month(Today) And Day(DoB) > Day(Today)) _Then Age = Age -1<br>End Function</p>
<p>Per testare:</p>
<p>Public Sub Prova_St(name As String, surname As String)<br>Dim S1 As Student<br>S1 = Make_St(name,surname)<br>debug.print(S1.surname)<br>debug.print(S1.St_Id)<br>debug.print(S1.Age)<br>End Sub</p>
<p>Prima di passare alla stesura dell'esercizio completo vediamo prima alcune definizioni particolari riguardo ai vettori: di seguito analizziamo come dimensionare un vettore e come creare una matrice utilizzando vettori riga e vettori colonna.</p>
</body>
</html>
Public Sub V_M()
Dim Arr(1 To 5) As Integer
Dim Idx As Integer
Dim Mx(1 To 2, 1 To 2) As Integer
'indicizzo la matrice con le sue dimensioni 2X2
'definisco una array, un vettore che conterrà interi. Ne indicizzo 5.
'per sapere indicizzazione in VbA si usano Lbound(vettore) o Ubound(vettore) rispettivamente indice di partenza di arrivo del vettore.
Arr(1) = 1
Arr(2) = 2
For Idx = Lbound(Arr) To Ubound(Arr)
Arr2(Idx) = Arr(Idx)
Next Idx
End Sub
Creiamo una matrice identità 2X2.
Mx(1,1) = 1
Mx(2,2) = 1
Altrimenti
For r = 1 To 2
For c = 1 To 2
if r = c Then Mx(r,c) = 1
Next c
Next r
S_M = Mx(1,1) & " " & Mx(1,2) & vbNewLine
S_M = S_M & Mx (2,1) & " " & Mx(2,2)
ESERCIZIO: simulazione delgioco della roulette
Come prima cosa dobbiamo creare una variabile personalizzata per creare una struttura dati che rappresenti la tabella con tutte le giocate effettuate. Per farlo, andiamo a tipizzare una variabile Type in un apposito modulo contenente queste informazioni.
```html
Type GumblingBet (1 To 100) As Double quanto scommetto
Win (1 To 100) As Double quanto vinco
N_Bet (1 To 100) As Int numero sul quale puntato
N_Win (1 To 100) As Int numero vincente
End Type
```
In un modulo a parte vado ora a simulare il comportamento di 100 giocate.
```html
Public Function Sim_Gumbling_(mx As Integer) As Gumbling 'simulo le cento giocate
Dim G As Gumbling 'creo tabella
Dim I As Integer
For i = 1 To 100
G.Bet(i) = Rnd()*mx + 1 'quanto scommetto alla giocata i-esima
'serve una funzione che restituisca un numero tra 1 e 36
G.N_Bet = Rnd_Btw(1,36) 'numero su cui scommetto alla giocata i-esima
G.N_Win = Rnd_Btw(0,36) 'numero vincente alla giocata i-esima
'scrivo una funzione esterna per la
```verifica della vincita
G.N_Win = Win(G.Bet(i),G.N_Bet(i), G.N_Win(i))
i
Function
Function Rnd_Btw(lw As Integer, Hg As Integer)
Rnd_Btw = lw + Rnd()*(Hg-lw+1)
Function>
Function Win(Bet As Double, N_g As Integer, N_w As integer)
If N_g = N_w Then Win = 36*Bet
Else Win = -Bet
End If
Function>
Dobbiamo ora creare una struttura di dati che contenga i numeri giocati e i numeri vincenti per ogni estrazione.
La tabella sarà di 4 colonne: la puntata (valore), profitto o perdita, numero giocato e numero vincente.
Ogni riga della tabella (Record) rappresenta una singola giocata. Per realizzare dal punto di vista informatico
abbiamo infatti creato una variabile Type "Gumbling" con 4 attributi ognuno dei quali può ospitare un valore:
sono in altre parole i vettori colonna di dimensione 100 che contengono ciascuno l'informazione che dobbiamo
acquisire e
gestire a seconda delle condizioni che si verificano.
Ora, dobbiamo creare questa funzione che possa creare l'intera tabella con una sorta di ciclo: per ogni esecuzione dovrà generare in maniera random la puntata, il numero scelto e il numero vincente. Qualora il numero vincente e quello giocato fossero coincidenti la puntata sarà vincente e opportunamente moltiplicata per il valore del banco.
Genero le 100 giocate in modo casuale.