Array Raffaella Brighi, a.a. 2005/06 Corso di Algoritmi e programmazione. A.A. 2005-06 CdL Operatore Informatico Giuridico. Gli array Gli array sono utilizzati per raggruppare e organizzare i dati. Un array è una lista di valori ognuno dei quali viene memorizzato in una posizione ben precisa della struttura: il numero corrispondente alla posizione si chiama indice. Un array è caratterizzato da: nome dimensione (numero di elementi) tipo Per accedere a un valore dell’array si utilizza il suo nome seguito dall’indice racchiuso tra parentesi quadre. L’indice è sempre un numero intero e parte da ZERO. altezza[8] si riferisce al nono valore della lista (= al valore che ha indice 8) cioè a 79 altezza [0] si riferisce al primo valore della lista (= al valore che ha indice 0) cioè a 55 l’indice può essere rappresentato da un espressione altezza[n] l’elemento con indice n della lista altezza[(int) Math.random()*11] altezza 0 1 2 3 4 5 6 7 8 9 10 55 61 70 74 62 69 66 73 79 62 10 1 Gli elementi dell’array, identificati attraverso l’indice, sono usati come normali variabili: cioè possono essere assegnati o utilizzati all’interno di espressioni. altezza[2]=72 somma= altezza[1] + altezza[2] + altezza[3] System.out.println (“il valore è ” + altezza [1]) Un array contiene valori dello stesso tipo: si può creare un array che contenga interi o che contenga stringhe ma non un array che contiene sia stringhe sia interi Un array è un oggetto: deve essere dichiarato e creato. Al momento del new viene istanziato lo spazio di memoria. Dichiarazione di un array int [] altezza; altezza = new int [11]; oppure int[] altezza = new int [11] int indica che l’array altezza contiene interi 11 è la dimensione dell’array (l’array contiene 11 elementi da 0 a 10) il simbolo [] è l’operatore indice. ha la precedenza su qualsiasi altra operazione. esegue il controllo dei limiti: se l’indice dell’elemento richiesto è superiore alla lunghezza dell’array restituisce un errore es altezza[20]. la costante lenght dell’oggetto array riporta il numero di elementi dell’array es. altezza.lenght vale 11 gli elementi di un array vengono generalemente manipolati dentro a cicli for 2 Liste di inizializzazione un array può essere istanziato anche attraverso una lista di inizializzazione che elenca i valori iniziali di ogni elemento dell’array int[] primes ={2, 3, 5, 7, 11, 13, 17, 19} dichiara e crea un array con 8 elementi Esercizi Definire un array di 15 elementi e inizializzarlo con valori uguali al valore dell’indice moltiplicato per 10. impostare a 1000 il sesto elemento dell’array e stampare i risultati. Scrivere una classe per la gestione di un elenco di 10 numeri interi. Il costruttore della classe legge da tastiera i 10 numeri. La classe fornisce i seguenti servizi: (1) stampa gli elementi dell’elenco dall’ultimo al primo e (2) stampare il valore del numero più grande della lista. Scrivere un programma che letta una parola dall’input la stampi al contrario. Si utilizzi un array. 3 Array come parametri Attenzione: gli array possono essere passati come parametri ma essendo oggetti viene passato un riferimento all’oggetto. I cambiamenti che il metodo fa sugli elementi dell’array sono dunque permanenti. Array di oggetti Array di stringhe String[] parole = new String[25] L’istruzione precedente dichiara e istanzia un array che si chiama parole e contiene 25 elementi ognuno dei quali è un riferimento ad un oggetto di tipo di String. Quindi ogni elemento deve a sua volta essere creato separatamente. parole[1]= new String (“ciao”); Gli array possono contenere riferimenti ad oggetti di qualsiasi tipo, anche relativi a classi create da noi (es. Coin) 4 Esercizio Creare un classe che presa in input una frase: stampi le parole di cui è composta la frase in ordine inverso stampi la la parola più corta stampi la parola più lunga Ordinamento E’ il processo che riorganizza una lista di elementi secondo un ordine ben definito. Es. ordine alfabetico, ordine crescente/decrescente. Sono stati studiati e analizzati numerosi algoritmi di ordinamento. Ordinamento per selezione: si basa sullo scambio degli elementi dell’array 5 Ordinamento per selezione Scandisci a destra partendo da 3. 1 è più piccolo. Scambia 1 e 3. 3 9 6 1 2 Scandisci a destra partendo da 9. 2 è più piccolo. Scambia 9 e 2. 1 9 6 3 2 Scandisci a destra partendo da 6. 3 è più piccolo. Scambia 6 e 3. 1 2 6 3 9 Scandisci a destra partendo da 6. 6 è più piccolo. Scambia 6 e 6. 1 2 3 6 9 1 2 3 6 9 Implementazione dell’algoritmo L’algoritmo si realizza con due cicli for annidati: il ciclo più esterno controlla la posizione dell’array in cui sarà memorizzato il successivo valore (0, 1, 2, 3, …, ) il ciclo più interno cerca il min a partire dalla posizione successiva alla posizione individuata dal primo ciclo fino alla fine dell’array Scambio dei due valori: per scambiare il contenuto di due variabili occorre sempre una variabile di appoggio temporanea. L’algoritmo si chiama SWAP. es. sia A=5 e B=3 si vogliono scambiare i due valori: TEMP=B B=A A=B 6 Implementazione dell’algoritmo public void selectionSort (int[] numeri) { int min, temp; for (int index=0, index< numeri.lenght -1; index++) { min=index; for (int scan=index+1; scan < numeri.lenght; scan++) { if ( numeri[scan] < numeri[min]) then min=scan; } // swap temp=numeri[min]; numeri[min]=numeri[index]; numeri[index]=temp; } } Esercizio Scrivere una classe che, lette dall’input un elenco di parole, offra i seguenti servizi : stampa delle parole in ordine inverso stampa delle parole che compongono la frase in ordine alfabetico 7 La classe Vector (java.util) Offre servizi simili all’array, perché permette di memorizzare una lista di valori e di accedervi tramite un indice. Può cambiare dinamicamente la sua dimensione e gli elementi possono essere inseriti e rimossi: quando si aggiungono elementi in posizione k l’indice degli altri elementi slitta di conseguenza e quando viene cancellato un elemento del vettore la lista degli elementi collassa in modo da non lasciare buchi. Non sono obbligati a contenere oggetti dello stesso tipo: ogni elemento è un riferimento ad un oggetto di tipo Object. Vector() costruttore – crea un vettore inizialmente vuoto void addElement (Object obj) void insertElementAt (Object obj, int index) void setElement (Object obj, int index) Object removeElement (Object obj) void removeElement (int index) void clear () boolean contains (Object obj) int indexOf (Object obj) Object ElementAt (int index) boolean isEmpty () int size () 8 Esercizio Creare la lista di calciatori di una squadra di calcio: Buffon, Panucci, Cannavaro, Nesta, Zambrotta, Camoranesi, Gattuso, Totti, Pirlo, Gilardino, Toni. Sostituire Gilardino con Del Piero. Stampare il numero della posizione di Cannavaro. Eliminare Totti. Togliere Panucci ed inserire Vieri in posizione 9. Stampare la nuova composizione della squadra ad ogni cambiamento import java.util.*; public class GestSquadra { public GestSquadra() { } public static void main(String[] args) { // TODO code application logic here Vector squadra =new Vector(); squadra.addElement("Buffon"); squadra.addElement("Panucci"); squadra.addElement("Cannavaro"); squadra.addElement("Nesta"); squadra.addElement("Zambrotta"); squadra.addElement("Camoranesi"); squadra.addElement("Gattuso"); squadra.addElement("Totti"); squadra.addElement("Pirlo"); squadra.addElement("Gilardino"); squadra.addElement("Toni"); System.out.println (squadra); int index; index=squadra.indexOf("Gilardino"); squadra.setElementAt("Del Piero", index); System.out.println (squadra); squadra.removeElement("Totti"); System.out.println (squadra); squadra.removeElement("Panucci"); squadra.insertElementAt("Vieri", 9); System.out.println (squadra); } } 9