A15. Gli Array
Array a una dimensione
Gli array, o vettori, sono spazi di memoria in cui vengono immagazzianti in massa più variabili dello stesso tipo, accessibili tramite
un indice. Prendiamo un problema semplice che capita spesso: la struttura del programma richiede che siano utilizzate moltissime variabili
dello stesso tipo. Quello che verrebbe spontaneo scrivere a una persona che non conosce gli array è:
Il programmatore navigato, invece, dichiara un array, molto più semplice, molto più sicuro, molto più maneggevole. La sintassi con cui si dichiara in generale un array è questa:Dim n1, n2, n3, n4, n5, n6, n7, ..., nnAs int16
Risulta un pò complicato da capire all'inizio, specialmente per i '-1', ma vediamo subito come viene realmente applicato, in un programma, questo particolare tipo:Dim [nome]([numero elementi - 1])As [tipo]
Vi potrebbero sorgere dei dubbi: perchè quelle I+1? Perchè L'array di voti contiene 9 elementi invece che 10? Una risposta và data subito, onde confondere le idee: quando si dichiara un array, tra parentesi non và effettivamente specificato il numero di elementi, ma l'indice più alto possibile per quell'array, ossia il numero di elementi meno 1, poichè si inzia sempre a contare dallo 0! Infatti, dichiarando un array in questo modo:Module Module1Sub Main()'Calcola la media dei voti Dim IAs Int16Dim Voti(9), Media, SommaAs Single For I = 0To 9 Console.WriteLine("Inserire il voto numero " & (I + 1) & _ " (immettere 0 per terminare):")'Ricordate che in numeri decimali da tastiera hanno la virgola, ' Voti(I) = Console.ReadLinenon il punto! If Voti(I) = 0Then Exit For 'Esce dal ciclo End If Next 'Calcolo della media For I = 0To 9If Voti(I) = 0Then I -= 1'Decrementa I, perchè l'I corrente corrisponde ad un voto nullo Exit For End If Somma += Voti(I)Next Media = Somma / (I + 1) Console.WriteLine("La tua media è: " & Media) Console.ReadKey()End Sub End Module
diciamo al computer che devono essere presenti tutti questi elementi:Dim Voti(9)As Single
Voti(0) Voti(1) Voti(2) Voti(3) Voti(4) Voti(5) Voti(6) Voti(7) Voti(8) Voti(9)Che sono esattamente 10 elementi!
Nel programma scritto, I+1 serve per fornire un riferimento ad un numero non-nullo, infatti si inizia da 0. Non si potrebbe aver scritto, ad esempio, "Inserire il voto numero 0", o dividere la somma per 0 per ottenere la media.
Prima di terminare vorrei far notare un modo molto più veloce di dichiarare un array usando le parentesi graffe, in cui, però, non si deve mai specificare prima la dimensione dell'array:
Ricapitolando: dichiarando un array di elementi si dichiara, con lo stesso nome, una serie di variabili tutte dello stesso tipo che sono accessibili singolarmente specificando tra parentesi l'indice a loro associato.Dim Frase()As String = {"Buongiorno", "a", "tutti", "!", _ "Come", "state", "?"}
Array a più dimensioni
Esistono due modi per dichiarare array a più dimensioni: il primo consiste nel separare, all'interno delle parentesi tutti gli indici usati,
mentre il secondo fa uso di più coppie di parentesi per racchiudere più indici.
Entrambe le dichiarazioni sopra esposte creano un array a 3 dimensioni, ossia un vettore in cui è necessario specificare 3 indici per identificare univocamente un valore. Si potrebbe pensare a questi anche come array di array di array, ma la cosa risulterebbe troppo complicata. Come avrete notato, ho impostato solo il primo indice, 10, poichè non è possibile specificare in fase di dichiarazione la dimensione delle dimensioni aggiuntive di un array. Se volessimo rappresentare con questo array un piano di 10x10 punti dovremmo utilizzare questo codice:'Modo1 Dim A(10, , )As Int16'Modo2 Dim A(10)()()As int16
Suggerimento: Potete usare la parola chiave ReDim per ridimensionare un array:Dim Piano(9)()As Byte For IAs Byte = 0To 9ReDim Piano(9)(9)'Vedi oltre Next
ma in questo caso tutti i contenuti di V verranno eliminati. In alternativa si può usare la procedura Array.Resize([array],[dimensioni]) o ReDim Preserve per conservare i valori immagazzinati.Dim V(9)As Int16ReDim V(6)'Ridimensiona V a 7 elementi
Prima ci concludere il paragrafo è necessario evidenziare che gli array a più dimensioni non sono un tipo appartenente alle CLS del Framework .Net: infatti non tutti i linguaggi .net li supportano.
Il ciclo For Each
Il ciclo For Each è una struttura iterativa studiata appositamente per iterare attraverso array o collezioni di elementi in un modo semplice e
veloce. Il meccanismo nascosto dietro al ciclo è quanto mai complesso, almeno all'inizio, quindi lo tratterò in seguito, nella sezione Uso delle
Interfacce, sottosezione IEnumerable. La sintassi è simile al For normale, tuttavia qui non c'e un contatore numerico, ma un contatore oggetto,
che, ad ogni step, assume il valore dell'elemento corrente. Sintassi:
Ad esempio:Dim IAs [tipo]For Each IIn [array/collection] '... Next
L'output sarà:Dim Interi()As Int16 = {0, 4, -2, 60, 190, -3090}For Each NumeroAs Int16In Interi Console.WriteLine(Numero)Next
0 4 -2 60 190 -3090
Manipolazione degli array
La classe System.Array contiene molti metodi statici utili per la manipolazione degli array. I più usati sono:
- Clear(A, I, L) : cancella L elementi a partire dalla posizione I nell'array A
- Clone() : crea una coppia esatta dell'array
- ConstrainedCopy(A1, I1, A2, I2, L) : copia L elementi dall'array A1 a partire dall'indice I1 nell'array A2, a partire dall'indice I2; se la copia non ha successo, ogni cambiamento sarà annullato e l'array di destinazione non subirà alcun danno
- Copy(A1, A2, L) / CopyTo(A1, A2) : il primo metodo copia L elementi da A1 a A2 a partire dal primo, mentre il secondo fa una copia totale dell'array A1 e la deposita in A2
- Find / FindLast (A, P(Of T)) As T : cerca il primo elemento dell'array A per il quale la funzione generic Of T assegnata al delegate P restituisce un valore True, e ne ritorna il valore
- Find(A, P(Of T)) As T() : cerca tutti gli elementi dell'array A per i quali la funzione generic Of T assegnata al delegate P restituisce un valore True
- FindIndex / FindLastIndex (A, P(Of T)) As Int32 : cerca il primo o l'ultimo elemento dell'array A per il quale la funzione generic Of T assegnata al delegate P restituisce un valore True, e ne ritorna l'indice
- ForEach(A(Of T)) : esegue un'azione A determinata da un delegate Sub per ogni elemento dell'array
- GetLength(A) : restituisce la dimensione dell'array
- IndexOf(A, T) / LastIndexOf(A, T) : restituisce il primo o l'ultimo indice dell'oggetto T nell'array A
- Reverse(A) : inverte l'ordine di tutti gli elementi nell'array A
- Sort(A) : ordina alfabeticamente l'array A. Esistono 16 versioni di questa procedura, tra le quali una accetta come secondo parametro un oggetto che implementa un'interfaccia IComparer che permette di decidere come ordinare l'array
Array come campi di strutture
Gli array dichiarati come campi di strutture non possono avere un indice specificiato, ma devono rimanere
del tutto indeterminati. L'unico modo in cui è possibile determinare le dimensioni dell'array è
ridimensionarlo successivamente alla dichiarazione di una variabile struttura:
Structure PersonaDim Nome, CognomeAs String Dim Conoscenti()As PersonaEnd Structure '... Dim RAs Persona 'Solo qui si determinano le dimensioni dell'array ReDim R.Conoscenti(10)
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



