Casino online











Mercato forex






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 è:
Dim n1, n2, n3, n4, n5, n6, n7, ..., nn As int16 
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 [nome]([numero elementi - 1]) As [tipo] 
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:
Module Module1
  Sub Main()
    'Calcola la media dei voti
    Dim I As Int16
    Dim Voti(9), Media, Somma As Single

    For I = 0 To 9
      Console.WriteLine("Inserire il voto numero " & (I + 1) & _
      " (immettere 0 per terminare):")
      'Ricordate che in numeri decimali da tastiera hanno la virgola, 
      'non il punto!
      Voti(I) = Console.ReadLine
      If Voti(I) = 0 Then
        Exit For 'Esce dal ciclo
      End If
    Next

    'Calcolo della media
    For I = 0 To 9
      If Voti(I) = 0 Then
        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 
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:
Dim Voti(9) As Single 
diciamo al computer che devono essere presenti tutti questi elementi:
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:
Dim Frase() As String = {"Buongiorno", "a", "tutti", "!", _ 
    "Come", "state", "?"} 
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.

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.
'Modo1
Dim A(10, , ) As Int16
'Modo2
Dim A(10)()() As int16 
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:
Dim Piano(9)() As Byte
For I As Byte = 0 To 9
  ReDim Piano(9)(9) 'Vedi oltre
Next 
Suggerimento: Potete usare la parola chiave ReDim per ridimensionare un array:
Dim V(9) As Int16
ReDim V(6) 'Ridimensiona V a 7 elementi 
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.
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:
Dim I As [tipo]

For Each I In [array/collection]
  '...
Next 
Ad esempio:
Dim Interi() As Int16 = {0, 4, -2, 60, 190, -3090}
For Each Numero As Int16 In Interi
  Console.WriteLine(Numero)
Next 
L'output sarà:
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
Molti di questi metodi, come si è visto, comprendono argomenti molto avanzati: quando sarete in grado di comprendere i Generics e i Delegate, ritornate a fare un salto in questo capitolo: scoprirete la potenza di questi metodi.


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 Persona
   Dim Nome, Cognome As String
   Dim Conoscenti() As Persona
End Structure
'...
Dim R As 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.