29
Programmazione II Lezione 13 Daniele Sgandurra [email protected] 3/12/2010 1/29 Programmazione II Lezione 13 3/12/2010

Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

Embed Size (px)

Citation preview

Page 1: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

Programmazione IILezione 13

Daniele Sgandurra

[email protected]

3/12/2010

1/29 Programmazione II Lezione 13 3/12/2010

Page 2: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

Sommario

1 Strutturare il ControlloControllo di SequenzaProgrammazione Strutturata

2 JavaOggetti e Classi

2/29 Programmazione II Lezione 13 3/12/2010

Page 3: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

Strutturare il Controllo

Parte I

Strutturare il Controllo

3/29 Programmazione II Lezione 13 3/12/2010

Page 4: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 5: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 6: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 7: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 8: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 9: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 10: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 11: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 12: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 13: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 14: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 15: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 16: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 17: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 18: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 19: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

Java

Parte II

Java

19/29 Programmazione II Lezione 13 3/12/2010

Page 20: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 21: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 22: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 23: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 24: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 25: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 26: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 27: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 28: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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

Page 29: Programmazione II - Lezione 13daniele/teaching/pr2-10/pr2-13.pdf · 2 Java Oggetti e Classi 2/29 Programmazione II Lezione 13 3/12/2010. Strutturare il Controllo Parte I Strutturare

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