Esercizi e progetti di programmazione - Apogeo
Esercizi e progetti di programmazione - Apogeo
Esercizi e progetti di programmazione - Apogeo
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
E–62 ESERCIZI E PROGETTI DI PROGRAMMAZIONE<br />
Ecco un modo per costruire una lista con tre elementi:<br />
LispList list = new NonEmptyList(“A”,<br />
new NonEmptyList(“B”,<br />
new NonEmptyList(“C”,<br />
new EmptyList())));<br />
L’operazione è un po’ noiosa, quin<strong>di</strong> è bene progettare un metodo <strong>di</strong> utilità, cons, che invochi il<br />
costruttore in modo opportuno, oltre a una variabile statica, NIL, che memorizza un esemplare <strong>di</strong><br />
lista vuota. In questo modo la costruzione della lista che abbiamo usato come esempio <strong>di</strong>venta:<br />
LispList list = LispList.NIL.cons(“C”).cons(“B”).cons(“A”);<br />
Osservate che occorre costruire la lista partendo da una coda vuota.<br />
Per poter apprezzare l’eleganza <strong>di</strong> questo approccio, considerate la realizzazione <strong>di</strong> un metodo,<br />
toString, che generi una stringa contenente tutti gli elementi presenti in una lista. Il metodo deve<br />
essere realizzato in entrambe le sottoclassi:<br />
public class EmptyList ...<br />
{<br />
...<br />
public String toString() { return “”; }<br />
}<br />
public class NonEmptyList ...<br />
{<br />
...<br />
public String toString() { return head().toString() + “ “ + tail().toString(); }<br />
}<br />
Osservate che non occorre alcun enunciato if. Una lista può essere vuota o non vuota e, grazie<br />
al polimorfi smo, viene invocato il metodo toString corretto.<br />
In questo esercizio, completate l’interfaccia LispList e le classi EmptyList e NonEmptyList.<br />
Scrivete, poi, un programma <strong>di</strong> collaudo che costruisca una lista e la visualizzi.<br />
* <strong>Esercizi</strong>o P14.11. Aggiungete all’interfaccia LispList dell’esercizio precedente il metodo length,<br />
che restituisca la lunghezza della lista, realizzandolo poi nelle classi EmptyList e NonEmptyList.<br />
** <strong>Esercizi</strong>o P14.12. Aggiungete all’interfaccia LispList dell’esercizio P14.10 il metodo<br />
LispList merge(LispList other)<br />
che fonda due liste, realizzandolo poi nelle classi EmptyList e NonEmptyList. Per effettuare la<br />
fusione <strong>di</strong> due liste, prendete un elemento alternativamente da una delle due liste, aggiungendo<br />
poi gli elementi rimasti nella lista più lunga. Ad esempio, fondendo le liste che contengono 1 2<br />
3 4 e 5 6, si ottiene la lista che contiene 1 5 2 6 3 4.<br />
* <strong>Esercizi</strong>o P14.13. Aggiungete all’interfaccia LispList dell’esercizio P14.10 il metodo<br />
boolean contains(Object obj)<br />
che restituisca true se la lista contiene un elemento uguale a obj.<br />
*** <strong>Esercizi</strong>o P14.14. La libreria standard <strong>di</strong> Java contiene una classe Stack che realizza una pila, ma<br />
in questo esercizio vi viene chiesto <strong>di</strong> fornire una vostra realizzazione <strong>di</strong> tale tipo <strong>di</strong> dati astratto.<br />
Non realizzate una classe parametrica, usate un array <strong>di</strong> tipo Object[] per memorizzare gli elementi<br />
presenti nella pila e, quando l’array si riempie, pre<strong>di</strong>sponetene uno <strong>di</strong> <strong>di</strong>mensioni doppie,<br />
copiando i valori dal vecchio al nuovo array.<br />
Cay Horstmann: Concetti <strong>di</strong> informatica e fondamenti <strong>di</strong> Java 5 a ed. - Copyright 2010 <strong>Apogeo</strong> srl