Fopndamenti di programmazione
La classe String
•
•
•
•
Una stringa è una sequenza di caratteri
La classe String è utilizzata per memorizzare caratteri
La classe String ha metodi che consentono di operare su stringhe
Costanti di tipo String: uno o più caratteri racchiusi tra doppi apici
• Esempi:
char charVariable = `a`; // apici singoli
String stringVariable = “a”; // doppi apici
String sentence = “Hello, world”;
2
Variabili di tipo String
• Dichiarare una variabile di tipo String:
– String greeting;
• Assegnare un valore alla variabile:
– greeting = “Hello!”;
• Utilizzare la variabile come parametro di tipo String
nella chiamata di un metodo:
– System.out.println(greeting);
• stampa sullo schermo la stringa Hello!
3
Costruttori
• String(stringa):
– greeting = new String("Hello!");
• Alloca memoria per ogni stringa anche se il parametro
è lo stesso
– diverso da non usare il costruttore
String s = "Hello!";
String t = "Hello!";
String u = new String("Hello!");
String v = new String("Hello!");
System.out.println(s==t); // stampa true
System.out.println(u==v); // stampa false
4
Metodi
• length(): ritorna la lunghezza della stringa
– greeting.length() ritorna 6
• toLowerCase(): ritorna la stringa con tutti caratteri
minuscoli
– greeting.toLowerCase() ritorna hello!
• toUpperCase(): ritorna la stringa con tutti caratteri
maiuscoli
– greeting.toUpperCase() ritorna HELLO!
5
Indice di un carattere
• È un intero che, a partire da 0 per il primo
carattere, specifica la posizione del carattere
H e l
l
o !
all’interno della stringa
0

1
2
3
4
5
Metodo charAt(int p): ritorna il carattere nella
posizione specificata
» greeting.charAt(0) ritorna il carattere H mentre
greeting.charAt(2) ritorna il carattere l

Metodo substring(int s, int e): ritorna la
sotto-stringa dalla posizione s alla posizione e
(esclusa)
» greeting.substring(4,6) ritorna la stringa o!
6
Concatenazione di stringhe
• Operatore +:
String name = “I am Elisa”;
System.out.println(greeting+” “+name);
sullo schermo appare:
Hello! I am Elisa
• ricordarsi di includere gli spazi per una corretta
viualizzaziome
7
Sequenze escape
• Come stampare caratteri speciali?
– Esempio: The word is “hard”
• System.out.println(“The word is “hard””);
– Errore di compilazione: vede la stringa The word is ed è confuso da
quello che segue
• Usare il carattere backslash (ovvero, \) per indicare il
significato speciale dei doppi apici interni
– System.out.println(“The word is \“hard\””);
– la sequenza \” è detta essere una sequenza escape
8
Commenti
•
•
•
•
Scrivere commenti comprensibili ed utili
Non commentare ciò che è ovvio
Assumere che il lettore ha una conoscenza ragionevole
Tipi di commenti:
– // per commenti di una singola linea
– /* … */ per commenti di più linee
– /** … */ per commenti che producano documentazione
HTML (appendice 10)
9
Array
• Nome unico per collezione di valori tutti dello stesso
tipo di dati
• Più di un tipo primitivo, meno di un oggetto
– metodi invocati con una notazione speciale
– comportamento simile ad oggetti se usati come argomenti o
come tipi di ritorno
– niente ereditarietà
– simili ad una classe Java non completamente implementata
• Adatti per cicli (in particolare, cicli for)
10
Creazione ed accesso
• Sintassi generale per la dichiarazione:
Tipo_Base[] Nome_Array = new Tipo_Base[Lunghezza];
• Esempi:
array di 80 caratteri:
char[] symbol = new char[80];
array di 100 reali:
double[] reading = new double[100];
array di 100 stringhe:
String[] message = new String[100];
11
Uso delle parantesi quadre
• Per creare un nome di tipo
– esempio: int[] intArrayName; crea un nome di tipo
"array di int"
• tipo int diverso da tipo array di int
• tipo del nome intArrayName, non tipo dei dati inclusi nell’array (che
comunque sono di tipo int)
• Per creare un nuovo array
– esempio: numArray = new int[100];
• Per accedere ad uno specifico elemento dell’array
– esempio:
System.out.println(numArray[3]);
12
Terminologia
Nome
temperature[n + 2]
temperature[n + 2]
Indice
- deve essere un int,
- oppure un’espressione che ritorna un int
Variabili indicizzata o elemento
temperature[n + 2]
Valore della variabile indicizzata o
elemento
temperature[n + 2] = 32;
13
Lunghezza di un array
• Specificata dal numero dentro le parentesi quadre al momento della
dichiarazione
– determina la quantità di memoria allocata per gli elementi dell’array
• memoria allocata anche se agli elementi non è stato assegnato alcun valore
– determina il massimo numero di elementi che l’array può contenere
• Ottenuta mediante la sintassi .length
String[] message = new String[20];
System.out.println(message.length);
• Determinata al momento della dichiarazione
– non può essere modificata a meno di ridichiarare l’array
14
Inizializzazione di array
• Gli elementi di un array possono essere inizializzati
nell’istruzione di dichiarazione mediante una lista di valori
(separati da virgole) all’interno di parentesi graffe
– elementi non inizializzati ricevono un valore di default (ad esempio, ‘ ‘
per array di char)
– lunghezza di array determinata automaticamente se i valori sono
inizializzati esplicitamente nella dichiarazione
• Esempio:
double[] readings = {5.1, 3.02, 9.65};
System.out.println(readings.length);
- stampa 3, ovvero la lunghezza dell’array readings
15
Dominio di indicizzazione
• Indicizzazione di array usa numerazione a partire da
0
–
–
–
–
primo elemento: indice 0
secondo elemento: indice 1
n-esimo elemento: indice n-1
ultimo elemento: indice length-1
• Esempio:
int[] scores = {97, 86, 92, 71};
Indice: 0
Valore: 97
1
86
2
92
3
71
16
Errore di indice fuori del dominio
• Usare un indice più grande di length-1 causa un errore in
fase di esecuzione (non di compilazione)
– viene rigettata un'eccezione di tipo ArrayOutOfBoundsException
• Altri linguaggi di programmazione (come C e C++) non causano
neanche un errore in fase di esecuzione
– una delle caratteristiche più "pericolose" di questi linguaggi è proprio il
fatto che consentono di usare indici fuori del dominio
17
Inizializzazione con ciclo
• Elaborazione di array facile da fare in un
ciclo
• Ciclo for spesso usato per inizializzare un
array
• Esempio:
int[] a = new int[10];
for(int i = 0; i < a.length; i++)
a[i] = 0;
18
Array, classi e metodi
Dato array di oggetti, i metodi della classe
corrispondente possono essere usati sui singoli
elementi
dichiara array di Rational
ogni elemento è una
istanza di Rational
Rational[] numbers = new Rational[4];
numbers[0] = new Rational(3, 4);
numbers[1] = new Rational(1, 4);
numbers[2] = new Rational(4, 5);
numbers[3] = new Rational(1, 5);
Rational tot = numbers[0];
for (int i = 1; i < numbers.length; i++)
{
tot = numbers[i].add(tot);
}
System.out.println(tot.num+”/”+tot.den);
usa il metodo add della
classe Rational
19
Array, elementi ed argomenti
• Array ed elementi possono essere usati come
argomenti di un metodo e come tipi di ritorno
– sia un elemento che un nome di array possono essere
un argomento di un metodo
– i metodi possono ritornare un valore di un array
oppure un nome di array (incluse le parentesi
quadre)
20
Esempio
nome di array come tipo di ritorno
un elemento di a è un argomento
del metodo add
il nome v è un argomento del
metodo computeSum
static Rational[] createArray()
{
Rational[] numbers = new Rational[4];
numbers[0] = new Rational(3, 4);
numbers[1] = new Rational(1, 4);
numbers[2] = new Rational(4, 5);
numbers[3] = new Rational(1, 5);
return numbers;
}
static Rational computeSum(Rational[] a)
{
Rational tot = a[0];
for (int i = 1; i < a.length; i++)
tot = tot.add(a[i]);
return tot;
}
public static void main(String[] a)
{
Rational[] v = createArray();
Rational r = computeSum(v);
System.out.println(r.num+”/”+r.den);
}
21
Nomi di array come argomenti
• Quando si usa un intero array come argomento di un
metodo:
– si indica solo il nome dell'array senza le parentesi quadre
– il metodo ha accesso all'array originale e può modificare i
valori dei suoi elementi
– la lunghezza dell'array passato come argomento può essere
diversa ad ogni invocazione
• quando si definisce il metodo non si sa la lunghezza dell'array che
verrà passato
– utilizzare length all'interno del metodo per evitare una eccezione di
tipo ArrayIndexOutOfBoundsException
22
Esempio
l'argomento del metodo è il nome
di un array di razionali
Rational computeSum(Rational[] a)
{
if (a.length==0)
return null;
Rational tot = a[0];
for (int i=1; i<a.length; i++)
tot = tot.add(a[i]);
return tot;
}
usa length per evitare eccezioni
dovute ad indice fuori del dominio
usa length per controllare il
ciclo
23
Array ed operatore =
int[] a = new int[3];
int[] b = new int[3];
for(int i; i < a.length; i++)
a[i] = i;
Non crea una copia dell'array a ma
trasforma b in un altro nome per l'array a
b = a;
System.out.println(a[2] + " " + b[2]);
a[2] = 10;
System.out.println(a[2] + " " + b[2]);
Output:
2 2
10 10
Un valore cambiato in a
è lo stesso valore ottenuto con b
24
Array ed operatore ==
int i;
a e b sono entrambi array
int[] a = new int[3];
di 3 elementi di tipo int
int[] b = new int[3];
a tutti gli elementi di a e b
for(i=0;i<a.length;i++)
viene assegnato il valore 0
a[i] = 0;
for(i=0;i<b.length;i++)
verifica se gli indirizzi di a e b sono uguali,
b[i] = 0;
non se i valori degli array sono uguali
if(b == a)
System.out.println("a equals b");
else
System.out.println("a does not equal b");
L'output di questo codice sarà a does not equal b
perché gli indirizzi dei due array non sono uguali
25
Uguaglianza tra array
• Per verificare se due
array sono uguali
bisogna definire un
metodo equals che
ritorna il valore
true se e solo se gli
array hanno la stessa
lunghezza e tutti gli
elementi
corrispondenti sono
uguali
public boolean equals(int[] a, int[] b)
{
boolean match;
if (a.length != b.length)
match = false;
else
{
match = true;
int i = 0;
while (match && (i<a.length))
{
if (a[i] != b[i])
match = false;
i++;
}
}
return match;
}
26
Metodi che ritornano un array
• Un altro esempio di passaggio per riferimento
• In pratica, non viene restituito l'array, ma il suo
indirizzo
• Il nome della variabile a cui l'array viene
assegnato è semplicemente un altro nome per
l'array ritornato dal metodo
27
Buone regole di programmazione
• Usare nomi singolari piuttosto che plurali
migliora la leggibilità
– sebbene un array contenga molti elementi, l'uso più
frequente del suo nome sarà per indicizzare un
singolo elemento
• Non affidarsi ai valori iniziali di default per gli
elementi di un array
– inizializzare esplicitamente gli elementi nella
dichiarazione oppure in un ciclo
28
Ricerca in un array
• Esistono molte tecniche per cercare un particolare
valore all'interno di un array
• Ricerca sequenziale:
– partire dall'inizio dell'array e procedere in sequenza finché
il valore viene trovato oppure la fine dell'array viene
raggiunta
• oppure, partire dalla fine dell'array e procedere a ritroso finché il
valore viene trovato oppure l'inizio dell'array viene raggiunto
– non è il modo più efficiente, ma funziona ed è facile da
programmare
29
Esempio
public boolean inArray(int[] a, int x)
{
boolean found = false;
int i = 0;
while ((! found) && (i<a.length))
{
if (x==a[i]) found = true;
else i++;
}
return found;
}
30
Ordinare un array
• Ordinare un elenco di elementi è un compito molto
frequente
– ordinare numeri in modo crescente
– ordinare numeri in modo decrescente
– ordinare stringhe in modo alfabetico
• Vi sono molti modi per ordinare un elenco
• Selection sort
– uno dei più facili
– non il più efficiente, ma facile da capire e da programmare
31
Algoritmo Selection Sort
• Per ordinare un array di interi in modo crescente:
– cerca nell'array il numero più piccolo e scambialo con il primo elemento
dell'array
• la parte ordinata dell'array è ora il primo elemento, mentre quella non ancora
ordinata sono i rimanenti elementi
– cerca nella parte non ordinata il numero più piccolo e scambialo con il
secondo elemento dell'array
– ripeti la ricerca e lo scambio fino a quando tutti gli elementi sono al posto
giusto
• ogni iterazione aumenta di 1 la lunghezza della parte ordinata e diminuisce di
1 quella della parte non ordinata
32
Il codice
public void selectionSort(int[] a)
{
int i, j, indexOfNextSmallest, min, temp;
for (i = 0; i < a.length - 1; i++)
{
min = a[i];
indexOfNextSmallest = i;
for (j = i+1; j < a.length; j++)
if (a[j] < min)
{
min = a[j];
indexOfNextSmallest = j;
}
temp = a[i];
a[i] = a[indexOfNextSmallest];
a[indexOfNextSmallest] = temp;
}
}
33
Esempio
a[0]
7
a[1]
6
a[2]
11
a[3]
17
a[4]
3
a[5]
15
a[6]
5
a[7]
19
a[8]
30
a[9]
14
7
6
11
17
3
15
5
19
30
14
3
6
11
17
7
15
5
19
30
14
3
6
11
17
7
15
5
19
30
14
3
5
11
17
7
15
6
19
3
5
11
17
7
15
6
19
30
14
3
5
6
17
7
15
11
19
30
14
30
14
34
Il metodo main
• Il parametro formale di un metodo main è
sempre un array di oggetti di tipo String.
• La macchina virtuale java invoca il metodo
main nell’applicazione che viene passata
all’interprete
• Il parametro di tipo array di stringhe, che
solitamente viene chiamato args, rappresenta
l’insieme di argomenti passati tramite la linea di
comando all’interprete Java quando viene
invocato.
35
• Qualsiasi informazione passata dalla linea di
comando viene memorizzata nell’array args
per poter essere successivamente usata dal
programma.
• Il parametro del metodo main è sempre un
array di oggetti di tipo String, per cui se si ha
bisogno di passare dalla riga di comando
informazioni in altro formato, ad esempio
numerico, il programma dovrà convertirle in
formato stringa.
36
Scarica

lezione8