31
1 Array

Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

1

Array

Page 2: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

2

ProblemaScrivere un programma che– legge dallo standard input una sequenza di dieci

numeri in virgola mobile, uno per riga– chiede all’utente un numero intero index e

visualizza il numero che nella sequenza occupava la posizione indicata da index

Occorre memorizzare tutti i valori della sequenzaPotremmo usare dieci variabili diverse per memorizzare i valori, selezionati poi con una lunga sequenza di alternative, ma se i valori dovessero essere mille?

Page 3: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

3

Memorizzare una serie di valoriLo strumento messo a disposizione dal linguaggio Java per memorizzare una sequenza di dati si chiama array (che significa “sequenza ordinata”)– la struttura array esiste in quasi tutti i linguaggi di

programmazioneUn array in Java è un oggetto che realizza una raccolta di dati che siano tutti dello stesso tipoPotremo avere quindi array di numeri interi, array di numeri in virgola mobile, array di stringhe, array di conti bancari...

Page 4: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

4

Costruire un arrayCome ogni oggetto, un array deve essere costruitocon l’operatore new, dichiarando il tipo di dati che potrà contenereIl tipo di dati di un array può essere qualsiasi tipo di dati valido in Java– uno dei tipi di dati fondamentali o una classe

e nella costruzione deve essere seguito da una coppia di parentesi quadre che contiene la dimensione dell’array, cioè il numero di elementi che potrà contenere

new double[10];

Page 5: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

5

Riferimento ad un arrayCome succede con la costruzione di ogni oggetto, l’operatore new restituisce un riferimentoall’array appena creato, che può essere memorizzato in una variabile oggetto dello stesso tipo

Attenzione: nella definizione della variabile oggetto devono essere presenti le parentesi quadre, ma non deve essere indicata la dimensione dell’array; la variabile potrà riferirsi solo ad array di quel tipo, ma di qualunque dimensione

double[] values = new double[10];

// si può fare in due passidouble[] values;values = new double[10];

Page 6: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

6

Utilizzare un arrayAl momento della costruzione, tutti gli elementi dell’array vengono inizializzati ad un valore, seguendo le stesse regole viste per le variabili di esemplarePer accedere ad un elemento dell’array si usa

La stessa sintassi si usa per modificare un elemento dell’array

doubledouble

[] values = new double[10];oneValue = values[3];

double[] values = new double[10];values[5] = 3.4;

Page 7: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

7

Utilizzare un array

Il numero utilizzato per accedere ad un particolare elemento dell’array si chiama indiceL’indice può assumere un valore compreso tra 0(incluso) e la dimensione dell’array (esclusa), cioè segue le stesse convenzioni viste per le posizioni dei caratteri in una stringa– il primo elemento ha indice 0– l’ultimo elemento ha indice (dimensione - 1)

double[]

values[

values = new double[10];double oneValue = values[3];

5] = 3.4;

Page 8: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

8

Utilizzare un arrayL’indice di un elemento di un array può, in generale, essere un’espressione con valore intero

Cosa succede se si accede ad un elemento dell’array con un indice sbagliato (maggiore o uguale alla dimensione, o negativo) ?– l’ambiente di esecuzione genera un’eccezione

di tipo ArrayIndexOutOfBoundsException

double[] values = new double[10];int a = 4;values[a + 2] = 3.2; // modifica il

// settimo elemento

Page 9: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

9

La dimensione di un arrayUn array è un oggetto un po’ strano…– non ha metodi pubblici, né statici né di esemplare

Un array ha solo:– L’operatore di indicizzazione (es. values[i]) e– una variabile pubblica di esemplare length (attenzione,

non è un metodo!) che rappresenta la sua dimensione

Una variabile pubblica di esemplare sembrerebbe una violazione dell’incapsulamento...

double[] values = new double[10];int a = values.length; // a vale 10

Page 10: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

10

La dimensione di un array

In realtà, length è una variabile pubblica ma è dichiarata final, quindi non può essere modificata, può soltanto essere ispezionataQuesto paradigma è, in generale, considerato accettabile nell’OOPL’alternativa sarebbe stata fornire un metodo pubblico per accedere alla variabile privata– la soluzione scelta è meno elegante ma fornisce

lo stesso livello di protezione dell’informazione ed è più veloce in esecuzione

double[] values = new double[10];values.length = 15; // ERRORE IN COMPILAZIONE

Page 11: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

11

Soluzione del problema inizialepublic class SelectValue{ public static void main(String[] args)

{double[] values = new double[10];for (int i = 0; i < values.length; i++)

values[i] =Console.readDouble("Inserisci un numero:");

int index = Console.readInt(“Inserisci unaposizione”);

if (index < 0 || index >= values.length)System.out.println("Valore errato");

elseSystem.out.println(values[index]);

}}

Page 12: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

12

Costruzione di un arraySintassi:

Scopo: costruire un array per contenere dati del tipo NomeTipo; la lunghezza indica il numero di dati che saranno contenuti nell’arrayNota: NomeTipo può essere uno dei tipi fondamentali di Java o il nome di una classeNota: i singoli elementi dell’array vengono inizializzati con le stesse regole delle variabili di esemplare

new NomeTipo[lunghezza]

Page 13: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

13

Riferimento ad un arraySintassi:

Scopo: definire la variabile nomeRiferimentocome variabile oggetto che potrà contenere un riferimento ad un array di dati di tipo NomeTipoNota: le parentesi quadre [ ] sono necessarie e nondevono contenere l’indicazione della dimensione dell’array

NomeTipo[] nomeRiferimento;

Page 14: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

14

Accesso ad un elemento di un array

Sintassi:

Scopo: accedere all’elemento in posizione indiceall’interno dell’array a cui riferimentoArray si riferisce, per conoscerne il valore o modificarloNota: il primo elemento dell’array ha indice 0, l’ultimo elemento ha indice (dimensione - 1)Nota: se l’indice non rispetta i vincoli, viene lanciata l’eccezione ArrayIndexOutOfBoundsException

riferimentoArray[indice]

Page 15: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

15

Inizializzazione di un arrayQuando si assegnano i valori agli elementi di un array si può procedere così

ma se si conoscono tutti gli elementi da inserire si può usare questa sintassi (migliore)

oppure (accettabile, ma meno chiara)

int[] primes = new int[3];primes[0] = 2;primes[1] = 3;primes[2] = 5;

int[] primes = { 2, 3, 5};

int[] primes = new int[] { 2, 3, 5};

Page 16: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

16

Errori di limiti negli arrayUno degli errori più comuni con gli array è l’utilizzo di un indice che non rispetta i vincoli– il caso più comune è l’uso di un indice uguale alla

dimensione dell’array, che è il primo indice non valido…

Come abbiamo visto, l’ambiente runtime segnala questo errore con un’eccezione che arresta il programma

double[] values = new double[10];values[10] = 2; // ERRORE IN ESECUZIONE

Page 17: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

17

Copiare un arrayRicordando che una variabile che si riferisce ad un array è una variabile oggetto che contiene un riferimento all’oggetto array, copiando il contenuto della variabile in un’altra non si copia l’array, ma si ottiene un altro riferimento allo stesso oggetto array

double[] values = new double[10];// inseriamo i dati nell’array...double[] otherValues = values;

Page 18: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

18

Copiare un arraySe si vuole ottenere una copia dell’array, bisogna– creare un nuovo array dello stesso tipo e con

la stessa dimensione– copiare ogni elemento del primo array nel

corrispondente elemento del secondo arraydouble[] values = new double[10];// inseriamo i dati nell’array...double[] otherValues = new double[values.length];for (int i = 0; i < values.length; i++)

otherValues[i] = values[i];

Page 19: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

19

Copiare un arrayInvece di usare un ciclo, è possibile (e più efficiente) invocare il metodo statico arraycopydella classe System (nel pacchetto java.lang)

Il metodo System.arraycopy consente di copiare un porzione di un array in un altro array (grande almeno quanto la porzione che si vuol copiare)

double[] values = new double[10];// inseriamo i dati nell’array...double[] otherValues = new double[values.length];System.arraycopy(values, 0, otherValue, 0,

values.length);

Attenzione alla minuscola!

Page 20: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

20

System.arraycopySystem.arraycopy(from,fromStart,to,toStart,count);

from to

toStart

fromStart

count

Page 21: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

21

Passare un array come parametroSpesso si scrivono metodi che ricevono array come parametri esplicitiLa semantica è identica al passaggio di riferimenti ad oggetti come parametri esplicitipublic double sum(double[] values){ Assertion.check(values != null);

if (values.length == 0)return 0;

double sum = 0;for (int i = 0; i < values.length; i++)

sum = sum + values[i];return sum;

}

Page 22: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

22

Usare un array come valore di ritornoUn metodo può anche usare un array come valore di ritorno; la semantica è identica all’uso di un riferimento ad oggetto come valore di ritorno

public double[] resize(double[] oldArray,int newLength)

{ Assertion.check(newLength >=0);

double[] newArray = new double[newLength];int c = oldArray.length;if (newLength < c) c = newLength;for (int i = 0; i < c; i++)

newArray[i] = oldArray[i];return newArray;

} double[] values = {1, 2.3, 4.5};values = resize(values, 5);values[4] = 5.2;

Page 23: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

23

Elaborazione dell’input

Page 24: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

24

Leggere una sequenza di datiMolti problemi di elaborazione richiedono la lettura di una sequenza di dati in ingresso– ad esempio, calcolare la somma di numeri in virgola

mobile, ogni numero inserito su una riga diversa

Altrettanto spesso il programmatore non sa quanti saranno i dati forniti in ingresso dall’utenteProblema: leggere una sequenza di dati in ingresso finché i dati non sono finitiSoluzione: metodo readString di Console, che restituisce null se i dati in ingresso sono terminati

Page 25: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

25

Leggere una sequenza di dati

Il ciclo usa la variabile “ausiliaria” done, diversa dalla variabile che contiene i dati, line, perché la verifica della condizione va fatta a metà del ciclo

boolean done = false;while (!done){ String line = Console.readString();

if (line == null)done = true;

else... // elabora line

}

Page 26: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

26

Calcolare la somma di numeripublic class Sum{ public static void main(String[] args)

{ double sum = 0;boolean done = false;while (!done){ String line = Console.readString();

if (line == null)done = true;

elsesum = sum + Double.parseDouble(line);

}System.out.println("Somma: " + sum);

}}

Page 27: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

27

Calcolare la somma di numeriDopo aver eseguito il programma Sum, si introducono da tastiera i numeri in virgola mobile di cui si vuol calcolare la somma, uno per rigaAl termine dell’elenco, occorre comunicare al sistema operativo che l’input da console, destinato al programma in esecuzione, è terminato– in una finestra DOS/Windows bisogna digitare Ctrl+Z– in una shell di Unix bisogna digitare Ctrl+D

Il flusso System.in di Java non leggerà questi caratteri speciali, ma riceverà dal sistema operativo la segnalazione che l’input è terminato, e readString restituirà un valore null

Page 28: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

28

Reindirizzamento di input e outputUsando il precedente programma, Sum, si inseriscono dei numeri da tastiera, che al termine non vengono memorizzati– per sommare una serie di numeri, bisogna digitarli

tutti, ma non ne rimane traccia!

Una soluzione “logica” sarebbe che il programma leggesse i numeri da un file– questo si può fare con il reindirizzamento dell’input

standard, consentito da quasi tutti i sistemi operativi

Page 29: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

29

Reindirizzamento di input e outputIl reindirizzamento dell’input standard, sia nei sistemi Unix sia nei sistemi Microsoft Windows, si indica con il carattere < seguito dal nome del file da cui ricevere l’input

Si dice che il file numeri.txt viene collegato all’input standard

Il programma non ha bisogno di alcuna istruzione particolare, semplicemente System.in non sarà più collegato alla tastiera ma al file specificato

java Sum < numeri.txt

Page 30: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

30

A volte è comodo anche il reindirizzamento dell’output– ad esempio, quando il programma produce molte righe

di output, che altrimenti scorrono velocemente sullo schermo senza poter essere lette

I due reindirizzamenti possono anche essere combinati

java Sum > output.txt

Reindirizzamento di input e output

java Sum < numeri.txt > output.txt

Page 31: Array - Siti Xoomxoomer.virgilio.it/appuntinweb/Fondamenti d'informatica/array.pdf · numeri in virgola mobile, uno per riga – chiede all’utente un numero intero index e visualizza

31

Quando si esegue un programma Java, è possibile fornire dei parametri dopo il nome della classe che contiene il metodo mainTali parametri vengono letti dall’interprete Java e trasformati in un array di stringhe che costituisce il parametro del metodo main

java Program 2 33 Hello

Argomenti sulla riga comandi

public class Program {public static void main(String[] args) {

System.out.println(args.length);System.out.println(args[1]);

}}

333