31.05.2013 Views

Esercizi e progetti di programmazione - Apogeo

Esercizi e progetti di programmazione - Apogeo

Esercizi e progetti di programmazione - Apogeo

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!