Array. Capitolo 2 ANDREA GINI

Documenti analoghi
Capitolo 5. Array e collezioni. c 2005 Pearson Education Italia Capitolo 5-1 / 61

Programmazione a Oggetti e JAVA. Prof. B.Buttarazzi A.A. 2012/2013

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

Strutture di controllo iterative

Linguaggi di Programmazione I Lezione 10

I tipi strutturati e i record in C++

Introduzione a Java e all'ambiente di sviluppo

C: panoramica. Violetta Lonati

Il linguaggio C. Puntatori e dintorni

Laboratorio di Matematica e Informatica 1

Array di array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 03. A. Miola Febbraio 2008

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Array. Definizione e utilizzo di vettori

ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori

Fondamenti di informatica T-1 (A K) Esercitazione 2 Basi del linguaggio Java

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

Java Gli array. Array

LABORATORIO 7 ARRAY. ATTENZIONE: argomenti da linea di comando!!!

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

A. Ferrari. informatica. Java basi del linguaggio. Alberto Ferrari Informatica

Array. Walter Didimo

Array multidimensionali e stringhe

Gli array. slides credit M. Poneti

Java Gli array. Array

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Programmazione Orientata agli Oggetti in Linguaggio Java

Le basi del linguaggio Java

Introduzione al linguaggio C Puntatori

4 GLI ARRAY E LE STRINGHE

Strutture di controllo decisionali

Laboratorio di programmazione

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Array. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 11. A. Miola Dicembre 2007

Programmazione I - corso B a.a prof. Viviana Bono

Gli array Libro cap. 6 Moreno Marzol a Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Elementi di Informatica A. A. 2016/2017

Esercitazione di Reti degli elaboratori

Introduzione ai puntatori in C Definizione

Array k-dimensionali

Fondamenti di Informatica T-1

Lezione 6 programmazione in Java

Tipi primitivi ed array

definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori)!

Definizione di classi. Walter Didimo

Gli Array. Dichiarazione di un array

L Array e un oggetto. L array puo contenere elementi che sono: tipi primitivi, o oggetti (in realta riferimenti ad oggetti!!!).

Array e puntatori in C

Tipi di dato strutturati: Array

Strutture. Array dei nomi degli esami (MAX ESAMI è il massimo numero degli esami). Array con i crediti degli esami.

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Modulo 2: Strutture fondamentali della programmazione Java

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

1 Tipi numerici Tipi interi Virgola mobile Conversioni e promozioni Tipi ed espressioni... 5

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Introduzione al linguaggio C Puntatori

Scopo del progetto è la costruzione di un compilatore per il linguaggio descritto qui di seguito.

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Array. Anno Accademico 2010/2011 Francesco Tortorella

Multidimensionali. Array Multidimensionali. Tipi di array. Matrice: array bidimensionale. Array multidimensionale. Dichiarazione di una matrice

Oggetti. Oggetti e occultamento delle informazioni. Definire oggetti. Oggetti. Definire oggetti la sintassi. Convenzione sugli identificatori

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Struttura logica del computer (semplificata)

NB: sono richieste almeno 4 risposte esatte per la correzione delle domande aperte

Corso sul linguaggio Java

Strutture dati e loro organizzazione. Gabriella Trucco

Problema index index memorizzare tutti i valori della sequenza ma se i valori dovessero essere mille?

Array di array. Walter Didimo

&v restituisce l indirizzo della zona di memoria allocata per v.

Parte 3. Puntatori. [S. Dalí The temptation of St. Anthony, 1946] - AA. 2015/16 3.1

Laboratorio di Programmazione Laurea in Bioinformatica

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java

Introduzione al C Lez. 3. Puntatori

Linguaggio C: Array Valeria Cardellini

Problema. Vettori e matrici. Vettori. Vettori

Laboratorio di Programmazione Lezione 3. Cristian Del Fabbro

STRINGHE IN JAVA In Java, le stringhe non sono pezzi di memo-ria con dentro dei caratteri, come in C: sono oggetti appartenenti alla classe

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

Cicli annidati ed Array multidimensionali

Programmazione con Java

Fondamenti Teorici e Programmazione

Lezione 8: Stringhe ed array multidimensionali

Università degli studi di Roma Tor Vergata Ingegneria Medica Informatica I Programma del Corso

Dati due punti sul piano calcolare la loro distanza

Esercizi Programmazione I

Octave. Luca Abeni. Informatica Luca Abeni 1 / 21

Scelte. Costrutto condizionale. Il costrutto if. Il costrutto if. Rappresentazione con diagramma a blocchi. Il costrutto if

Unità A1 Funzioni MODULO Java 2

A1- Array MODULO Java3

Transcript:

Capitolo 2 Array ANDREA GINI Dopo aver introdotto i tipi primitivi, è giunto il momento di analizzare in profondità un altro strumento importantissimo in un linguaggio di programmazione: l array. Gli array (o vettori) sono collezioni di variabili indicizzate, che permettono di gestire in maniera relativamente semplice grosse porzioni di memoria, e di effettuare su di essa calcoli ripetitivi. Gli array tornano utili in tutte le situazioni in cui si ha l esigenza di manipolare un gruppo di variabili dello stesso tipo che contengono valori tra loro correlati. Si immagini di dover scrivere un programma che calcoli la media delle temperature giornaliere; se si dovessero prendere in considerazione 6 misurazioni all ora, una ogni 1 minuti, servirebbero ben 144 variabili. int temp1 = 15; // ore. int temp2 = 16; // ore.1 int temp3 = 16; // ore.2 int temp4 = 16; // ore.3... int temp144 = 14; // ore 11.5 Oltre alla scarsa praticità di dover dichiarare 144 variabili, non esiste nessun modo pratico per effettuare calcoli che abbraccino tutto l insieme dei valori: l unico sistema per calcolare la media sarebbe quello di realizzare una gigantesca espressione aritmetica del tipo: int media = (temp1 + temp2 + temp3 +... + temp143 + temp144) / 144; In casi come questo è utile ricorrere a un array, uno strumento concettualmente simile a una tabella, che accomuna sotto un unico nome un insieme di variabili dello stesso tipo:

1 Capitolo 2. Array int[] temp = new int[144]; La creazione e l utilizzo degli array presentano alcune differenze rispetto all impiego delle normali variabili. Nei prossimi paragrafi verranno illustrate una a una. Dichiarazione di array La dichiarazione di un array ha una sintassi un po più complessa della dichiarazione di variabile semplice. Come per le variabili è necessario indicare un tipo e un nome, con la differenza che, dopo aver specificato il tipo, è necessario posporre una coppia di parentesi quadre: int[] vettorediinteri; Assegnamento La variabile vettorediinteri appena dichiarata non è un vettore, ma solamente un riferimento (in inglese, reference) a un vettore. Il vettore vero e proprio è un entità separata, che occupa un certo spazio nella memoria e che deve essere creata in modo opportuno. Prima di essere inizializzata, la variabile ha il valore null, una costante che indica che la variabile non referenzia alcun vettore. Figura 2.1 La variabile con cui si fa riferimento a un vettore ha inizialmente valore null. VettoreDiInteri Null Per creare un vettore è necessario utilizzare la parola riservata new, come nell esempio seguente: vettorediinteri = new int[1]; Il valore tra parentesi quadre è la dimensione del vettore: è possibile specificare un qualsiasi valore intero positivo. Il vettore appena creato è formato da dieci elementi, inizializzati a zero.

Manuale pratico di Java: dalla teoria alla programmazione 11 Figura 2.2 Un vettore è un oggetto di memoria composto da un certo numero di elementi, ognuno dei quali può contenere un valore. VettoreDiInteri Dereferenziazione La dereferenziazione è l operazione che permette di assegnare un valore a un elemento del vettore. Per dereferenziare un elemento di un vettore, occorre specificare il nome dell array seguito dal numero dell elemento tra parentesi quadre: vettorediinteri[1] = 1; Gli elementi di un vettore si contano a partire da zero: pertanto, se si desidera assegnare il valore 27 al decimo elemento del vettore, è necessario scrivere: vettorediinteri[9] = 27;

12 Capitolo 2. Array Figura 2.3 Lo stesso vettore della figura 2.2, dopo aver dereferenziato il secondo e il decimo elemento. 1 VettoreDiInteri 27 Differenza tra assegnamento e dereferenziazione Quando si lavora su vettori, bisogna avere ben chiara la differenza tra dereferenziazione e assegnamento. L assegnamento è un operazione che agisce direttamente sulla variabile, provocandone un cambiamento di valore. La dereferenziazione, invece, è un operazione indiretta: essa non opera sulla variabile, ma sull oggetto di memoria puntato da essa. Se si crea un nuovo reference e gli si assegna il valore di un reference che punta a un vettore già esistente, si verifica una situazione in cui due variabili puntano allo stesso vettore, come nell esempio seguente illustrato in figura 2.4: int[] vettorediinteri2; vettorediinteri2 = vettorediinteri;

Manuale pratico di Java: dalla teoria alla programmazione 13 Figura 2.4 Due variabili che fanno riferimento allo stesso vettore. 1 VettoreDiInteri VettoreDiInteri2 27 In una situazione come questa le operazioni vettorediinteri[5] = 1 e vettorediinteri[5] = 1 avranno entrambe il risultato di porre a 1 l elemento numero 5 dell unico vettore puntato dalle due variabili. Per procedere all effettiva copia di un vettore, è necessario dapprima creare un vettore delle stesse dimensioni, quindi copiare uno a uno gli elementi del primo nel secondo. Questa operazione può essere eseguita con un ciclo while, come nell esempio seguente: // crea un vettore e lo inizializza int[] v1 = new int[5]; v1[] = 1; v1[1] = 12; v1[2] = 14; v1[3] = 16; v1[4] = 18; // crea un vettore della stessa dimensione di v1 int[] v2 = new int[5]; int i = ; while(i < 5) { // copia il valore della i-esima cella // di v1 nella i-esima cella di v2 v2[i] = v1[i];

14 Capitolo 2. Array Inizializzazione automatica di un vettore Un vettore può essere inizializzato con una serie di valori, in modo simile a come si può fare con le variabili. L istruzione: int[] vettore = {1,12,14,16,18; equivale alla sequenza di istruzioni: int[] vettore = new int[5]; vettore[] = 1; vettore[1] = 12; vettore[2] = 14; vettore[3] = 16; vettore[4] = 18; Lunghezza di un vettore I vettori creati con l operatore new hanno esattamente la dimensione specificata nella dichiarazione. Gli indici sono numerati a partire da, per cui l ultimo elemento avrà l indice pari alla dimensione del vettore meno uno. Per esempio, in un vettore da 1 elementi gli indici sono compresi tra e 9. Il programmatore può essere interessato a conoscere la dimensione di un array a runtime: per questo scopo, ogni vettore dispone di un apposita costante length, accessibile tramite l operatore. : int vettorediinteri[] = new int[1]; System.out.print( La dimensione del vettore è ); System.out.println(vettoreDiInteri.length); Un esempio di manipolazione di vettori Il vettore è uno strumento potentissimo, che permette di lavorare su porzioni di memoria anche molto grandi usando un numero ridotto di istruzioni. I cicli while permettono di valutare uno a uno gli elementi di un array, e di effettuare qualche tipo di operazione su di essi. Per calcolare la media dei valori contenuti in un ipotetico vettore vettorediinteri, si può usare un frammento di codice di questo tipo: int i = ; int somma = ; int media = ; while(i<vettorediinteri.length) {

Manuale pratico di Java: dalla teoria alla programmazione 15 somma = somma + vettorediinteri[i]; i++; media = somma / sommadiinteri.length; Il seguente esempio permette di togliersi una soddisfazione: quella di scrivere un programma che sfrutti una parte importante della memoria del proprio computer. Un vettore di byte di dimensione 124 occupa esattamente un kilobyte (KB) di memoria. Un vettore di int della stessa dimensione ne occupa 4, dal momento che un int è grande 4 byte. Un vettore di interi da 64 megabyte ha una dimensione che può essere calcolata moltiplicando 64 per 148576 (pari a 124 al quadrato) e dividendo per quattro. Una volta creato un simile vettore, lo si può riempire di valori casuali scelti tra e 1; infine, è possibile calcolare la somma di tutti i valori e la relativa media aritmetica. Si noti l uso di una variabile di tipo long per memorizzare la somma di tutti i numeri: è facile comprendere che una variabile intera non avrebbe la dimensione sufficiente a contenere il risultato. public class MemoryConsumer { public static void main(string argv[]) { long sum = ; long average = ; // calcola la dimensione del vettore. // Se si dispone di poca memoria, impostare // un valore più basso nella variabile megabytes. int megabytes = 64; int dim = megabytes * 148576 / 4; int[] bigarray = new int[dim]; // riempie il vettore di valori casuali int i = ; while ( i < bigarray.length ) { bigarray[i] = (int)(32 * Math.random()); i++; // calcola la somma di tutti i valori i = ; while ( i < bigarray.length ) { sum = sum + bigarray[i]; i++; // calcola la media

16 Capitolo 2. Array average = sum / bigarray.length; // stampa i risultati System.out.print( La somma di tutti i numeri presenti nel vettore è ); System.out.println(sum); System.out.print( La media della somma di tutti i numeri presenti nel vettore è ); System.out.println(average); Il programma deve essere salvato, come di consueto, in un file dal nome MemoryConsumer.java ; per compilarlo bisogna digitare il comando: javac MemoryConsumer.java mentre per eseguirlo bisogna ricorrere all istruzione: java MemoryConsumer Dopo qualche istante, il programma stamperà un output del tipo: La somma di tutti i numeri presenti nel vettore è 239999245 La media della somma di tutti i numeri presenti nel vettore è 15999 Per poter eseguire questo programma, è necessario disporre di un computer con almeno 256 MB di RAM. Se non si dispone di memoria sufficiente, il computer segnalerà un errore: java.lang.outofmemoryerror <<no stack trace available>> Exception in thread main In questo caso, si provi a diminuire il valore della variabile megabytes, portandolo per esempio a 32, quindi si provi a compilare ed eseguire nuovamente. Vettori multidimensionali Il linguaggio Java consente di creare vettori bidimensionali, ricorrendo a una sintassi del tipo: int i[][] = new int[1][15]; I vettori bidimensionali sono concettualmente simili a una tabella rettangolare, dotata di righe e colonne. Il seguente programma crea una tavola pitagorica in un vettore bidimensionale, quindi la stampa sullo schermo:

Manuale pratico di Java: dalla teoria alla programmazione 17 public class Tabelline2 { public static void main(string argv[]) { int[][] tabellina = new int[11][11]; // crea la tabellina in un vettore bidimensionale int i = ; int j = ; while(i <= 1) { while(j <= 1) { int prodotto = i*j; tabellina[i][j] = prodotto; j = j + 1; i = i + 1; j = ; // stampa il contenuto del vettore i = ; j = ; while(i <= 1) { while(j <= 1) { int prodotto = i*j; System.out.print(tabellina[i][j]); System.out.print( \t ); j = j + 1; i = i + 1; j = ; System.out.println(); È possibile definire vettori con un numero qualsiasi di dimensioni: int v1[][][] = new int[1][15][5]; int v2[][][][] = new int[1][15][12][5]; Tali strutture, in ogni caso, risultano decisamente poco utilizzate. Vettori incompleti I vettori n-dimensionali vengono implementati in Java come array di array. Questa scelta implementativa consente di realizzare tabelle non rettangolari, come nell esempio seguente:

18 Capitolo 2. Array // crea un vettore con una componente incompleta int tabella[][] = new int[5][]; tabella[] = new int[3]; tabella[1] = new int[2]; tabella[2] = new int[5]; tabella[3] = new int[2]; tabella[4] = new int[6]; Figura 2.5 Rappresentazione in memoria di un vettore non rettangolare. Per dichiarare un vettore incompleto come quello dell esempio è necessario specificare la prima componente in fase di creazione, mentre la seconda verrà precisata successivamente creando uno a uno i sotto-vettori. Anche in questo caso ci si trova in presenza di un costrutto scarsamente utilizzato, che tuttavia vale la pena di conoscere. Inizializzazione automatica di un vettore multidimensionale Un vettore può essere inizializzato con una serie di valori, in modo simile a come si può fare con i vettori semplici. Naturalmente è necessario ricorrere a un costrutto un po più complesso, che tenga conto della particolare struttura di questi vettori. La seguente istruzione, per esempio, crea un vettore a tre componenti in verticale, in cui la prima riga ha tre colonne, la seconda due

Manuale pratico di Java: dalla teoria alla programmazione 19 e la terza quattro, e contemporaneamente inizializza gli elementi con i valori specificati, come si può vedere in figura 2.6: int[][] vettore = { { 1,12,14, {16,18, {2,22,24,26 ; Figura 2.6 Un altro esempio di vettore non rettangolare. 1 12 14 16 18 2 22 24 26