lez. 6 (11/12) - pbelementi di programmazione1 lezione 6 matrici matrici di parametri

34
Lez. 6 (11/12) - PB Elementi di Programmazione 1 Lezione 6 Matrici Matrici di parametri

Upload: gustavo-falcone

Post on 01-May-2015

220 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 1

Lezione 6

Matrici

Matrici di parametri

Page 2: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 2

Vettori e matrici

• Sono gruppi di variabili dello stesso tipo nelle quali si fa

riferimento agli elementi mediante un indice:

– possono avere una (vettori) o più dimensioni (matrici)

• Si userà matrice per indicare entrambi i casi

– la dimensione può essere fissa o dinamica

– gli indici partono da 0:

• Si può fare in modo che gli indici partano sempre da 1, come le

celle di Excel, scrivendo all’inizio del modulo fuori da tutte le routine:

Option Base 1

• si può modificare il punto di inizio e di fine dell’indice

Page 3: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 3

Una matrice monodimensionaleVETTORE

• Dim v(n)

0 1 2 n

v

v(2)

Page 4: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 4

Option Explicit

Sub prova_vettore()

Dim v(3) As Integer, i As Integer

For i = 0 To 3

v(i) = InputBox("dammi intero " & i & ": ")

Range("B" & (i + 1)).Value = v(i)

v(i) = v(i) * 2

Range("C" & (i + 1)).Value = v(i)

Next

End Sub

Esempio 1

Page 5: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 5

Matrici (1)

• Il singolo elemento di una matrice è una variabile del tipo con cui è formata la matrice– Nelle matrici di tipo Variant possono essere

presenti sia elementi di tipo numerico che di tipo stringa

• Le matrici son passate solo per riferimento (ByRef) ad una routine

• Le matrici NON POSSONO essere– Assegnate in blocco– Confrontate in blocco

Page 6: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 6

Matrici (2)

Le matrici NON POSSONO essere

–Assegnate in blocco

–Confrontate in blocco

Page 7: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 7

Matrici statiche

• La dichiarazione avviene specificando il numero di elementi di ogni dimensione:

Dim nomeMatrice(dim1, ...,dimN) As Tipo

– Se si cerca di accedere ad un elemento oltre le dimensioni viene generato un errore di esecuzione

– Le variabili di tipo numerico sono inizializzate a 0, quelle di tipo Variant ad Empty

• Ci si riferisce ad un elemento attraverso le sue coordinate:

nomeMatrice(coord1, ...,coordN)

Page 8: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 8

Matrice bidimensionaleMATRICE

Dim matri(3,2)

1 2

1

2

3

1

3

12 4

20

61

matri(3,1)

Page 9: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 9

Matrice multi-mensionaleMATRICE…

Dim multimatri(3,4,5)

multimatri(2,4,1)

123

1 2 3 4

54

21

3

Page 10: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 10

Option Explicit

Sub prova ()

Dim vet(3) As Double Dim matr(4, 3) As Double

End Sub

Esempio MatriciDefinizione

Page 11: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 11

Option Explicit

Sub prova ()

Dim vet(3) As Double, matr(4, 3) As Double Dim i, j As Integer For i = 0 To 3 vet(i) = Rnd Next

For i = 0 To 4 For j = 0 To 3 matr(i, j) = Rnd Next Next

End Sub

Esempio MatriciValorizzazione

Page 12: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 12

Option ExplicitSub provaVettore() Dim vet(3) As Double, matr(4, 3) As Double Dim i, j As Integer...... Range("A1").Value = "vettore" For i = 0 To 3 Cells(1, i + 2).Value = vet(i) Next

Range("A3").Value = "matrice" For i = 0 To 4 For j = 0 To 3 Cells(3 + j, i + 2).Value = matr(i, j) Next NextEnd Sub

Esempio MatriciAccesso agli elementi

Page 13: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 13

Option ExplicitSub provaVettore() Dim vet(3) As Double, matr(4, 3) As Double Dim i, j As Integer For i = 0 To 3 vet(i) = Rnd Next For i = 0 To 4 For j = 0 To 3 matr(i, j) = Rnd Next Next Range("A1").Value = "vettore" For i = 0 To 3 Cells(1, i + 2).Value = vet(i) Next Range("A3").Value = "matrice" For i = 0 To 4 For j = 0 To 3 Cells(3 + j, i + 2).Value = matr(i, j) Next NextEnd Sub

Page 14: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 14

Problema 1• Scrivere un sub in VBA che

– carica un matrice 2x3 di double di nome Mt chiedendo all’utente di inserire i valori

– somma tutti gli elementi contenuti nella matrice

• la prima coordinata indica le righe, la seconda le colonne

– memorizza il risultato nella cella (1,1)

0 1 2Mt 0 (0,0) (0,1) (0,2) 2 5 6.5 1 (1,0) (1,1) (1,2) -6.5 8 3

Page 15: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 15

Soluzione 1Option Explicit

Sub matrix() Dim Mt(1, 2) As Double Dim som As Double Dim i As Integer, Dim j As Integer

som = 0 For i = 0 To 1 For j = 0 To 2 Mt(i, j) = InputBox("valore (" & i & "," & j & "): ") som = som + Mt(i, j) Next Next

Cells(1, 1) = somEnd Sub

Page 16: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 16

Matrici statiche (1)

• In VB è possibile indicare esplicitamente l’intervallo di

variazione degli indici:

Dim nmMatr (da1 To a1, ..., daN To aN)

• E’ possibile conoscere quali sono i valori degli indici

minimo e massimo di una matrice grazie a

LBound(NomeMatrice, dimensione)

UBound(NomeMatrice, dimensione)– Se non specificato dimensione vale 1

– E’ meglio usare i valori di queste funzioni per gestire le matrici

Page 17: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 17

Esempio Vettore (1)Sub provaVettore() Dim vet(3) As Double, i As Integer

For i = LBound(vet) To UBound(vet) vet(i) = Rnd Next Range("A1").Value = "vettore" For i = LBound(vet) To UBound(vet) Cells(1, i + 2).Value = vet(i) Next

End Sub

Page 18: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 18

Esempio Vettore (2)

Sub provaIndici() Dim Vet(5 To 9) As Double Dim i As Integer

For i = LBound(Vet) To UBound(Vet) Vet(i) = i * 10 Next

For i = LBound(Vet) To UBound(Vet) Cells(6, i + 2).Value = Vet(i) NextEnd Sub

Page 19: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 19

Esempio MatriceSub provaMatrice() Dim matr(4, 3) As Double, i As Integer, j As Integer For i = LBound(matr, 1) To UBound(matr, 1) For j = LBound(matr, 2) To UBound(matr, 2) matr(i, j) = Rnd Next Next Range("A3").Value = "matrice" For i = LBound(matr, 1) To UBound(matr, 1) For j = LBound(matr, 2) To UBound(matr, 2) Cells(3 + j, i + 2).Value = matr(i, j) Next NextEnd Sub

Page 20: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 20

Problema 2

• Scrivere una funzione che legge il contenuto delle celle da A1 ad A5 e lo memorizza in un vettore

• lo raddoppia e lo scrive nelle celle da B7 in poi

Page 21: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 21

Option ExplicitOption Base 1Sub matri() Dim celle(5) As Double, i As Integer For i = LBound(celle) To UBound(celle) celle(i) = Cells(i, 1).Value Next For i = LBound(celle) To UBound(celle) Cells(i + 6, 2).Value = celle(i) * 2 NextEnd Sub

Soluzione 2

Page 22: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 22

Considerazione su Matrici e Cicli

• per fare la scansione di una matrice uso tanti cicli FOR quanti sono le dimensioni– Vettore: 1 ciclo– Matrice: 2 cicli– Matrice n-dimensionale: n cicli

• Ma se non devo fare una scansione completa non sempre vale questa regola !!

Page 23: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 23

Matrici dinamiche

• Le matrici dinamiche possono cambiare la loro dimensione durante l’esecuzione

Dim nmMatrDin() As Tipo– Prima dell’uso la matrice va dimensionata:

ReDim nmMatrDim(dim1, ..., dimN)• Una matrice può essere ridimensionata più volte durante

l’esecuzione

– Ogni ridimensionamento fa perdere il contenuto precedente a meno di usare l’opzione Preserve.

• Dimi può essere l’estremo superiore oppure un intervallo (valoreIniziale To ValoreFinale)

Page 24: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 24

Matrici dinamicheSub matrDin() Dim nD() As Double Dim i, j As Integer ReDim nD(8) For i = LBound(nD) To UBound(nD) nD(i) = i Cells(1, i + 1).Value = nD(i) Next ReDim nD(4, 8 To 13) For i = LBound(nD, 1) To UBound(nD, 1) For j = LBound(nD, 2) To UBound(nD, 2) nD(i, j) = i * j + 100 Cells(3 + i, j + 1) = nD(i, j) Next NextEnd Sub

Modifica estremo superiore prima dimensione

Modifica estremoInferiore e superiore dellaseconda dimensione

Page 25: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 25

Option Explicit

Option Base 1

Sub allunga()

Dim vt() As Double

Dim vDim As Integer, i As Integer, j As Integer

ReDim vt(4)

For i = LBound(vt) To UBound(vt)

vt(i) = Rnd: Cells(1, i) = vt(i)

Next

vDim = UBound(vt)

ReDim vt(8, 2)

For i = LBound(vt) To UBound(vt)

For j = LBound(vt, 2) To UBound(vt, 2)

vt(i, j) = Rnd

Next: Next

For i = LBound(vt) To UBound(vt)

For j = LBound(vt, 2) To UBound(vt, 2)

Cells(2 + i, j) = vt(i, j)

Next: Next

End Sub

Page 26: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

For i = LBound(vt) To UBound(vt)

vt(i) = Rnd: Cells(1, i) = vt(i)

Next

For i = LBound(vt) To UBound(vt)

For j = LBound(vt, 2) To UBound(vt, 2)

vt(i, j) = Rnd

Next: Next

MsgBox ("Il numero complessivo di elementi è : [" _

& ((UBound(vt) - LBoud(vt)) * _

(UBound(vt, 2) - LBoud(vt, 2))) & "]")

• L’uso di “:” permette di inserire più istruzioni in un’unica riga

• L’uso di “_” permette di continuare un’istruzione nella riga seguente

Lez. 6 (11/12) - PB Elementi di Programmazione 26

Note

“:”

“_”

Page 27: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 27

Matrici Dinamiche

• L’uso di ReDim con l’opzione

Preserve impedisce la modifica:– Delle dimensioni della matrice eccetto l’ultima

• In un vettore a due dimensioni posso modificare solo la seconda

• In un vettore ad una dimensione posso modificare la dimensione

– Del numero delle dimensioni

– Del tipo della matrice • Il tipo della matrice è modificabile quando non si usa Preserve e

solo se il tipo è Variant

Page 28: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 28

Matrici DinamicheOption Base 1

Sub matrDinPre()

Dim nD() As Double

Dim i, j As Integer

ReDim nD(8)

For i = LBound(nD) To UBound(nD)

nD(i) = i

Cells(2, i + 1).Value = nD(i)

Next

ReDim Preserve nD(12)

For i = LBound(nD) To UBound(nD)

nD(i) = i * 1000

Cells(3, i + 1) = nD(i)

Next

End Sub

Page 29: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 29

Matrici come Parametri• Le matrici devono essere passate per riferimento ad una routine

Sub carica(v() As Double) Dim i As Integer For i = LBound(v) To UBound(v) v(i) = InputBox("dammi un valore") NextEnd SubSub stampaFoglio(v() As Double, cx As Integer, cy As Integer) Dim i As Integer For i = LBound(v) To UBound(v) Cells(cx, cy + i) = v(i) NextEnd SubSub x() Dim vt(5) As Double, vq() As Double Call carica(vt): Call stampaFoglio(vt, 1, 1)End Sub

Page 30: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 30

Matrici di Parametri

• In VB è possibile richiamare con un numero di parametri non fissato a priori usando le matrici di parametri– Il parametro è preceduto dalla parola chiave ParamArray ed è di tipo Variant

– è sempre l’ultimo elemento di una lista di parametri

Page 31: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 31

Matrici di ParametriOption Explicit: Option Base 1Function argoVar(uno As Integer, _ ParamArray vari() As Variant) Dim i As Integer, s As String s = "" For i = LBound(vari) To UBound(vari) s = s & i & " " & vari(i) & vbNewLine Next MsgBox ("uno vale " & uno & vbNewLine & s) argoVar = UBound(vari)End FunctionSub usaArgVar() Dim uno As Integer, due As Integer uno = argoVar(8, "wer", 890, 34.78) due = argoVar(800, 0.78, "casa") MsgBox ("-> " & uno & vbNewLine & " --> " & due)End Sub

Page 32: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 32

Riferirsi ad intervalli di celle

• Per le routine può essere necessario riferirsi a

blocchi di celle di un foglio di lavoro

– Per avere una interazione corretta basta ricordare:• Un intervallo di celle è SEMPRE una matrice bidimensionale

• Una singola cella non è una matrice

– Il predicato IsArray(variabile) restituisce True se la

variabile è una matrice

• Il parametro che indica l’intervallo va passato come

Variant e va poi assegnato ad una variabile locale di tipo

Variant

Page 33: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 33

Riferirsi ad intervalli di celleFunction interv(inte As Variant) As Double Dim X As Variant Dim i As Integer, j As Integer X = inte interv = 0 If IsArray(X) Then For i = LBound(X) To UBound(X) For j = LBound(X, 2) To UBound(X, 2) if IsNumeric(X(i,j)) Then interv = interv + X(i, j) EndIf Next: Next End IfEnd Function

Sub total() Range("A10").Value = interv(Range("a1:d5"))End Sub

Page 34: Lez. 6 (11/12) - PBElementi di Programmazione1 Lezione 6 Matrici Matrici di parametri

Lez. 6 (11/12) - PB Elementi di Programmazione 34

Riferirsi ad intervalli di celleFunction interParam(ParamArray inte() As Variant) As Double Dim X As Variant Dim i As Integer, j As Integer, k As Integer interParam = 0 For k = LBound(inte) To UBound(inte) X = inte(k) If IsArray(X) Then For i = LBound(X) To UBound(X) For j = LBound(X, 2) To UBound(X, 2) If IsNumeric(X(i, j)) Then interParam = interParam + X(i, j) End If Next: Next End If Next End Function

Sub total() Range("A10").Value = interParam(Range("a1:d5")) Range("B10").Value = interParam(Range("d5")) Range("C10").Value = interParam(Range("a1:a2")) Range("C11").Value = interParam(Range("b1:c4")) Range("D10").Value = interParam(Range("a1:a2"), Range("b1:c4"))End Sub