1 / 26

Compitino del 2004

Compitino del 2004. Alberi Generici. Idea. Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato (sono etichettati ) un valore di tipo qualsiasi ma tra loro omogenei I nodi non sono binari ma ogni nodo puo’ avere n figli dove n>0

fergal
Download Presentation

Compitino del 2004

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Compitino del 2004 Alberi Generici

  2. Idea • Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato (sono etichettati) un valore di tipo qualsiasi ma tra loro omogenei • I nodi non sono binari ma ogni nodo puo’ avere n figli dove n>0 • Le foglie non hanno figli

  3. “a” “a” “a” “c” “b” Esempio h s g a t

  4. Progettazione Gerarchica • Supertipo definisce il tipo Albero • Due sottotipi che definiscono i due casi Foglia e Nodo • Vantaggio: le due implementazioni sono specializzate, sono piu’ facili da implementare • Il supertipo Albero e’ definito da una classe astratta (e non da una interfaccia), alcune cose si possono implementare in modo comune

  5. Prima Parte • Si forniscano le specifiche delle due sottoclassi concrete Foglia e Nodo che realizzano foglie e nodi con figli, rispettivamente. Si diano solo (ove necessario) i costruttori e quei metodi per cui e’ diversa la specifica. • Facile: basta specializzare i metodi astratti al caso del sottotipo

  6. Foglia

  7. Nota • Il costruttore di Foglia deve necessariamente essere pubblico (altrimenti da dove si comincia a costruire un albero?). Il costruttore di Nodo non serve invece a chi utilizza il tipo di dato astratto, perche’ c’e’ il metodo costruisci; serve solo all’interno delle classi Foglia e Nodo per implementare il metodo costruisci. Assumendo che Foglia e Nodo facciano parte dello stesso package lo mettiamo privato e mettiamo delle pre-condizioni per garantire che il Nodo sia “ben-formato” (vedi invariante dopo).

  8. Domanda Successiva • 1. Si dimostri che la specifica del metodo seleziona di Nodo soddisfa la regola dei metodi • Le specifiche non sono uguali: ma la soddisfa perche’ , se this e’ di tipo Nodo, non e’ una foglia. Non deve sollevare l’eccezione NotANodeException in accordo alla specifica del metodo del supertipo.

  9. Domanda Successiva • Si definisca la rappresentazione della classe Nodo, con funzione di astrazione e invariante di rappresentazione • 1. Si fornisca l’implementazione del metodo costruisci e del costruttore di Nodo

  10. Rappresentazione Ricorsiva • Simile a quella della lista concatenata e dell’albero binario • Non serve la variabile booleana vuota (siamo nel acso del nodo) • Per memorizzare gli Alberi figli usiamo un array di Alberi (prendendo spunto dal metodo costruisci)

  11. Rappresentazione Privata

  12. Invariante

  13. F di Astrazione

  14. Costruttore • Notate che la precondizione garantisce le proprieta’ di figli • Richieste dall’invariante • Se fosse pubblico dovrei verificarle (meglio privato)

  15. Costruisci

  16. Nota che

  17. Ultima domanda • Si fornisca l’implementazione del metodo concreto etichette (iteratore della classe astratta) • assumendo che l’implementazione di Albero contenga anche il seguente metodo concreto private int count() { // EFFECTS:restituisce il numero di foglie e nodi di this}

  18. Iteratore • Visita in ordine posticipato dell’esempio: • a a a c a g b t s h

  19. Problema • Il generatore deve essere realizzato nella classe astratta (indipendentemente dalle sottoclasse) • Deve iterare usando i metodi astratti per leggere i valori • Non e’ un problema se uno usa i metodi seleziona, etichetta, figli (sono come first e rest della lista) • Bisogna usare un generatore ricorsivo che generalizza quello della lista • Si mantiene un sottogeneratore che inizilamente e’ quello del figlio di destra, poi si sposta fino all’ultimo figlio • Quando sono finiti i figli produce la radice

  20. Inner Class Per il Generatore

  21. Costruttore ed hasNext

  22. Metodo next

More Related