Programmazione a Oggetti e
JAVA
Prof. B.Buttarazzi
A.A. 2012/2013
16/01/2013 2
Sommario
• Array
– Array monodimensionali
– Array bidimensionali
• Esercizi
ARRAY
Gli array sono oggetti utilizzati in Java per memorizzare elementi omogenei in locazioni di memoria contigue
I componenti di un array:
– sono tutti dello stesso tipo
– possono essere di tipo primitivo (int, float,….) o non (array, stringhe, oggetti)
– sono indicizzati con variabili di tipo int (l’indice del
primo elemento è 0), con controllo di validità degli indici a run-time
Sintassi per la dichiarazione e creazione di
un array monodimensionale
<tipo di dato> <variabile array> [ ] =
new <tipo di dato> [ <dimensione > ] ;
oppure
<tipo di dato> [ ]<variabile array> =
new <tipo di dato> [ <dimensione > ] ;
int vi[ ]= new int[10] ;
int [ ] vi = new int[10] ;
Esempi: variabili di tipo array Esempi
int vi[ ]= new int[10] ; // vi è un array di 10 valori interi
boolean vb[ ]= new boolean[3]; // vb è un array di 3 valori logici
char vc[ ]= new char[6] ; // vc è un array di 6 caratteri
Array monodimensionali
C01FF:0000
…
…
char C[] = new char[4];
...
int I [] = new int[3];
…
fase dichiarativa
…
C[0] = 'a';
C[1] = 'b' ;
C[2] = 'c' ;
C[3] = 'd' ;
...
I[0] = 5 ;
I[1] = 1 ;
I[2] = 2 ;
…
fase di inizializzazione
I
01FF:0006
'a''b'
1
01FF:0000
01FF:0003
Memoria
Indirizzi
Fisici
'c''d'
5
2
8 byte
I[0]
I[1]
I[2]
C[0]
C[1]
C[2]
C[3]
4 byte
4 byte
4 byte
Formula per accedere alla locazione di memoria relativa
all’elemento in posizione i-esima:
<posizione iniziale array> + i * <dimensione elemento in locazioni>
7
ARRAY: dichiarazione e creazione
Esempio:
int a[ ]; /* dichiarazione dell’identificatore a*/
a = new int[3]; /* creazione dell’array a*/
oppure
int a[] = new int[3];
// Dichiarazione e istanziazione (creazione) di un oggetto di tipo array
a
Dichiarare un oggetto a non significa
creare un oggetto!
• a non contiene l’oggetto
• a contiene il riferimento all’oggetto
a null
null è una costante predefinita in Java che sta ad
indicare che l’oggetto referenziato dalla variabile
non è stato ancora creato
null rappresenta un valore che significa “nessun
riferimento”, rappresentato dal numero zero
16/01/2013
1 2 3
a
0 1 2
a[0]
a (array a una dimensione) int a[] = {1,2,3};
E' possibile anche fare una assegnazione in fase di dichiarazione:
a[1] a[2]
• La variabile dichiarata a (detta referenza o puntatore all'oggetto) contiene il riferimento necessario a trovare l’oggetto puntato da a in memoria, in pratica a contiene l'indirizzo di una locazione di memoria a partire dal quale è memorizzato l'oggetto.
int a[] = {1,2,3};
è del tutto equivalente a: int[] a = new
int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
8
ARRAY:dichiarazione,creazione e
inizializzazione
Esempi:dichiarazione,creazione e
inizializzazione di variabili di tipo array
Inizializzazione di un array nella fase dichiarativa:
<tipo di dato> <variabile array> [ ] = { <elenco dei valori> };
Esempi
int vi[ ] = { 1,2,3,4,5,6,7,8,9,10 }; // vi è un array di 10 valori interi
boolean vb[ ] = { true,true,false }; // vb è un array di 3 valori logici
char vc[ ] = { 'a', 'b','c','d','e','f' }; // vc è un array di 6 caratteri
10
• 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
<riferimento-array>. length
Attenzione a non confondere la variabile length degli array con il metodo length()delle stringhe
16/01/2013
11
ARRAY int a[] = {1,2,3};
int b[];
b = a;
a e b sono variabili riferimento che puntano agli stessi valori.
a
1 2 3
b
16/01/2013
Attenzione a non confondere la variabile a con l’oggetto puntato
da a.
12
ARRAY int a[] = {1,2,3};
int b[];
b = a;
b[0] = 10;
a e b sono variabili riferimento che puntano agli stessi valori.
Una modifica su b è vista anche a
a
10 2 3
b
16/01/2013
Attenzione a non confondere la variabile a con l’oggetto puntato
da a.
Esercizio
Scrivere un programma che crei un array v di
10 elementi di tipo int, che acquisisca i dati
in input e stampi i valori memorizzati.
16/01/2013 13
16/01/2013 14
import java.io.*;
public class EsempioArray
{
public static void main(String args[]) throws NumberFormatException,
IOException
{
int i=0;
int v[]=new int[10];
InputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);
for (i=0; i<10; i++)
{
System.out.print("Valore: ");
v[i]=Integer.parseInt(Tastiera.readLine());
}
for(i=0; i<10;i++)
{
System.out.println("v["+i+"]="+v[i]);
}
}
}
Package
16/01/2013 Corso di Fondamenti di Informatica1 15
Esercizio
Scrivere un programma che crei un array vi
di 10 elementi di tipo int, che contenga i
valori da 1 a 10 e stampi i valori memorizzati.
16/01/2013 16
16/01/2013 17
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class EsempioArray2
{
public static void main(String args[]) throws NumberFormatException,
IOException
{
int i=0;
int vi[ ] = { 1,2,3,4,5,6,7,8,9,10 };
for (i=0; i<vi.length; i++)
System.out.println("vi["+i+"]="+vi[i]);
}
}
16/01/2013 18
Esercizio
Scrivere un programma che dopo aver letto in
input un valore intero nella variabile numero
che rappresenta la dimensione di un array a,
crea l’array acquisisce i dati da input e
stampa i valori in esso memorizzati.
16/01/2013 19
import javax.swing.JOptionPane;
public class esempioArrayG{
public static void main(String[] args) {
// TODO Auto-generated method stub
int numero;
do {
String s = JOptionPane.showInputDialog("Immettere dimensione array ");
numero=Integer.parseInt(s);
}
while (numero<=0);
int a[] = new int[numero];
//lettura array
for (int i=0;i<a.length;i++) {
a[i] = Integer.parseInt(JOptionPane.showInputDialog((i +1)+"° numero"));
};
//scrittura array
String array ="";
for (int i=0;i<a.length;i++) {
array += a[i] ;
if (i+1!=a.length) {
array +=" "; } }
JOptionPane.showMessageDialog(null," l'Array inserito è: ["+array+"]");
}
}
Esercizio
Scrivere un programma che, dopo aver creato
e inizializzato un array di double a trova il
massimo valore in esso memorizzato.
16/01/2013 21
double max = a[0];
for (int i = 1; i < a.length;
i++) { if (a[i] > max)
max = a[i]; }
16/01/2013 22
double max = a[0];
for (int i = 1; i < a.length; i++) {
if (a[i] > max)
max = a[i]; }
La strategia usata è quella di scorrere l'array tenendo da parte il massimo numero trovato fino a quel momento, in una variable max, e ogni volta che il numero considerato è più grande di max, cambiare il valore di max con il valore superiore trovato, cosicché alla fine del processo, max è il più grande valore in tutto l'array.
L'unico problema è trovare un conveniente valore iniziale di max.
A tale scopo conviene iniziare con max posto uguale ad a[0], e proseguire poi scandendo l'array a partire da a[1], per trovare elementi maggiori.
16/01/2013 23
Esercizio
Scrivere un programma che dato un array a
lo copia in un array b.
16/01/2013 24
Esercizio
Scrivere un programma che dato un array di
double a lo copia in un array b.
a
1 2 3
16/01/2013 25
Esercizio
Scrivere un programma che dato un array di
double a lo copia in un array b.
a
1 2 3
b
• Per ottenere una copia di a, non basta scrivere
double b[] = a;
poiché questo non crea un nuovo array, ma semplicemente una nuova variabile b che si riferisce allo stesso array riferito da a
(un cambiamento di a[i] cambierebbe anche b[i])
16/01/2013 26
• Per creare un array che sia effettivamente una copia identica di a, è necessario creare un nuovo oggetto-array grande come a e poi copiare singolarmente gli elementi da uno all'altro:
double[] b = new double[a.length];
// crea un nuovo oggetto-array della stessa dimensione di a
for (int i = 0; i < a.length; i++)
b[i] = a[i];
// copia ogni elemento da a a b
a
1 2 3
b
16/01/2013 27
• Per creare un array che sia effettivamente una copia identica di a, è necessario creare un nuovo oggetto-array grande come a e poi copiare singolarmente gli elementi da uno all'altro:
double[] b = new double[a.length];
// crea un nuovo oggetto-array della stessa dimensione di a
for (int i = 0; i < a.length; i++)
b[i] = a[i];
// copia ogni elemento da a a b
a
1 2 3
b
1 2 3
16/01/2013 28
Array bidimensionali
In Java gli array bidimensionali (matrici) possono essere creati tramite array di array.
16/01/2013 29
16/01/2013 30
Un array bidimensionale M può essere dichiarato come
segue:
int M[][] = new int[4][3];
in un array bidimensionale M, l’espressione M.length denota il numero di righe di M (cioè 4)
in un array bidimensionale M, l’espressione M[0].length denota il numero di colonne di M (cioè 3)
16/01/2013 31
16/01/2013 32
Esercizio
Scrivere un programma che crea e
inizializzare un array bidimensionale M
come indicato in figura.
16/01/2013 33
creazione array
int M[][] = new int[4][3];
16/01/2013 34
inizializzazione
int k=1;
for (int riga = 0; riga < M.length ; riga++)
{ for (int col = 0; col <M[0].length; col++)
{ M[riga][col] = k++; } }
16/01/2013 35
for (int i=0; i<M.length; i++)
{ for (int j=0; j<M[0].length; j++)
System.out.print(M[i][j]+" ");
System.out.println(); }
16/01/2013 36
stampa
dichiarazione con inizializzazione int[][] M;
M = new int[][] { { 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 } ,
{ 10, 11, 12 } };
16/01/2013 37
Esercizio
Inizializzare l’array bidimensionale M con
tutti 1 nella prima riga, 2 nella seconda riga
e ….k nella k-esima riga.
int M [][] = new int[3][4];
16/01/2013 38
Soluzione
int M [][] = new int[3][4];
for (int riga = 0; riga < 4; riga++)
{ for (int col = 0; col < 3; col++)
{ M[riga][col] = riga+1; } }
16/01/2013 39
• La prima volta che viene eseguito, il ciclo for esterno
esegue (con riga = 0) il ciclo for interno tre volte,
mettendo il valore 1 negli elementi della prima riga di
M,
M[0][0] = 1, M[0][1] = 1, M[0][2] = 1
La seconda esecuzione del for esterno riempirà la
seconda riga di M,
e …..la quarta riempirà l'ultima riga.
16/01/2013 40
Questionario
1)Che cos’è un array?
□ E’ una struttura dati complessa, costituita dall'aggregazione di sole due variabili,
individualmente accessibili tramite un indice;
□ E’ una struttura dati complessa, costituita dall'aggregazione di un certo numero di
variabili, individualmente accessibili tramite un indice;
□ E’ una struttura dati complessa, costituita dall'aggregazione di un certo numero di
variabili di tipo intero, individualmente accessibili tramite un indice;
□ E’ una struttura dati complessa, costituita dall'aggregazione di un certo numero di
variabili o di tipo intero o carattere, individualmente accessibili tramite un indice.
2)Quali delle seguenti non è un tipo di array?
□ Monodimensionale;
□ Tridimensionale;
□ A stella;
□ Multidimensionali.
16/01/2013 Corso di Fondamenti di Informatica1 41
16/01/2013 Corso di Fondamenti di Informatica1 42
3) Come viene dichiarato un array?
□ int x[ ]= new int[6] ;
□ int x[ ]= new int(3)
□ char c[ ]= new char(“ “) ;
□ boolean b= new boolean[3];.
4) Quali dei seguenti è un modo corretto per inizializzare un array?
□ int x[ ] = { ‘6’, ‘1’ , ‘9’};
□ char c[ ] = {a, b,c,d};
□ boolean b[ ] = { “true”, “true”, “false”};
□ boolean b[ ] = { false,true,false };.
5) Quale delle seguenti dichiarazioni è corretta per dichiarare un array di caratteri
con 10 elementi?
□ String a[]=new String[10];
□ char a[10]=new char[10];
□ char a[]=new char[10];
□ char a[]=new char[].
16/01/2013 Corso di Fondamenti di Informatica1 43
6) Java permette di oltrepassare la fine di un array in fase di esecuzione?
□ Si;
□ Si, ma solo di un elemento;
□ No, mai;
□ No, ma se si tratta di un array di caratteri si.
7) E’ possibile indicizzare un array con un valore negativo?
□ No;
□ Si, ma solo se tratta di array di tipo stringa;
□ Si;
□ Si, ma solo se si tratta di array di tipo intero.