Fondamenti di Informatica 1 Richiami di Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica
Fondamenti di Informatica 1
Dispensa 2
Richiami di
Fondamenti di Informatica - 1
A. Miola
Febbraio 2008
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
1
Contenuti
‰ Alcuni argomenti fondamentali
ƒ Tipi primitivi e tipizzazione delle espressioni
ƒ Istruzioni semplici e strutturate
ƒ Linguaggi e grammatiche
‰ Legame dei parametri
‰ Iterazione
ƒ Verifiche esistenziali
ƒ Verifiche universali
‰ Tipi riferimento
ƒ Stringhe
ƒ Array
ƒ Array di oggetti
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
2
Alcuni argomenti fondamentali
Per un migliore apprendimento degli argomenti
del corso di Fondamenti di Informatica 2 è
indispensabile riprendere alcuni capitoli
importanti del precedente corso di Fondamenti
di Informatica 1
In particolare :
ƒ Tipi primitivi e tipizzazione delle espressioni
ƒ Istruzioni semplici e strutturate
ƒ Linguaggi e grammatiche
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
3
Legame di parametri - primitivi
class LegameParametri_1 {
public static void alfa(int b, int a) {
System.out.println("2: a vale " +a+ ", b vale "+b);
a = a - 3;
b = b + 6;
System.out.println("3: a vale " +a+ ", b vale "+b);
}
public static void main(String[] args) {
double a, b;
a = 3.0;
b = 6.0;
System.out.println("1: a vale " +a+ ", b vale "+b);
alfa( (int) (a/b + 2.1), (int) (b/a - 1.2));
System.out.println("4: a vale " +a+ ", b vale "+b);
} }
1: a vale 3.0 , b vale 6.0
2: a vale 0 , b vale 2
3: a vale -3 , b vale 8
4: a vale 3.0 , b vale 6.0
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
4
Legame di parametri - primitivi
class LegameParametri_2 {
public static void alfa(double b, double a) {
System.out.println("2: a vale " +a+ ", b vale "+b);
a = a/5+1;
b = b*2+2;
System.out.println("3: a vale " +a+ ", b vale "+b);
}
public static void main(String[] args) {
int a, b;
a = 2;
b = 5;
System.out.println("1: a vale " +a+ ", b vale "+b);
alfa(a/b-1,b/a+2);
System.out.println("4: a vale " +a+ ", b vale "+b);
} }
1: a vale 2 , b vale 5
2: a vale 4.0 , b vale -1.0
3: a vale 1.8 , b vale 0.0
4: a vale 2 , b vale 5
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
5
Legame di parametri - riferimento
class LegameParametri_3 {
public static void alfa(TriangoloEquilatero q, TriangoloEquilatero p) {
System.out.println("2: Il lato di p vale " + p.getLato()+
" , Il lato di q vale " + q.getLato() );
p = new TriangoloEquilatero(2);
q.setLato(4);
System.out.println("3: Il lato di p vale " + p.getLato()+
" , Il lato di q vale " + q.getLato() );
public static void main(String[] args) {
TriangoloEquilatero p = new TriangoloEquilatero (3);
TriangoloEquilatero q = new TriangoloEquilatero (5);
System.out.println("1: Il lato di p vale " + p.getLato()+
" , Il lato di q vale " + q.getLato());
alfa(p,q);
System.out.println("4: Il lato di p vale " + p.getLato() +
" , Il lato di q vale " + q.getLato());
1: Il lato di p
2: Il lato di p
3: Il lato di p
4: Il lato di p
http://www.dia.uniroma3.it/~java/fondinf1/
3
5
2
4
, Il lato di q
, Il lato di q
, Il lato di q
, Il lato di q
Richiami di FdI-1
}
}}
5
3
4
5
6
Legame di parametri - riferimento
class LegameParametri_4 {
public static void alfa(Quadrato q, Quadrato p) {
System.out.println("2: Il lato di p vale " + p.getLato()+
" , Il lato di q vale " + q.getLato() );
p = new Quadrato(5);
q.setLato(7);
System.out.println("3: Il lato di p vale " + p.getLato()+
" , Il lato di q vale " + q.getLato() );
public static void main(String[] args) {
Quadrato p = new Quadrato(4);
Quadrato q = new Quadrato(6);
System.out.println("1: Il lato di p vale " + p.getLato()+
" , Il lato di q vale " + q.getLato());
alfa(p,q);
System.out.println("4: Il lato di p vale " + p.getLato() +
" , Il lato di q vale " + q.getLato());
1: Il lato di p
2: Il lato di p
3: Il lato di p
4: Il lato di p
http://www.dia.uniroma3.it/~java/fondinf1/
4
6
5
7
, Il lato di q
, Il lato di q
, Il lato di q
, Il lato di q
Richiami di FdI-1
}
}}
6
4
7
6
7
Iterazione
Bisogna anche riprendere tutti gli argomenti e gli
esercizi relativi ai problemi di iterazione:
‰ Verifiche esistenziali
‰ Verifiche universali
‰ Ricerca
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
8
Verifica esistenziale
‰ Bisogna determinare se una sequenza di
elementi contiene almeno un elemento che
soddisfa una certa proprietà
‰ in altre parole:
si vuole verificare che in una sequenza di
elementi a1,…, an esiste almeno un elemento che
verifica una data proprietà p cioè che
∃ i ∈{1,..,n}, p(ai) = true
N.B. Una sequenza può essere ad esempio una
stringa o un array
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
9
Verifica esistenziale: schema risolutivo …
‰Viene usata una variabile booleana che indica
se la sequenza contiene almeno un elemento
che soddisfa la proprietà
‰Inizialmente si assegna alla variabile booleana
un valore che indica convenzionalmente che la
sequenza non contiene nessun elemento che
soddisfa la proprietà (false)
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
10
… schema risolutivo …
‰A partire dal primo elemento della sequenza si
verifica se l’elemento corrente soddisfa la
proprietà
• se l’elemento corrente soddisfa la
proprietà, allora si assegna alla variabile
booleana un valore che indica
convenzionalmente che la sequenza
contiene almeno un elemento che soddisfa
la proprietà (true)
‰Quando si trova un elemento che soddisfa la
proprietà ci si ferma (non ha senso esaminare
oltre perché il problema è risolto)
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
11
… schema risolutivo
boolean proprietaSoddisfatta;
// almeno un elemento
// soddisfa la proprietà
proprietaSoddisfatta = false;
... altre inizializzazioni ...
finche’ non trovo un elemento che soddisfa la
proprieta’
while (!proprietaSoddisfatta && sequenza non
terminata) {
... accedi al prossimo elemento ...
if (l’elemento corrente soddisfa la proprietà)
proprietaSoddisfatta = true;
}
... altre elaborazioni ...
usare un nome opportuno per la variabile booleana
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
12
Un errore comune
‰Un errore comune nella verifica esistenziale
• ri-assegnare alla variabile booleana usata per la verifica esistenziale il valore
che gli è stato assegnato nella sua inizializzazione
contieneZero = false;
while (!Lettore.in.eoln()&& !contieneZero) {
/* legge il prossimo elemento della sequenza */
numero = Lettore.in.leggiInt();
/* se numero vale zero, allora la sequenza
* contiene almeno uno zero */
if (numero==0)
contieneZero = true;
else
contieneZero = false;
}
• Se nella condizione del while non compare !contieneZero il
programma verifica se l’ultimo elemento della sequenza letta vale zero
• Se nella condizione del while compare !contieneZero l’ultimo else e’
inutile
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
13
Verifica se una sequenza contiene
almeno uno zero
... legge una sequenza di numeri interi e
verifica se contiene almeno uno zero ...
int numero;
// elemento corrente della sequenza
boolean contieneZero;
// la sequenza contiene almeno
// un elemento uguale a zero
... visualizza un messaggio ...
/* legge la sequenza e verifica
* se contiene almeno uno zero */
contieneZero = false;
while (!Lettore.in.eoln() && !contieneZero) {
/* legge il prossimo elemento della sequenza */
numero = Lettore.in.leggiInt();
/* se numero vale zero, allora la sequenza
* contiene almeno uno zero */
if (numero==0)
contieneZero = true;
}
... il risultato è contieneZero ...
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
14
Verifica universale
‰Un problema di verifica universale consiste nel
verificare se tutti gli elementi di una sequenza
a1,…, an soddisfano una certa proprietà p
• una variante (duale) dei problemi di verifica esistenziale
‰In altre parole:
ƒUn problema di verifica universale è soddisfatto, se tutti gli elementi
verificano una data proprietà p:
∀ i ∈ {1,..,n}, p(ai) = true
ƒOppure un problema di verifica universale non è soddisfatto se
esiste almeno un elemento che non verifica p:
∃ i ∈ {1,..,n}, p(ai) = false
La verifica universale si può sempre ricondurre
alla verifica esistenziale
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
15
Verifica universale: schema risolutivo
‰Un problema di verifica universale può essere
sempre ricondotto a un problema di verifica
esistenziale
ƒ il problema diventa quello di verificare se non esiste
nessun elemento della sequenza che non soddisfa la
proprietà
ƒ inizialmente si assegna alla variabile booleana un valore
che indica convenzionalmente che tutti gli elementi della
sequenza soddisfano la proprietà (true)
ƒ per ogni elemento della sequenza, si verifica se
l’elemento corrente non soddisfa la proprietà
• se l’elemento corrente non soddisfa la proprietà, allora si
assegna alla variabile booleana un valore che indica
convenzionalmente che non tutti gli elementi della sequenza
soddisfano la proprietà (false)
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
16
Verifica universale:schema risolutivo
boolean proprietaSoddisfatta;
/* assumo che tutti gli elementi soddisfano
la proprieta’ */
proprietaSoddisfatta = true;
... altre inizializzazioni ...
finche’ non trovo un elemento che non soddisfa
la proprieta
while (proprietaSoddisfatta &&
la sequenza non e’ finita){
... accedi al prossimo elemento ...
if (l’elemento corrente non soddisfa la
proprietà)
proprietàSoddisfatta = false;
}
... altre elaborazioni ...
usare un nome opportuno per la variabile booleana
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
17
Verifica se una sequenza di dieci
elementi è crescente
... legge una sequenza di dieci numeri interi e
verifica se è crescente ...
int numero;
// elemento corrente della sequenza
int precedente;
// elemento che precede numero
// nella sequenza
int i;
// per contare i numeri letti
boolean crescente;
// la sequenza è crescente
/* il primo elemento della sequenza è il
* precedente del prossimo che sarà letto */
precedente = Lettore.in.leggiInt();
/* finora la sequenza letta è crescente */
crescente = true;
i=0;
/* legge e elabora gli altri elementi della sequenza */
while(i<10 && crescente) {
/* legge il prossimo numero e verifica che
* la sequenza sia ancora crescente */
numero = Lettore.in.leggiInt();
if (precedente>=numero)
crescente = false; i++;
/* prepara la prossima iterazione */
precedente = numero;
} ... il risultato della verifica è crescente ...
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
18
Verifica l’uguaglianza tra stringhe
‰Scrivere un metodo boolean uguali(String s,
String t) che verifica se le stringhe s e t sono
uguali
ƒsi comporta come s.equals(t)
• ad esempio, uguali("alfa", "alfa") deve restituire true, mentre
uguali("alfa", "beta") deve restituire false
ƒdue stringhe s e t sono uguali se
• s e t hanno la stessa lunghezza
• ciascun carattere della stringa s è uguale al carattere della stringa
t che occupa la stessa posizione
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
19
Uguaglianza tra stringhe
‰Algoritmo:
• continua il confronto tra le stringhe solo se finora non sono state
riscontrate differenze
/* verifica se s e t sono uguali */
if (s.length()==t.length()) {
/* s e t hanno la stessa lunghezza: s e t
/* possono essere uguali, ma sono diverse
* se contengono almeno un carattere diverso */
uguali = true;
i = 0;
while (uguali && i<s.length()) {
if (s.charAt(i) != t.charAt(i))
uguali = false;
i = i+1;
}
else /*s e t hanno lunghezza diversa, quindi sono diverse */
uguali = false;
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
20
Verifica esistenziale e verifica universale
‰ Verifica esistenziale:
ƒ Si vuole verificare che in una sequenza di elementi
a1,…, an esiste almeno un elemento che verifica una data proprietà p
cioè che
∃ i ∈{1,..,n}, p(ai) = true
‰ Verifica universale:
ƒ Si vuole verificare che in una sequenza di elementi
a1,…, an tutti gli elementi della sequenza verificano una data proprietà
p cioè che
∀ i ∈ {1,..,n}, p(ai) = true
ƒ Oppure si può verificare che esiste almeno un elemento che non
verifica la proprietà p: in tal caso la verifica universale non è
soddisfatta
∃ i ∈ {1,..,n}, p(ai) = false
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
21
Altri argomenti fondamentali
Per un migliore apprendimento degli argomenti
del corso di Fondamenti di Informatica 2 è
indispensabile riprendere anche altri capitoli
importanti del precedente corso di Fondamenti
di Informatica 1
In particolare quelli relativi ai Tipi riferimento :
ƒ Stringhe
ƒ Array
ƒ Array di oggetti
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
22
Ancora sulla classe libro
‰ Data la classe Libro per rappresentare oggetti libro con
il nome dell’autore, il titolo e il numero di pagine e con i
relativi metodi d’istanza
ƒ Costruire un array di oggetti di tipo Libro: elencoLibri (già fatto)
ƒ scrivere un metodo che, ricevendo come parametro un array di
stringhe (selezioneLibri) che rappresentano ciascuna il nome di
un autore, calcola e restituisce un array di libri formato da tutti e
soli i libri degli autori indicati e presenti nell’elenco elencoLibri
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
23
Esempio
‰ Dato il seguente elenco di libri :
elencoLibri = new Libro[10];
elencoLibri[0] = new Libro("Esopo","Le storie dell'asino",20);
elencoLibri[1] = new Libro("Italo Calvino", "Il visconte
dimezzato",158);
elencoLibri[2] = new Libro("Esopo","Le storie del cane",20);
elencoLibri[3] = new Libro("Esopo","Le favole piu' belle",98);
elencoLibri[4] = new Libro("Gianni Rodari","Filastrocche
lunghe e corte",80);
elencoLibri[5] = new Libro("Italo Calvino","le
cosmicomiche",250);
elencoLibri[6] = new Libro("Gianni Rodari","Enciclopedia della
favola",1120);
elencoLibri[7] = new Libro("Italo Calvino","Il barone
rampante",135);
elencoLibri[8] = new Libro("Fratelli Grimm","Raperonzolo",36);
elencoLibri[9] = new Libro("Italo Calvino","Il cavaliere
inesistente",124);
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
24
Esempio
‰ E dato l’array di autori {“Fratelli Grimm”,
“Gianni Rodari”}, viene creato un nuovo
array selezioneLibri formato da:
selezioneLibri[0] = Libro("Gianni
Rodari","Filastrocche
lunghe e corte",80);
selezioneLibri[1] = Libro("Gianni
Rodari","Enciclopedia della
favola",1120);
selezioneLibri[2] = Libro("Fratelli
Grimm","Raperonzolo",36);
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
25
L’algoritmo per selezionare l’elenco
‰Utilizzo un array di booleani ok (inizializzato
tutto a false) parallelo ad elenco per “spuntare”
i libri degli autori indicati (autori) e allo stesso
tempo conto il numero di elementi spuntati
(dim), che corrisponderà alla dimensione del
nuovo array
‰Creo il nuovo array res di dimensione dim
‰Esamino l’array di booleani ed inserisco nel
nuovo array solo i libri il cui corrispondente
valore booleano nell’array ok è true
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
26
Il metodo seleziona…
‰Dichiarazioni e inizializzazioni
public static Libro[] seleziona(Libro[] elenco, String[]
autori){
int i,j; // per scorrere gli array
int k; // per scorrere l'array risultato da creare
boolean[] ok; // per tenere nota dei libri da
// memorizzare nel risultato
int dim;
// per calcolare la dimensione
// del nuovo array da creare
Libro[] res;
String app;
/* inizializzo l'array di booleani */
ok = new boolean[elenco.length];
for (i=0; i< elenco.length; i++)
ok[i] = false;
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
27
…Il metodo seleziona…
‰Spunta dei libri degli autori indicati nell’array
autori
dim = 0;
/* i scorre gli autori,
j scorre tutto l'elenco di libri e l'array
(parallelo) di booleani */
for (i=0; i<autori.length; i++){
app = autori[i]; //seleziono l'autore da cercare
for (j=0; j<elenco.length; j++)
if (elenco[j].getAutore().equals(app)){
ok[j] = true;
dim++;
}
}
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
28
…Il metodo seleziona…
‰Creazione dell’array risultato res
/* creo il nuovo array */
res = new Libro[dim];
k=0;
/* scorro l'array di booleani per vedere gli
autori da inserire */
for (i=0; i<elenco.length; i++)
if (ok[i] == true){
res[k] = elenco[i];
k++;
}
return res;
}
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
29
Esempio d’esecuzione
====================================
========== ELENCO LIBRI ============
====================================
AUTORE: Esopo
TITOLO: Le storie dell'asino
N. PAGINE: 20
AUTORE: Italo Calvino
TITOLO: Il visconte dimezzato
N. PAGINE: 158
AUTORE: Esopo
TITOLO: Le storie del cane
N. PAGINE: 20
AUTORE: Esopo
TITOLO: Le favole piu' belle
N. PAGINE: 98
AUTORE: Gianni Rodari
TITOLO: Enciclopedia della favola
N. PAGINE: 1120
AUTORE: Italo Calvino
TITOLO: Il barone rampante
N. PAGINE: 135
******* ELENCO SELEZIONATO *********
====================================
========== ELENCO LIBRI ============
====================================
AUTORE: Italo Calvino
TITOLO: Il visconte dimezzato
N. PAGINE: 158
AUTORE: Fratelli Grimm
TITOLO: Raperonzolo
N. PAGINE: 36
AUTORE: Italo Calvino
TITOLO: le cosmicomiche
N. PAGINE: 250
AUTORE: Italo Calvino
TITOLO: Il cavaliere inesistente
N. PAGINE: 124
AUTORE: Italo Calvino
TITOLO: Il barone rampante
N. PAGINE: 135
*******
AUTORE: Fratelli Grimm
TITOLO: Raperonzolo
N. PAGINE: 36
AUTORE: Gianni Rodari
TITOLO: Filastrocche lunghe e corte
N. PAGINE: 80
AUTORE: Italo Calvino
TITOLO: Il cavaliere inesistente
N. PAGINE: 124
AUTORE: Italo Calvino
TITOLO: le cosmicomiche
N. PAGINE: 250
http://www.dia.uniroma3.it/~java/fondinf1/
Press any key to continue . . .
Richiami di FdI-1
30
Considerazioni
‰Per ogni autore da selezionare devo esaminare
tutto l’elenco dei libri: è realistico?
‰Immaginiamo un vero catalogo di una biblioteca
‰Se l’array fosse già ordinato, per esempio per
autore e se anche la lista di autori fosse
ordinata, come cambierebbe l’algoritmo?
http://www.dia.uniroma3.it/~java/fondinf1/
Richiami di FdI-1
31