Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoGustavo Parodi Modificato 6 anni fa
1
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Dispensa 16 Array A. Miola Gennaio 2012 Array
2
Contenuti Il problema degli studenti da promuovere Array Array in Java
Uso di array dichiarazione di variabili array e tipi array creazione di array accesso a un array array e metodi letterali array Array e accesso posizionale somma degli elementi di un array visualizzazione degli elementi di un array calcolo del massimo elemento di un array di interi altri esempi ed esercizi Array
3
Array Un array è un insieme di variabili omogenee, gestito mediante una singola variabile, a cui è possibile accedere in modo posizionale (ovvero, mediante un indice) gli array consentono di gestire dei gruppi di dati in quantità prefissata che rappresentano informazioni omogenee che devono essere tutti elaborati nello stesso modo Array
4
Il problema degli studenti da promuovere
Si consideri il seguente problema i venti studenti di un corso hanno svolto una prova di profitto, e ciascuno studente ha ricevuto una votazione in decimi le votazioni sono numeri razionali compresi tra zero e dieci il docente del corso ha deciso di promuovere gli studenti la cui votazione è non inferiore ai due terzi del voto medio ottenuto dagli studenti alla prova d’esame si vuole scrivere un’applicazione che legge il nome e la votazione di ciascuno dei venti studenti e stampa l’elenco dei nomi degli studenti da promuovere, con le rispettive votazioni Array
5
Il problema degli studenti da promuovere
Inserisci i nomi e le votazioni dei venti studenti Studente 1: Rossi 8.1 Studente 2: Verdi 3.2 Studente 3: Gialli 5.6 . . . Studente 20: Neri 8.5 La media delle votazioni è 7.65 La soglia per la promozione è 5.12 Gli studenti promossi sono: Array
6
Una prima soluzione . . . Una prima soluzione al problema degli studenti da promuovere dichiara venti variabili nome1, nome2, ..., nome20 per i nomi degli studenti dichiara venti variabili voto1, voto2, ..., voto20 per le votazioni ricevute dagli studenti leggi nomi e votazioni dei venti studenti leggi il nome e la votazione del primo studente leggi il nome e la votazione del secondo studente . . . calcola la votazione media e la soglia per la promozione stampa l’elenco degli studenti promossi se il voto del primo studente supera la soglia per la promozione, stampa il nome e il voto del primo studente se il voto del secondo studente supera la soglia per la promozione, stampa il nome e il voto del secondo studente Array
7
. . . Una prima soluzione . . . /* nomi degli studenti */
String nome1, nome2, ..., nome20; /* votazioni ricevute dagli studenti */ double voto1, voto2, ..., voto20; double sommaVoti; // somma dei voti double soglia; // soglia per la promozione ... stampa un messaggio ... ... segue ... questi puntini non sono corretti: bisogna elencare, una a una, tutte le variabili da dichiarare! Array
8
. . . Una prima soluzione . . . /* leggi nomi e votazioni dei venti studenti */ /* leggi il nome e la votazione del primo studente */ nome1 = Lettore.in.leggiString(); voto1 = Lettore.in.leggiDouble(); /* leggi il nome e la votazione del secondo studente */ nome2 = Lettore.in.leggiString(); voto2 = Lettore.in.leggiDouble(); ... /* leggi il nome e la votazione del ventesimo studente */ nome20 = Lettore.in.leggiString(); voto20 = Lettore.in.leggiDouble(); /* calcola la soglia per la promozione */ sommaVoti = voto1 + voto voto20; soglia = (2./3.) * (sommaVoti/20); ... segue ... questi puntini non sono corretti: bisogna scrivere, una a una, tutte le istruzioni e le operazioni che devono essere eseguite! Array
9
. . . Una prima soluzione /* stampa l'elenco degli studenti da promuovere */ ... stampa un messaggio ... /* verifica se il primo studente è stato promosso */ if (voto1 >= soglia) System.out.println(nome1 + " " + voto1); /* verifica se il secondo studente è stato promosso */ if (voto2 >= soglia) System.out.println(nome2 + " " + voto2); ... /* verifica se il ventesimo studente è stato promosso */ if (voto20 >= soglia) System.out.println(nome20 + " " + voto20); questi puntini non sono corretti: bisogna scrivere, una a una, tutte le istruzioni che devono essere eseguite! Array
10
Limiti della questa prima soluzione
Problemi di questa prima soluzione se ci fossero 10 studenti? se ci fossero 100 o 1000 studenti? se il numero degli studenti non fosse noto a priori? Array
11
Caratteristiche del problema degli studenti
Questo problema ha due caratteristiche fondamentali – peraltro comuni a molti altri problemi vanno gestiti degli insiemi di variabili omogenee in ciascun insieme di variabili omogenee, per ciascun elemento devono essere effettuate le stesse operazioni Vanno gestiti degli insiemi di variabili omogenee un insieme di variabili per rappresentare il nome di ciascuno studente un insieme di variabili per rappresentare la votazione di ciascuno studente ciascuno di questi due insiemi di variabili deve essere composto da un numero di variabili pari al numero degli studenti del corso Array
12
Caratteristiche del problema degli studenti
In ciascun insieme di variabili omogenee, per ciascun elemento devono essere effettuate le stesse operazioni ciascuna votazione deve essere letta e poi acceduta due o tre volte nel calcolo della somma dei voti per verificare se lo studente a cui è associata è stato promosso inoltre, per gli studenti promossi, per poter essere visualizzata ciascun nome deve essere letto e poi eventualmente acceduto il nome di uno studente deve essere visualizzato se lo studente è stato promosso Array
13
Idea dell’insieme di variabili . . .
Nella soluzione del problema degli studenti da promuovere, sarebbe desiderabile poter disporre di due insiemi di variabili per descrivere nomi e voti degli studenti, con le seguenti modalità un insieme nomi di variabili, composto da venti elementi, ciascuno dei quali descrive il nome di uno studente un insieme voti di variabili, composto da venti elementi, ciascuno dei quali descrive la votazione ottenuta da uno studente l’accesso all’elemento di posizione i-esima in ciascuna di queste variabili è espresso mediante una espressione in cui la posizione i compare esplicitamente come un termine dell’espressione Array
14
Uso degli insiemi di variabili . . .
/* nomi degli studenti */ insieme di 20 elementi di tipo stringa nomi; /* votazioni ricevute dagli studenti */ insieme di 20 elementi di tipo double voti; ... dichiarazione di altre variabili ... /* leggi nomi e votazioni dei venti studenti */ for (i=0; i<20; i++) { /* leggi nome e votazione dell'i-esimo studente */ nomii = Lettore.in.leggiString(); votii = Lettore.in.leggiDouble(); } Array
15
. . . Uso degli insiemi di variabili
/* calcola la soglia per la promozione */ sommaVoti = 0; for (i=0; i<20; i++) sommaVoti += votii; soglia = (2./3.) * (sommaVoti/20); /* stampa l'elenco degli studenti da promuovere */ ... stampa un messaggio ... for (i=0; i<20; i++) { /* verifica se l'i-esimo studente è stato promosso */ if (votii >= soglia) System.out.println(nomii + " " + votii); } Array
16
Dagli insiemi di variabili agli array
In molti linguaggi di programmazione gli insiemi di variabili sono rappresentati mediante la struttura dati di array che cosa è un array? che cosa è un array in Java? come si usano gli array in Java? quali sono le tecniche di programmazione che possono essere usate nella gestione degli array? Array
17
Array Un array è una collezione finita di variabili di uno stesso tipo, posto in corrispondenza biunivoca con un altro insieme finito le variabili che compongono un array sono chiamate elementi (o componenti) dell’array il numero di elementi di un array è chiamato dimensione dell’array gli elementi dell’insieme finito che è in corrispondenza biunivoca con l’array sono chiamati indici in un array, ciascun elemento è individuato dal nome dell’array insieme all’indice associato all’elemento Array
18
Un esempio di array L’array monthName indici per l’array monthName
January February March April November December gennaio febbraio marzo aprile novembre dicembre monthName l’array monthName indici per l’array monthName Array
19
Un altro esempio di array
L’array mesi mesi 1 gennaio indici per l’array mesi 2 febbraio 3 marzo l’array mesi 4 aprile 11 novembe 12 dicembre Array
20
Array in Java . . . In Java, un array è una sequenza (una collezione ordinata) finita di variabili di uno stesso tipo, posto in corrispondenza biunivoca con un intervallo iniziale e finito dei numeri naturali il numero di elementi di un array (la dimensione) è chiamata anche lunghezza dell’array l’indice di ciascun elemento in un array è un numero naturale l’ordinamento lineare £ sui numeri naturali, sulla base dell’indice associato a ciascun elemento, induce un ordinamento sugli elementi di un array il primo elemento ha indice 0 in un array lungo N, l’ultimo elemento ha indice N–1 Array
21
. . . Array in Java In Java, un array è un oggetto, a cui è possibile accedere mediante un suo riferimento L’accesso a un elemento di un array avviene specificando un riferimento all’array seguito dall’indice dell’elemento racchiuso tra parentesi quadre [ e ] Array
22
Un esempio di array in Java
L’array monthName, composto da dodici elementi String il riferimento all’array è memorizzato nella variabile monthName gli indici permessi sono i numeri naturali compresi tra 0 e 11 ad esempio, l’espressione monthName[0] permette di accedere al primo elemento dell’array, la stringa "January" January February March April November December 1 2 3 10 11 monthName Array
23
Uso di array In Java gli array sono oggetti istanza, e la loro gestione presenta molti aspetti simili a quelli della gestione degli altri oggetti istanza se si vuole usare un array bisogna dichiarare una variabile per memorizzare il riferimento all’array creare l’array accedere agli elementi dell’array mediante l’operatore [ ] Array
24
Dichiarazione di variabili array e tipi array
Per usare un array i cui elementi sono di un tipo T bisogna dichiarare una variabile di tipo T[ ] String[] nomi; // nomi degli studenti double[] voti; // votazioni ricevute dagli studenti Tipi array se T è un tipo, l’espressione T[ ] denota un tipo riferimento, chiamato tipo array di elementi di tipo T (array di T) gli elementi di un array devono essere tutti di uno stesso tipo Le variabili di tipo array (o variabili array) sono dunque variabili di tipo riferimento la dichiarazione di una variabile array introduce una variabile che può memorizzare il riferimento a un array la dichiarazione di una variabile array non associa alcun oggetto array alla variabile dichiarata Array
25
Creazione di array Per creare un array composto da N elementi di tipo T si deve usare l’espressione new T[N] /* crea l'array per i nomi degli studenti */ nomi = new String[20]; /* crea l'array per i voti degli studenti */ voti = new double[20]; Gli array sono oggetti la creazione di un array avviene mediante l’operatore new al momento della creazione di un array, bisogna specificare il tipo e il numero di elementi che compone l’array quando viene creato un array, l’operatore new restituisce il riferimento all’array creato, che può essere memorizzato in una variabile di tipo array Array
26
Accesso a un array Dopo che un array è stato creato e il riferimento all’array è stato memorizzato in una variabile array, è possibile accedere agli elementi dell’array /* leggi nomi e votazioni degli studenti */ for (i=0; i<20; i++) { /* leggi nome e votazione dell'i-esimo studente */ nomi[i] = Lettore.in.leggiString(); voti[i] = Lettore.in.leggiDouble(); } /* calcola la somma dei voti */ sommaVoti = 0; for (i=0; i<20; i++) sommaVoti += voti[i]; Array
27
Accesso agli elementi degli array
L’operatore [ ] è chiamato operatore di indicizzazione (subscripting) è un operatore binario il primo operando di [ ] è il riferimento a un array, scritto prima delle parentesi quadre il secondo operando di [ ] è una espressione intera che indica l’indice dell’elemento che deve essere acceduto, scritta tra le parentesi quadre nell’accesso a un elemento di un array, se il valore dell’indice è minore di zero oppure maggiore o uguale alla lunghezza dell’array, viene causato un errore al tempo di esecuzione di tipo ArrayIndexOutOfBoundsException ovvero, di tipo “indice dell’array fuori dai limiti” Array
28
Il problema degli studenti da promuovere
final int NUMERO_STUDENTI = 20; // numero degli studenti String[] nomi; // nomi degli studenti double[] voti; // votazioni ricevute dagli studenti int i; // indice per la scansione // degli array nomi e voti double sommaVoti; // somma dei voti double soglia; // soglia per la promozione ... stampa un messaggio ... /* creazione degli array per gli studenti */ /* crea l'array per i nomi degli studenti */ nomi = new String[NUMERO_STUDENTI]; /* crea l'array per i voti degli studenti */ voti = new double[NUMERO_STUDENTI]; ... segue ... Array
29
Il problema degli studenti da promuovere
/* leggi nomi e votazioni degli studenti */ for (i=0; i<NUMERO_STUDENTI; i++) { /* leggi nome e votazione dell'i-esimo studente */ nomi[i] = Lettore.in.leggiString(); voti[i] = Lettore.in.leggiDouble(); } /* calcola la soglia per la promozione */ sommaVoti = 0; for (i=0; i<NUMERO_STUDENTI; i++) sommaVoti += voti[i]; soglia = (2./3.) * (sommaVoti/NUMERO_STUDENTI); /* stampa l'elenco degli studenti da promuovere */ ... stampa un messaggio ... /* verifica se l'i-esimo studente è stato promosso */ if (voti[i] >= soglia) System.out.println(nomi[i] + " " + voti[i]); Array
30
Lunghezza di un array La lunghezza (dimensione) di un array è il numero di elementi dell’array la lunghezza di un array deve essere fissata al momento della sua creazione, e non può essere più cambiata è possibile accedere alla lunghezza di un array mediante la variabile length length è una variabile d’istanza associata agli oggetti array si può accedere alla lunghezza di un array mediante l’espressione riferimento-array . length Attenzione : non confondere la variabile length degli array con il metodo length() delle stringhe Array
31
Uso della variabile length
Crea un array di interi e azzera i suoi elementi int[] a; // un array di interi int i; // indice per la scansione di a /* creazione dell'array a */ a = new int[...];// va indicata la dimensione di a /* azzera gli elementi dell'array a */ for (i=0; i<a.length; i++) a[i] = 0; Un uso opportuno della variabile length permette di rendere il codice parametrico rispetto alla dimensione degli array Array
32
Array e metodi I parametri formali di metodi e costruttori possono essere di tipo array in questo caso, il metodo (o costruttore) può utilizzare la variabile length dell’array per accedere alla lunghezza dell’array ed elaborare i suoi elementi l’esecuzione di un metodo (o costruttore) può modificare gli elementi di un array che gli è stato passato come parametro la modifica degli elementi di un array passato come parametro è un effetto collaterale, che deve essere opportunamente documentato Il tipo di ritorno di un metodo può essere un tipo array Array
33
Letterali array. . . Un letterale array è la denotazione di un array di cui sono anche specificati i valori iniziali per gli elementi, esso viene scritto elencando in sequenza i letterali che denotano gli elementi dell’array, racchiusi tra parentesi graffe { e } e separati da virgola , I letterali array sono utili, ad esempio, per effettuare il test di metodi che hanno dei parametri array Array
34
. . . Letterali array String[] animali;
animali = new String[]{"leone","tigre","orso"}; in questo frammento di codice la dimensione dell’array è data in modo implicito dal numero di elementi elencati questo frammento di codice è equivalente al seguente animali = new String[3]; animali[0] = "leone"; animali[1] = "tigre"; animali[2] = "orso"; Array
35
Array e accesso posizionale
Gli array vanno normalmente elaborati elemento per elemento normalmente gli elementi di un array vengono acceduti in modo posizionale, mediante l’ausilio di una variabile indice in alcuni casi una sola variabile indice consente di accedere a più elementi di un array o agli elementi di più array in alcuni casi è necessario usare più variabili indice per scandire gli elementi di un array Array
36
Somma degli elementi di un array
/* Calcola la somma degli elementi dell’array a. */ public static int somma(int[] a) { // pre: a!=null int i; // indice per la scansione di a int somma; // somma degli elementi di a /* scandisce e somma gli elementi di a */ somma = 0; for (i=0; i<a.length; i++) somma += a[i]; return somma; } Array
37
Test del metodo int somma(int[ ] a)
public static void testSomma() { /* la somma degli elementi di un array vuoto è 0 */ System.out.println(somma(new int[] {}) + " (0)") /* la somma degli elementi di un array composto * da un solo elemento è uguale al valore * dell'elemento */ System.out.println(somma(new int[] { 5 }) + " (5)") /* somma degli elementi di un array con più elementi */ System.out.println(somma(new int[] { 1,2,3 }) + " (6)") } Array
38
Esercizio Scrivere un metodo int occorrenze(int[ ] a, int v) che calcola il numero di elementi di a che sono uguali a v ad esempio, se a è l’array { 1, 3, 2, 3, 5 } occorrenze(a,3) deve restituire 2 occorrenze(a,7) deve restituire 0 Array
39
Visualizzazione degli elementi di un array
Normalmente non è possibile visualizzare gli elementi di un array con una singola istruzione semplice System.out.println( new int[] {1,2,3} ); può visualizzare cose del tipo Non è affatto strano ! Perché ? Array
40
Visualizzazione degli elementi di un array
/*Visualizza sullo schermo gli elementi dell'array a. */ public static void visualizza(int[] a) { // pre: a!=null int i; // indice per la scansione di a /* visualizza gli elementi dell'array a, * separandoli da spazi */ for (i=0; i<a.length; i++) System.out.print(a[i] + " "); /* poi va a capo */ System.out.println(); } Array
41
Esercizi . . . Scrivere un metodo int massimo(int[ ] a) che calcola e restituisce il valore del massimo elemento di un array di interi non vuoto a Massimo( new int[ ] { 3, 1, 2 } ) deve restituire 3 Massimo( new int[ ] { 3, 7, 5 } ) deve restituire 7 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 Array
42
. . . Esercizi . . . 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 Array
43
. . . Esercizi Scrivere un metodo boolean coppiaUguali(int[ ] a) che verifica se a contiene almeno una coppia di elementi uguali bisogna confrontare ciascun elemento X dell’array con ogni altro elemento Y dell’array dove X e Y sono elementi diversi, nel senso che hanno indici diversi bisogna confrontare ciascun elemento di indice i dell’array con ogni altro elemento di indice j dell’array - dove i e j hanno valore diverso quindi è necessario utilizzare due variabili indice per accedere agli elementi di uno stesso array Array
44
Metodi che restituiscono array
Struttura dei metodi che creano e restituiscono array calcola la lunghezza dell’array da creare e restituire crea l’array da calcolare e restituire assegna un valore a ciascun elemento dell’array restituisci il riferimento all’array calcolato Array
45
Esercizi Scrivere un metodo int[ ] inverso(int[ ] a) che crea e restituisce un array che contiene gli stessi elementi di a, ma disposti in ordine inverso Scrivere un metodo che, dato un array a, calcola e restituisce l’elemento più frequente di a calcolare prima l’array occ delle frequenze degli elementi di a l’elemento da restituire è quello che in a occupa la posizione del massimo di occ Array
46
boolean uguali(String[ ] a, String[ ] b)
Uguaglianza tra array Due array sono uguali se entrambe le seguenti condizioni sono verificate i due array hanno la stessa lunghezza per ciascun indice degli array, gli elementi di indice corrispondente nei due array sono uguali Esercizio - scrivere un metodo boolean uguali(String[ ] a, String[ ] b) che verifica se gli array di stringhe a e b sono tra loro uguali Attenzione in pratica, l’uguaglianza tra array va verificata invocando il metodo di classe boolean equals(a,b) della classe Arrays del package java.util Array
47
Esercizio Risolvere il seguente problema
dato un array A di interi, si vuole creare e calcolare un nuovo array che contiene tutti e soli gli elementi positivi di A, nello stesso ordine in cui occorrono in A (l’array A non deve essere modificato) ad esempio, se A è il seguente array allora bisogna creare e restituire il seguente array 2 -3 7 1 3 11 4 2 7 1 11 Array
48
cancella(new int[ ] { 3, 5, 6, 8 }, 2)
Esercizio Scrivere un metodo int[ ] cancella(int[ ] a, int p), in cui p indica una posizione valida all’interno di a, che crea e restituisce un nuovo array che contiene tutti gli elementi di a ad eccezione di quello che occupa la posizione p, nello stesso ordine in cui compaiono in a ad esempio cancella(new int[ ] { 3, 5, 6, 8 }, 2) deve restituire l’array { 3, 5, 8 } Array
49
Riferimenti al libro di testo
Per lo studio di questi argomenti si fa riferimento al libro di testo, e in particolare al capitolo 19 fino al paragrafo 19.5 incluso Array
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.