Il 0% ha trovato utile questo documento (0 voti)
6 visualizzazioni48 pagine

D10 Array PDF

Il documento discute la gestione delle sequenze di stringhe e l'utilizzo degli array in Java per risolvere problemi di programmazione. Viene presentata una soluzione per gestire sequenze di lunghezza fissa e variabile, evidenziando i vantaggi degli array rispetto alla definizione di variabili singole. Inoltre, il documento introduce la classe SequenzaDiInteri per manipolare sequenze di numeri interi, mostrando come implementare metodi per trovare il massimo e verificare la presenza di un elemento.

Caricato da

Deborah Nostrato
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
6 visualizzazioni48 pagine

D10 Array PDF

Il documento discute la gestione delle sequenze di stringhe e l'utilizzo degli array in Java per risolvere problemi di programmazione. Viene presentata una soluzione per gestire sequenze di lunghezza fissa e variabile, evidenziando i vantaggi degli array rispetto alla definizione di variabili singole. Inoltre, il documento introduce la classe SequenzaDiInteri per manipolare sequenze di numeri interi, mostrando come implementare metodi per trovare il massimo e verificare la presenza di un elemento.

Caricato da

Deborah Nostrato
Copyright
© All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

Array

Walter Didimo
Un problema ricorrente
Gli strumenti di programmazione che abbiamo
visto sin qui non sono ancora sufficienti per
risolvere tutti i problemi di base

Consideriamo ad esempio il seguente problema:


• vogliamo far inserire all’utente una sequenza di
stringhe e poi un numero intero positivo n
• vogliamo visualizzare all’utente le sole stringhe
inserite che hanno lunghezza maggiore di n
Lunghezza della sequenza
Il problema può avere due varianti:
• la lunghezza della sequenza da fare inserire
all’utente è fissata prima di scrivere il programma
• la lunghezza della sequenza da fare inserire
all’utente è scelta dall’utente stesso (e quindi non
nota all’atto della scrittura del codice)
Lunghezza fissata
Se la lunghezza della sequenza fosse fissata
all’atto della scrittura del codice, sarebbe
ancora possibile risolvere il problema con gli
strumenti che abbiamo

Supponiamo ad esempio di fissare la


lunghezza della sequenza a 4
Lunghezza fissata: una soluzione
class SequenzaStringhe{

public static void main (String[] args){


InputWindow in = new InputWindow ();
OutputWindow out = new OutputWindow ();
/* inserimento stringhe */
String s1 = [Link] ("Prima stringa?");
String s2 = [Link] ("Seconda stringa?");
String s3 = [Link] ("Terza stringa?");
String s4 = [Link] ("Quarta stringa?");
/* inserimento soglia sulla lunghezza */
int soglia = [Link] (“Soglia?”);
[Link] ("Stringhe con più di " + soglia
+ " caratteri");

…… continua
Lunghezza fissata: una soluzione
/* visualizza le stringhe più lunghe di soglia */
if ([Link]() > soglia)
[Link] (s1);
if ([Link]() > soglia)
[Link] (s2);
if ([Link]() > soglia)
[Link] (s3);
if ([Link]() > soglia)
[Link] (s4);

}
}
Limiti della soluzione vista
• La soluzione illustrata necessita di definire 4
variabili distinte per memorizzare le stringhe della
sequenza
• Inoltre, la soluzione illustrata deve ripetere le
stesse cose per ognuna delle stringhe inserite
• Cosa succede se voglio fissare la lunghezza della
sequenza a 100, o addirittura a 100.000?
– è molto dispendioso scrivere un codice in cui definisco
esplicitamente 100.000 variabili ed in cui ripeto 100.000
istruzioni “quasi” uguali!!
Lunghezza non fissata
Nel caso in cui la lunghezza della sequenza
non fosse fissata nel programma, ma decisa
dall’utente, sarebbe addirittura impossibile
scrivere il programma usando i soli strumenti
che abbiamo
• non so quante variabili debbo usare
• non so quante volte debbo fare le stesse cose
Gli array
Ogni linguaggio di programmazione fornisce
una struttura dati nota come array
Un array è una sequenza di variabili:
• tutte le variabili di un array hanno lo stesso tipo di
dato (il tipo dell’array),
array e si chiamano anche
elementi dell’array
• ogni variabile ha associato un indice (numero
intero non negativo)
• la dimensione (o lunghezza)
lunghezza dell’array è il numero
delle sue variabili
Array in Java
In Java un array è un oggetto:
• deve essere creato con l’operatore new
• all’atto della creazione devono essere specificati il
suo tipo di dato e la sua dimensione

new <tipo di dato>[dimensione]

• ad esempio, per creare un array di tipo String e di


dimensioni 10 si può scrivere

new String[10]
Dichiarazione di variabili array
Per poter usare un array è importante
memorizzarne il riferimento in una opportuna
variabile:
• una variabile array si dichiara con la seguente
sintassi

<tipo di dato> [ ] <nome variabile>

nome della variabile array


tipo di dato delle variabili
che compongono l’array
Tipo array
Per crare un array di tipo String e di dimensione 10,
e per memorizzarne il riferimento in un’opportuna
variabile, possiamo dunque scrivere

String[ ] s = new String[10]

• Se T è un tipo di dato, allora T[ ] indica un tipo


riferimento, detto tipo array;
array il tipo: “array di tipo T”;
• Gli elementi di un array di tipo T sono variabili di tipo T
• Ovunque esista un tipo di dato T, si possono dichiarare
variabili di tipo array T[ ]
Elementi di un array
Supponiamo di aver creato e memorizzato un
array di tipo String,
String al modo:
String[ ] s = new String[10]

Come si denotano gli elementi dell’array s?


Ogni elemento di s si denota al modo s[i],
s[i] dove i
è un indice compreso tra 0 (incluso) e la
dimensione dell’array (esclusa)
Elementi di un array
Ogni elemento s[i] è una variabile dello stesso
tipo (il tipo dell’array);
• nell’esempio specifico di tipo String

Ad ogni elemento s[i] si può dunque assegnare


un valore del tipo dell’array;
• nell’esempio specifico il riferimento ad un oggetto
String
Schema generico di un array
oggetto array
s
s[0]
s[1]
s[2]
s[3]
s[4] Ogni elemento s[i]
s[5] può contenere un
s[6] valore del tipo
dell’array
s[7]
s[8]
s[9]
Schema di un array di tipo String
oggetto array di tipo String
s
s[0]
s[1]
s[2]
s[3] …:String
s[4]
s[5]
s[6]
s[7]
s[8]
s[9]
Schema di un array di tipo int
oggetto array di tipo int
s
s[0] 100
s[1] -4
s[2] 255
s[3] 1040
s[4] 7
s[5] - 1400
s[6] 780
s[7] 20
s[8] 25
s[9] 39
Lunghezza fissata: soluzione con array
class SequenzaStringhe{

public static void main (String[] args){


InputWindow in = new InputWindow ();
OutputWindow out = new OutputWindow ();
final int DIM = 4;
String [] s = new String[DIM];
for (int i=0; i<DIM; i++)
s[i]=[Link] ("Stringa n." + i + "?");

la dimensione int soglia = [Link] ("Soglia?");


dell’array è [Link] ("Stringhe con più di " + soglia
memorizzata + " caratteri");
for (int i=0; i<DIM; i++)
in una
if (s[i].length() > soglia)
costante [Link] (s[i]);

}
}
Osservazioni sulla nuova soluzione
• nella nuova soluzione il codice è molto più
sintetico
• è inoltre possibile aumentare la lunghezza della
sequenza, semplicemente assegnando un valore
diverso alla costante DIM
– non occorre effettuare altre variazioni al codice

Vedremo ora come è possibile risolvere anche il


problema con lunghezza della sequenza non fissata
a priori, ma scelta dall’utente
Lunghezza variabile: soluzione 1
class SequenzaStringhe{

public static void main (String[] args){


InputWindow in = new InputWindow ();
OutputWindow out = new OutputWindow ();
int dim = [Link] (“Numero stringhe?");
String[] s = new String[dim];
for (int i=0; i<dim; i++)
s[i]=[Link] ("Stringa n." + i + "?");

la dimensione int soglia = [Link] ("Soglia?");


dell’array è [Link] ("Stringhe con più di " + soglia
scelta + " caratteri");
for (int i=0; i<dim; i++)
dall’utente
if (s[i].length() > soglia)
[Link] (s[i]);

}
}
L’attributo length
Sappiamo che un array in Java è un oggetto
• tuttavia, gli array non hanno metodi
• ogni array ha però un attributo (cioè una
proprietà, una variabile di istanza) che può
essere acceduto pubblicamente, l’attributo length
• l’attributo length memorizza la dimensione
dell’array

Se a è un array, allora l’espressione [Link]


vale la dimensione dell’array
L’attributo length - osservazioni
Negli array, length è un attributo, non un metodo!
• se a è un array, è sbagliato scrivere [Link]()!
()

L’attributo length è molto utile; ad esempio, se


passo un array come parametro ad un metodo, il
metodo potrà conoscere la dimensione dell’array
accedendo al suo attributo length
Lunghezza variabile: soluzione 2
class SequenzaStringhe{

public static void main (String[] args){


InputWindow in = new InputWindow ();
OutputWindow out = new OutputWindow ();
int dim = [Link] (“Numero stringhe?");
String[] s = new String[dim];
for (int i=0; i<[Link]; i++)
posso usare s[i]=[Link] ("Stringa n." + i + "?");
l’attributo
int soglia = [Link] ("Soglia?");
length
[Link] ("Stringhe con più di " + soglia
+ " caratteri");
for (int i=0; i<[Link]; i++)
if (s[i].length() > soglia)
[Link] (s[i]);

}
}
Assegnazioni tra array
Supponi che a e b siano due array dello stesso tipo

b
Assegnazioni tra array
Ecco cosa succede se effettuo l’assegnazione b = a

b non referenzia
più questo array,
ma tale array non
viene cambiato!
b
Copia di array
Supponi che a e b siano due array dello stesso tipo,
ed aventi la stessa dimensione
Come faccio se voglio copiare tutti i valori dell’array
a nell’array b? Il seguente codice risolve il problema

for (int i=0; i<[Link]; i++)


b[i]=a[i];
Copia di array - osservazioni
for (int i=0; i<[Link]; i++)
b[i]=a[i];

• Il codice scritto è indipendente dal tipo degli elementi


dell’array e anche dalla loro lunghezza
• Il codice scritto presuppone però che gli array abbiano
elementi dello stesso tipo e la stessa dimensione (o che
la dimensione di b sia non inferiore a quella di a)
Array – un errore molto comune
Cosa succede se si tenta di accedere ad un elemento di
un array usando un indice troppo basso o troppo alto
(cioè minore di 0 o maggiore di length-1?)

Viene rilevato un errore durante l’esecuzione del


programma, ed il programma termina.
L’errore segnalato è il seguente:
ArrayIndexOutOfBoundsException
Array – inizializzazione
Quando creo un array, che valore viene assegnato ai
suoi elementi?

Java inizializza gli elementi di un array con un valore


“nullo” di default, che dipende dal tipo degli elementi
• ad esempio, se scrivo
int[ ] a = new int[10];
ogni a[i] è inizializzato a 0
• se invece scrivo
String[ ] a = new String[10];
ogni a[i] è inizializzato a null
Tecniche iterative sugli array
Illustriamo ora alcune tecniche iterative di base sugli
array, che permettono di risolvere problemi comuni
quali:
• estrazione di un valore massimo in una sequenza
• ricerca di un valore in una sequenza
• verifica dell’uguaglianza tra due sequenze

Le tecniche saranno illustrate attraverso la definizione


di una classe che rappresenta sequenze di numeri
interi
La classe SequenzaDiInteri
Vogliamo definire una classe di nome
SequenzaDiInteri,
SequenzaDiInteri in base alle seguenti specifiche
• un oggetto della classe rappresenta una sequenza
finita di numeri interi
• un oggetto SequenzaDiInteri viene creato passando
al costruttore, come parametro, la sequenza che
l’oggetto deve rappresentare
• la classe avrà vari metodi di istanza per manipolare
la sequenza rappresentata
SequenzaDiInteri: scheletro
class SequenzaDiInteri {
/* variabile tipo array che memorizza la sequenza */
private int[] seq;
/* costruttore: crea un oggetto che rappresenta
la sequenza specificata come parametro sotto
forma di array */
public SequenzaDiInteri (int[] seqRappresentata){..}
/* restituisce il massimo elemento della sequenza;
PRE: la sequenza è non vuota */
public int massimo (){..}
/* restituisce true se la sequenza contiene
l'elemento specificato e false altrimenti */
public boolean contiene (int k){..}
/* restituisce true se la sequenza (this) è uguale
a quella passata come parametro (altra) */
public boolean equals (SequenzaDiInteri altra){..}
}
Uso della classe SequenzaDiInteri
Prima di scrivere il corpo dei metodi della classe
SequenzaDiInteri,
SequenzaDiInteri vediamo il codice di una
classe che usa la classe SequenzaDiInteri
• vedere come i metodi della classe SequenzaDiInteri
possono essere usati ci aiuterà a capire meglio come
essi vanno implementati
La classe ProvaSequenzaDiInteri
class ProvaSequenzaDiInteri{
public static void main (String[] args){
InputWindow in = new InputWindow ();
OutputWindow out = new OutputWindow ();

/* fa inserire un array di interi di lunghezza


decisa dall'utente */
int dim = [Link] ("Lunghezza sequenza?");
int[] a = new int[dim];
for (int i=0; i<[Link]; i++)
a[i] = [Link] ("Intero in posizione " + i);

… continua
La classe ProvaSequenzaDiInteri
/* crea un oggetto SequenzaDiInteri che rappresenta
la sequenza memorizzata nell'array a */
SequenzaDiInteri sequenza = new SequenzaDiInteri(a);

/* visualizza il massimo valore nella sequenza */


[Link] ("Massimo = " + [Link]());

il costruttore prende in
il metodo massimo
ingresso, sotto forma di
restituisce un intero,
array, la sequenza di
il max. della sequenza
numeri da rappresentare
… continua
La classe ProvaSequenzaDiInteri
/* ricerca nella sequenza un intero scelto
dall'utente */
int n = [Link] ("Numero da ricercare");
if ([Link](n))
[Link] ("Il numero esiste");
else
[Link] ("Il numero non esiste");

… continua

restituisce true/false
La classe ProvaSequenzaDiInteri
/* fa inserire una nuova sequenza e la confronta con
la precedente */
dim = [Link] ("Lunghezza sequenza?");
a = new int[dim];
for (int i=0; i<[Link]; i++)
a[i] = [Link] ("Intero in posizione " + i);
SequenzaDiInteri altraSeq = new SequenzaDiInteri(a);
if ([Link](altraSeq))
[Link] ("Sequenza uguali");
else
[Link] ("Sequenze diverse");
} restituisce true/false
}
SequenzaDiInteri: costruttore
Ecco un possibile codice per il costruttore
public SequenzaDiInteri (int[] seqRappresentata){
[Link] = seqRappresentata;
}

seqRappresentata

this :SequenzaDiInteri

seq
SequenzaDiInteri: costruttore
Ecco un secondo codice per il costruttore
public SequenzaDiInteri (int[] seqRappresentata){
[Link] = new int[[Link]];
for (int i=0; i<[Link]; i++)
[Link][i]=seqRappresentata[i];
}
seqRappresentata

this :SequenzaDiInteri

PIA
seq
CO
SequenzaDiInteri: massimo
si inizializza il max con il
public int massimo (){ primo elemento della
int max = seq[0]; sequenza
for (int i=1; i<[Link]; i++)
if (max < [Link][i])
max=[Link][i];
return max;
}

se l’elemento i-esimo è superiore al max


corrente, allora si aggiorna il max corrente
(al ciclo i-esimo, max conterrà il massimo
dei primi i elementi)
SequenzaDiInteri: contiene
public boolean contiene (int k){
boolean esiste = false;
int i = 0;
while (!esiste && i<[Link]){
if ([Link][i]==k)
esiste = true;
i++;
}
la scansione termina non
return esiste;
appena si trova l’elemento
} cercato o quando sono stati
esaminati tutti gli elementi della
sequenza
SequenzaDiInteri: equals
public boolean equals (SequenzaDiInteri altra){
boolean uguali;
if ([Link] != [Link])
uguali = false;
else{
uguali = true;
int i=0;
while (uguali && i<[Link]){
if ([Link][i] != [Link][i])
uguali = false;
i++;
} Il ciclo termina non appena si
}
trovano due elementi diversi in
return uguali;
posizione uguale, oppure quando
}
sono stati esaminati tutti gli elementi
Il metodo equals: osservazioni
Il metodo equals in Java è un metodo speciale
• quando si ha bisogno di scrivere un metodo di
istanza di una classe A, che confronta per uguaglianza
due oggetti di A, è bene definire il metodo

public boolean equals (A altro)

Nell’implementazione di equals,
equals si confronta lo
stato dell’oggetto this con lo stato dell’oggetto
altro
Il metodo main – a volte ritornano!
Ora che abbiamo capito cosa sono gli array,
possiamo capire completamente l’intestazione del
metodo speciale main

public static void main (String[ ] args)

Sappiamo che main è un metodo pubblico, statico


e che non restituisce alcun valore
Il parametro del main

public static void main (String[ ] args)

Ora siamo anche in grado di capire che main ha


un parametro formale di nome args e di tipo
“array di tipo String”
String
• ma chi passa al main l’array args?
args
• chi lancia il programma, attraverso la specifica di una
sequenza di stringhe (eventualmente vuota)
Parametri sulla linea di comando
Quando si lancia l’esecuzione di un programma Java, è
possibile specificare una sequenza di stringhe da passare
come parametro al metodo main

java Programma <stringa1> <stringa2> …. <stringa n>

• args viene automaticamente dimensionato con il


numero di stringhe passate
• args[i] memorizza la stringa i-esima della sequenza
• se la sequenza è vuota, la dimensione di args è 0
• le stringhe passate si chiamano parametri della linea
di comando
Un esempio di uso di args
Supponiamo di voler scrivere un semplice programma che
prende dalla linea di comando due stringhe e che
visualizza quella più lunga
class StringaLunga{
public static void main (String[] args){
String piùLunga;
if (args[0].length() > args[1].length())
piùLunga = args[0];
else
piùLunga = args[1];
[Link] (piùLunga);
}
}
Glossario dei termini principali
Termine Significato
Array Struttura dati che consente di rappresentare una sequenza di
variabili di uno stesso tipo di dati
Tipo di un array Il tipo di dato delle variabili che formano un array

Elementi di un array Insieme delle variabili che formano un array

Indice di un elemento L’indice intero associato ad una variabile (elemento) di un


array
Dimensione di un array Numero degli elementi di un array (si parla anche di lunghezza
dell’array)
Tipo array Tipo riferimento associato ad un array

length Attributo pubblico di un array, che memorizza la sua


dimensione
ArrayIndexOutOfBoundsException Errore segnalato in fase di esecuzione di un programma
quando si tenta di accedere ad un indice inesistente di un
array
Parametri della linea di comando Parametri passati al main di un programma quando si avvia la
sua esecuzione

Potrebbero piacerti anche