Programmazione II Lezione 13 Daniele Sgandurra [email protected] 3/12/2010 1/29 Programmazione II Lezione 13 3/12/2010
Programmazione IILezione 13
Daniele Sgandurra
3/12/2010
1/29 Programmazione II Lezione 13 3/12/2010
Sommario
1 Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
2 JavaOggetti e Classi
2/29 Programmazione II Lezione 13 3/12/2010
Strutturare il Controllo
Parte I
Strutturare il Controllo
3/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Comandi Iterativi
I comandi visti finora (senza salti) possono esprimere una computazione
finita di lunghezza (determinata staticamente) proporzionale alla
lunghezza del programma:
non Turing-completezza.
Linguaggi a basso livello:
salti (jump, goto).
Linguaggi ad alto livello:
iterazione strutturata:
iterazione determinata;iterazione indeterminata.
ricorsione:
iterazione implicita.
4/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Iterazione Indeterminata (1)
Iterazione logicamente controllata formata da due parti:
condizione (o guardia): espressione;corpo: comando.
Sintassi (Algol e derivati):
w h i l e ( Bexp ) do C
1 viene valutata l’espressione (booleana) Bexp;2 se vera, si esegue C e si torna a 1, altrimenti il comando while
termina.
Implementata sulla macchina fisica con un salto condizionato.
Sequenza + selezione + iterazione indeterminata: Turing completezza dellinguaggio.
5/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Iterazione Indeterminata (2)
In molti linguaggi esiste anche l’istruzione che esegue il controllo dopoaver eseguito il comando; es., (Pascal):
r e p e a t C u n t i l Bexp
analogo a:
C ;w h i l e not Bexp do C
In C, C++, Java:
do C w h i l e Bexp
corrisponde a:
C ;w h i l e Bexp do C
6/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Iterazione Determinata (1)
Iterazione controllata numericamente:
meno potente di quella indeterminata ma utile (pragmatica).
Sintassi:
f o r I = inizio to fine by passo docorpo
dove:
I e la variabile di controllo del ciclo;inizio e fine sono espressioni che rappresentano, rispettivamente,i valori iniziale e finale assunti dalla variabile di controllo;passo e una costante che rappresenta l’incremento progressivo dellavariabile;corpo e il comando che si vuole iterare.
Vincolo (semantica statica): la variabile di controllo non puo esseremodificata nel corpo.
7/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Iterazione Determinata (2)
Semantica:
1 valutate le espressioni inizio e fine e i valori sono copiati in altrevariabili (inizio save e fine save);
2 I e inizializzata con il valore di inizio save;3 se il valore di I e strettamente maggiore del valore di fine save,
termina l’esecuzione del for;4 si esegue corpo e si incrementa I del valore di passo;5 si torna a 3.
Se passo e negativo, al passo 3 si verifica che I sia strettamente minoredi fine save.
Determinare il numero di volte che il corpo verra eseguito prima che il
ciclo abbia inizio:
iteration count = b fine−inizio+passopasso
c.Non e possibile ottenere cicli infiniti.
8/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Iterazione Determinata (3)
Il for in C:
f o r ( exp1 ; exp2 ; exp3 )comando
1 valuta exp1;2 valuta exp2: se e zero, termina il for;3 esegui il corpo (comando);4 valuta exp3 e riprendi da 2.
Nessun vincolo sui valori delle espressioni ne sulla modificabilita dellevariabili coinvolte nelle espressioni.
Spesso, le variabili di controllo sono locali al ciclo (C++ e Java).
Si sfrutta il fatto che in C anche un comando produce un valore (quindi,puo essere visto come espressione).
9/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Iterazione Determinata (4)
Il comando for-each:
foreach ( ParametroFormale : Espressione ) Comando
si applica il comando Comando a ognuno degli elementi selezionati(ParametroFormale) dalla struttura dati che rappresenta il valore diEspressione. Esempio:
i n t somma ( i n t [ ] A )i n t acc = 0 ;foreach ( i n t e : A )
acc += e ;r e t u r n acc ;
10/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Programmazione Strutturata
Progettazione top-down (o comunque gerarchica).
Modularizzazione del codice:
raggruppare codice che svolge una specifica funzione;comandi per l’astrazione del controllo (sottoprogrammi).
Uso di nomi significativi e uso estensivo dei commenti:
essenziali per la leggibilita, la verifica e il riuso del codice.
Uso di tipi strutturati:
aggregati di tipi anche differenti (es., record).
Uso di costrutti strutturati per il controllo:
un punto di ingresso / un punto di uscita;consente la nidificazione del codice (piu leggibile e modificabile).
11/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Ricorsione
Definizioni induttive comuni in Matematica:
devono essere ben poste; ad esempio, la seguente definizione non vabene:
f (0) = 1
f (n) = f (n) + 1 per n > 1
implementare la funzione f definita su argomenti di un dominio;f deve chiamare se stessa su argomenti piu piccoli;garanzia di assenza di catene infinite di argomenti piu piccoli inmodo da giungere prima o poi a casi di base.
In Informatica: sottoprogramma che richiama se stesso:
direttamente o indirettamente (mutua ricorsione);possibile implementare anche funzioni che non terminano (iprogrammi definiscono funzioni parziali).
12/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Ricorsione in Coda
La ricorsione rende necessaria la gestione dinamica della memoria (pila di
RdA):
istanze dello stesso sottoprogramma in numero variabile.
A volte e possibile risparmiare questo spazio in memoria a seconda della
definizione della funzione:
riutilizzo dello stesso spazio in memoria.
13/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Ricorsione: Esempio
1 i n t fatt ( i n t n ) {2 i f ( n <= 1)3 r e t u r n 1 ;4 e l s e5 r e t u r n n ∗ fatt (n−1) ;6 }
Il valore del risultato intermedio nel RdA per f (n) puo essere determinatosolo al termine della chiamata di f (n − 1), e cosı via.
Quindi, tutti i RdA devono coesistere.
14/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Ricorsione: Esempio
Pila dei RdA dopo la chiamata fatt(3) e le due chiamate ricorsivefatt(2) e fatt(1).
15/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Ricorsione in Coda (1)
1 i n t fattrc ( i n t n , i n t res ) {2 i f ( n <= 1)3 r e t u r n res ;4 e l s e5 r e t u r n fattrc ( n − 1 , n ∗ res ) ;6 }
Chiamate ricorsive prodotte da fattrc(n,1):
fattrc(n-1,n*1);fattrc(n-2,(n-1)*n*1);...fattrc(1,2*...*(n-1)*n*1).
Valore finale pari a quello dell’ultima chiamata.
Non occorre risalire alle chiamate precedenti: basta un solo RdA.
La memoria potrebbe essere allocata staticamente.
16/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Ricorsione in Coda (2)
Ricorsione in Coda
Sia f una funzione che nel suo corpo contenga la chiamata a una funzione g .La chiamata di g si dice “chiamata in coda” (tail call), se la funzione frestituisce il valore restituito da g senza dover fare alcuna ulteriorecomputazione. Diciamo che la funzione f ha la ricorsione in coda (e tailrecursive) se tutte le chiamate ricorsive presenti in f sono chiamate in coda.
Esempio:
1 i n t f ( i n t n ) {2 i f ( n == 0)3 r e t u r n 1 ;4 e l s e5 i f ( n == 1)6 r e t u r n f ( 0 ) ; // i n coda7 e l s e8 i f ( n == 2)9 r e t u r n f (n−1) ; // i n coda
10 e l s e11 r e t u r n f ( 1 ) ∗ 2 ; // non i n coda12 }// q u i n d i , f non ha l a r i c o r s i o n e i n coda
17/29 Programmazione II Lezione 13 3/12/2010
Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata
Ricorsione in Coda: Trasformazione
In generale, una funzione ricorsiva si puo trasformare in una funzione
ricorsiva in coda equivalente con opportune complicazioni:
anticipare tutta la computazione che avverrebbe dopo la chiamataricorsiva;quello che non puo essere anticipato va passato alla chiamataattraverso parametri aggiuntivi (res nell’esempio precedente).
Continuation passing style: tecnica di trasformazione che usa una
funzione di appoggio (detta continuazione) per la parte rimanente da
calcolare:
funzione passata nella chiamata ricorsiva;se usa variabili valutate dal chiamante potrebbe modificare ilmeccanismo della ricorsione in coda.
18/29 Programmazione II Lezione 13 3/12/2010
Java
Parte II
Java
19/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Classi
Finora, abbiamo visto classi con un solo metodo: il main.
Di solito, le classi che realizziamo non prevedono il main ma:
variabili d’istanza;metodi.
Per costruire un programma completo, occorre combinare classi diverse,una delle quali deve prevedere il metodo main.
Esempio:
c l a s s NomeClasse
{variabile1
variabile2
. . .costruttore1
costruttore2
. . .metodo1
metodo2
. . .}
20/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Esempio: una Classe Employee
i m p o r t java . util .∗ ;
c l a s s Employee
{// v a r i a b i l i d ’ i s t a n z ap r i v a t e String name ;p r i v a t e d o u b l e salary ;p r i v a t e Date hireDay ;
// c o s t r u t t o r ep u b l i c Employee ( String n , d o u b l e s , i n t year , i n t month , i n t day ){
name = n ;salary = s ;GregorianCalendar calendar = new GregorianCalendar ( year , month − 1 , ←↩
day ) ;hireDay = calendar . getTime ( ) ;
}
p u b l i c String getName ( ){
r e t u r n name ;}
// a l t r i metodi. . .
}
21/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Esercizio 1
Estendere la classe Employee con altri 3 metodi:
1 getSalary(): ritorna il valore della salario dell’impiegato;
2 getHireDay(): ritorna il giorno di assunzione dell’impiegato;
3 raiseSalary(double byPercent): aumenta il salario in percentuale dibyPercent.
22/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Esempio: una Classe Employee (2)
i m p o r t java . util .∗ ;
c l a s s Employee
{
. . .
p u b l i c d o u b l e getSalary ( ){
r e t u r n salary ;}
p u b l i c Date getHireDay ( ){
r e t u r n hireDay ;}
p u b l i c v o i d raiseSalary ( d o u b l e byPercent ){
d o u b l e raise = salary ∗ byPercent / 1 0 0 ;salary += raise ;
}}
23/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Analizzare la classe Employee
La classe Employee ha un costruttore e quattro metodi:
public Employee(String n, double s, int year, int
month, int day);public String getName();public double getSalary();public Date getHireDay();public void raiseSalary(double byPercent).
Tutti i metodi sono stati definiti public: possono essere invocati daqualsiasi metodo di qualsiasi classe.
La classe contiene tre variabili d’istanza:
private String name;private double salary;private Date hireDay.
La parola chiave private assicura che solo i metodi della classeEmployee possono accedere a queste variabili: nessun metodo esternopuo leggere o scrivere in questi campi.
24/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Costruttore
Il nome del costruttore e identico al nome della classe.
Viene eseguito quando si costruiscono gli oggetti di quella classe.
Inizializza le variabili d’istanza.
Il costruttore puo essere chiamato solo con l’operatore new.
Una classe puo avere piu di un costruttore.
Un costruttore puo avere zero, uno o piu parametri.
Un costruttore non restituisce un valore.
25/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Parametri Impliciti / Espliciti (1)
Si consideri il frammento di codice:
p u b l i c v o i d raiseSalary ( d o u b l e byPercent ){
d o u b l e raise = salary ∗ byPercent / 1 0 0 ;salary += raise ;
}. . .
pippo . raiseSalary ( 5 ) ; // p ippo o g g e t t o Employee
Invocando pippo.raiseSalary(5) il metodo raiseSalary() modificala variabile d’istanza salary dell’oggetto riferito da pippo.
Il metodo raiseSalary() ha due parametri:
1 il primo (pippo), chiamato parametro implicito, e l’oggetto di tipoEmployee che compare prima del nome del metodo (non comparenella dichiarazione del metodo);
2 il secondo (5), chiamato parametro esplicito, e definito tra parentesi(compare nella dichiarazione del metodo: double byPercent).
26/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Parametri Impliciti / Espliciti (2)
In ogni metodo, la parola chiave this fa riferimento al parametroimplicito. Il metodo raiseSalary puo anche essere scritto:
p u b l i c v o i d raiseSalary ( d o u b l e byPercent ){
d o u b l e raise = t h i s . salary ∗ byPercent / 1 0 0 ;t h i s . salary += raise ;
}
Nell’esempio precedente, this fa riferimento all’oggetto riferito da pippo.
Leggibilita: distinzione tra varibili d’istanza e variabili locali:
p u b l i c Employee ( String name , d o u b l e salary , i n t year , i n t month , i n t day ){
t h i s . name = name ;t h i s . salary = salary ;GregorianCalendar calendar = new GregorianCalendar ( year , month−1,day ) ;t h i s . hireDay = calendar . getTime ( ) ;
}
27/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Esercizio 2
Scrivere una classe EmployeeTest, contenente il metodo main, che:
1 crea un array di Employee di dimensione k (letto da console) e,successivamente, lo riempie creando k impiegati leggendo da console, perogni oggetto, il nome completo, il salario, e la data di assunzione;
2 aumenta il salario di tutti gli impiegati del 5%, tramite un ciclo for-each;
3 stampa le informazioni relative a tutti gli oggetti Employee dell’array(nome, salario, data di assunzione), tramite un ciclo for-each.
Esempio di output:
Nome = [ Paolo Rossi ] , salario = [ 7 3 5 0 0 . 0 ] euro , data di assunzione = [ Mon Aug ←↩11 0 0 : 0 0 : 0 0 CEST 1997]
Nome = [ Maria Verdi ] , salario = [ 5 2 5 0 0 . 0 ] euro , data di assunzione = [ Fri Oct ←↩01 0 0 : 0 0 : 0 0 CEST 1999]
Nome = [ Giulia Bianchi ] , salario = [ 8 4 0 0 0 . 0 ] euro , data di assunzione = [ Sun ←↩Mar 12 0 0 : 0 0 : 0 0 CET 2000]
28/29 Programmazione II Lezione 13 3/12/2010
Java Oggetti e Classi
Riferimenti
[1] Linguaggi di programmazione: principi e paradigmi (Cap. 6).
Maurizio Gabbrielli, Simone Martini.
[2] Core Java 2. Vol. 1: Fondamenti (Cap. 4).
Horstmann Cay S., Cornell Gary.
29/29 Programmazione II Lezione 13 3/12/2010