Fondamenti di Informatica Prof. Alfredo Cuzzocrea University of Trieste Dichiarazione, Creazione e Gestione di Array Credits to: Prof. D. Talia – UniCAL / Prof. C. Limongelli – UniROMA3 10110 Array in Java - creazione 01100 01011 La creazione fa una inizializzazione implicita: num = new int[10]; con valore 0 per int e double, false per i boolean. Dopo la creazione, un array ha lunghezza fissata (e non può cambiare nel programma tramite una nuova dichiarazione). Gli elementi di un array possono essere assegnati ad elementi di un array dello stesso tipo: int x[] = new int[10]; int y[] = new int[50]; x[3] = y[5]; 2 10110 Array in Java - copia 01100 01011 Se si vuole copiare un array in un altro: int vet1[] = new int[20]; int vet2[] = new int[20]; for(int i=0; i< 20; i++) vet1[i] = vet2[i]; Se si vuole copiare una parte di array in un altro: int vet3[] = new int[10]; for(int i=0; i< 10; i++) vet3[i] = vet1[i]; Per copiare la prima metà di vet1 in vet3. 3 10110 Array in Java - copia 01100 01011 Se si vuole copiare una parte di array in un altro: int vetA[] = new int[20]; int vetB[] = new int[10]; Per copiare la seconda metà di vetA in vetB. for(int i=0; i< 10; i++) vetB[i] = vetA[i+10]; oppure for(int i=10; i< 20; i++) vetB[i-10] = vetA[i]; 4 10110 Array in Java - copia 01100 01011 Se si vuole copiare gli elementi di vet1 in vet2 in ordine inverso: int vet1[] = new int[20]; int vet2[] = new int[20]; for(int i=0; i< 20; i++) vet2[i] = vet1[19-i]; 5 Array in Java - copia 10110 01100 01011 Se si vuole copiare da array ad array si può usare il metodo System.arraycopy(arr-orig, pos, arr-des, pos, cont) Esempi: System.arraycopy(vet1, 0, vet2, 0, 15); Copia i primi 15 elementi di vet1 in vet2 System.arraycopy(vet2, 5, vet3, 0, 10) Copia 10 elementi (a partire dal sesto) di vet2 in vet3. 6 10110 Array in Java – assegnamento tra array 01100 01011 Si possono assegnare anche array (ma bisogna porre attenzione a quello che accade se i due array non hanno lunghezza uguale !) x = y; Dopo questa operazione le due variabili fanno riferimento alla stessa locazione di memoria (quella di y); 3 1 3 1 x y x y 8 9 8 9 Prima 6 9 0 7 7 Dopo 6 9 0 7 7 7 10110 Array in Java - lunghezza 01100 01011 Ad ogni variabile array è associata implicitamente una variabile istanza length: int [] seq = new int[5] seq.length avrà valore 5 Esempi di uso - N = seq.length; assegna 5 ad N - System.out.println(seq.length); Visualizza il valore 5 Uso nel ciclo for - for(int i=0; i<vet1.length; i++) vet1[i] = vet2[i]; 8 10110 Array in Java – Massimo tra due numeri 01100 01011 class maxtraduenum { public static void main(String args[]) { int[] x; int max; x = new[2]; x[0]= Console.readInt("dammi il primo numero"); x[1]=Console.readInt("dammi il secondo numero"); if (x[0] > x[1]) max=x[0]; else max=x[1]; System.out.println ("Massimo = " + max); } } 9 10110 Array in Java – Massimo tra N numeri 01100 01011 class cercamassimo { public static void main(String args[]) { int[] seq; int max, ind; } seq = new int[10]; for (ind=0; ind < 10; ind++) { seq[ind] = Console.readInt("dammi un numero"); } max = seq[0]; for(ind=0; ind < 10; ind++) { if (seq[ind] > max) max = seq[ind]; } System.out.println ("Massimo = " + max); } 10 10110 Array Multidimensionali 01100 01011 Array bidimensionali In Java si possono avere array a più dimensioni. Gli array a due dimensioni in Java si realizzano come array di array. Dichiarazione: int [][] Matrice = new int[3][5]; [riga, colonna] Matrice[0] 12 3 27 74 0 Matrice[1] 4 15 33 -1 2 Matrice[2] 8 30 56 32 8 Matrice[1][3] 11 10110 Array Multidimensionali 01100 01011 Array bidimensionali Assegnamento di un elemento matrice[3][5] = 10; Assegnamento di una riga matrice[3] = {10, 15, 20, 25, 30, 35}; Il numero di righe è dato da int nrighe = matrice.length Il numero di colonne è dato da int ncolonne = matrice[0].length 12 10110 Array con righe di lunghezza variabile 01100 01011 In un array bidimensionale in Java si possono avere righe di lunghezza differente. Dichiarazione: int[][] tabella = new int[4][]; Assegnamento for(int i=0; i<tabella.length; i++) tabella[i] = new int[i+1]; 12 3 -6 21 0 7 2 54 80 45 13 Array – Leggere i valori di una matrice 10110 01100 01011 class matrice { . . . . . public void leggimatrice() { int[][] mat; int i,j; mat = new int[4][5]; } for (i=0; i < 4; i++) { for(j=0; j < 5; j++) mat[i][j]= Console.readInt("dammi un elemento"); } . . . . 14 Contenuti q Esercizi: § Lettura e stampa di un array § Massimo elemento di un array § Verifica sequenza crescente 2 Lettura e stampa di un array… q Scrivere un programma che legge da input 5 elementi interi, li memorizza in un array e stampa il contenuto dell’array import fiji.io.*; class LeggiScrivi{ public static void main(String[] args){ final int L=5; int[] a; a = new int[L]; leggi(a); System.out.println("** verifica acquisizione dati **"); stampa(a); } 3 …Lettura e stampa di un array public static void leggi(int[] v){ int i; System.out.println("scrivi " + v.length + “ interi"); for (i=0; i<v.length; i++) v[i] = Lettore.in.leggiInt(); System.out.println(); } public static void stampa(int[] v){ int i; System.out.println("array letto: "); for (i=0; i<v.length; i++) System.out.print(v[i] + " "); System.out.println(); } } 4 Esempio d’esecuzione scrivi 5 interi 2 4 6 8 10 ** verifica acquisizione dati ** array letto: 2 4 6 8 10 Press any key to continue . . . 5 Massimo elemento in un array q Scrivere un metodo int massimoArray(int[ ] a) che calcola e restituisce il valore del massimo elemento di un array di interi non vuoto a • massimoArray( new int[ ] { 3, 1, 2 } ) deve restituire 3 • massimoArray( new int[ ] { 3, 7, 5 } ) deve restituire 7 q Scrivere un metodo int posizioneMassimo(int[ ] a) che calcola la posizione dell’elemento di valore massimo di a • posizioneMassimo( new int[ ] { 3, 1, 2 } ) deve restituire 0 • posizioneMassimo( new int[ ] { 3, 1, 3 } ) può restituire 0 o 2 6 Considerazioni q Se calcoliamo solo l’elemento massimo non sappiamo in quale posizione si trova, q Se calcoliamo la posizione dell’elemento massimo, sappiamo anche accedere al valore relativo q Calcolare la posizione in cui si trova l’elemento massimo è un problema più generale e premette di risolvere entrambi gli esercizi 7 MassimoArray: verifica di correttezza . . . /* array con 1 solo elemento */ v = new int[] {1}; stampa(v); System.out.println("Il massimo e' in posizione d'indice 0 -- ris. =" + massimoArray(v)); /* array con l'ultimo elemento massimo */ v = new int[] {1,2,3,4,5}; stampa(v); System.out.println("Il massimo e' in posizione d'indice 4 -- ris. =" + massimoArray(v)); /* array con il primo elemento massimo */ v = new int[] {5,4,3,2,1}; stampa(v); System.out.println("Il massimo e' in posizione d'indice 0 -- ris. =" + massimoArray(v)); 8 . . . MassimoArray: verifica di correttezza /* array con valori tutti uguali */ v = new int[] {5,5,5}; stampa(v); System.out.println("Il massimo e' in posizione d'indice 0 -- ris. =" + massimoArray(v)); /* array con un generico elemento massimo */ v = new int[] {5,4,1,6,2,3}; stampa(v); System.out.println("Il massimo e' in posizione d'indice 3 -- ris. =" + massimoArray(v)); 9 MassimoArray: analisi del problema q Che tipo di problema è? q Algoritmo: Input: array v Output: posizione del massimo trovato Pre: array non vuoto (almeno un elemento) Memorizzo il valore e l’indice della prima componente in due variabili max e indmax; § Esamino tutti i rimanenti elementi dell’array con un ciclo for: sia i l’indice del generico elemento visitato: se v[i]>max allora aggiorno max e indmax rispettivamente con v[i] e i § § § § 10 MassimoArray : il metodo… public static int massimoArray(int[] v){ //pre: array non vuoto - almeno 1 elemento int max; int i; i = posizioneMassimo(v); max = v[i]; return max; } 11 PosizioneMassimo : il metodo… public static int posizioneMassimo(int[] v){ //pre: array non vuoto - almeno 1 elemento int max, indmax; int i; max = v[0]; indmax = 0; for (i=1; i<v.length; i++) if (v[i] > max){ max = v[i]; indmax = i; } return indmax; } 12 Esempio di esecuzione array letto: 1 Il massimo e' in posizione d'indice 0 -- ris. =1 array letto: 12345 Il massimo e' in posizione d'indice 4 -- ris. =5 array letto: 54321 Il massimo e' in posizione d'indice 0 -- ris. =5 array letto: 555 Il massimo e' in posizione d'indice 0 -- ris. =5 array letto: 541623 Il massimo e' in posizione d'indice 3 -- ris. =6 Press any key to continue . . . 13 Verifica Sequenza crescente q Scrivere un metodo boolean crescente(int[ ] a) che verifica se a è ordinato in modo crescente § un array è ordinato in modo crescente se per ogni indice k, l’elemento di indice k è maggiore di tutti gli elementi di indice minore di k § è sufficiente verificare se ogni elemento è minore dell’elemento che lo segue immediatamente § intuitivamente, bisogna confrontare ciascun elemento di indice i dell’array con l’elemento che lo segue immediatamente, quello di indice i+1 § attenzione – l’ultimo elemento di un array non ha un elemento che lo segue immediatamente 14 Sequenza crescente: verifica di correttezza public static void testCrescente(){ int[] v; /* array vuoto */ v = new int[] {}; stampa(v); System.out.println("La sequenza e' crescente TRUE =" + crescente(v)); /* array di due elementi crescente*/ v = new int[] {1,2}; stampa(v); System.out.println("La sequenza e' crescente TRUE + crescente(v)); =" . . . 15 Sequenza crescente: verifica di correttezza . . . /* array di due elementi non crescente */ v = new int[] {2,1}; stampa(v); System.out.println("La sequenza NON e' crescente FALSE =" + crescente(v)); /* array con l'ultimo elemento non crescente */ v = new int[] {1,2,3,4,1}; stampa(v); System.out.println("La sequenza NON e'crescente FALSE =" + crescente(v)); . . . 16 … Sequenza crescente: verifica di correttezza . . . /* array con il secondo elemento non crescente */ v = new int[] {1,-2,3,4,5}; stampa(v); System.out.println("La sequenza NON e'crescente FALSE =" + crescente(v)); /* array crescente */ v = new int[] {1,2,3,4,5}; stampa(v); System.out.println("La sequenza TRUE =" + crescente(v)); e'crescente } 17 Sequenza crescente: analisi del problema q Che tipo di problema è? Verifica universale q Algoritmo: § Input: array v § Output: boolean (true/false) (crescente/non crescente) § Pre: array non vuoto § verifica universale: devo verificare che v[i]<v[i+1] per tutti gli i da 0 fino al penultimo (v.length-1) 18 Sequenza crescente: il metodo public static boolean crescente(int[] v){ //pre: array non vuoto boolean crescente; int i; /* verifica universale: devo verificare che v[i]<v[i+1] per tutti gli i da 0 fino al penultimo */ crescente=true; i=0; while (i<v.length - 1 && crescente){ if (v[i]>=v[i+1]) crescente = false; i=i+1; } return crescente; } 19 Sequenza crescente: esempio d’esecuzione array letto: La sequenza e' crescente TRUE =true array letto: 3 La sequenza e' crescente TRUE =true array letto: 12 La sequenza e' crescente TRUE =true array letto: 21 La sequenza NON e' crescente FALSE =false array letto: 12341 La sequenza NON e'crescente FALSE =false array letto: 1 -2 3 4 5 La sequenza NON e'crescente FALSE =false array letto: 12345 La sequenza e'crescente TRUE =true Press any key to continue . . . 20