Logo dell'Università di Catania: Siciliae Studium Generale 1434 Logo del Centro IPPARI, Programmazione
matite e gomma
Loghi istituzionali: Siciliae Studium Generale 1434, Centro ricerche IPPARI, Università di Catania, Facoltà di Scienze Matematiche, Fisiche, Naturali, Insegnamento di Programmazione

Ereditarietà e polimorfismo, ADT code

Lezione 16 di Programmazione 2

Docente: Giuseppe Scollo

Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2006-7

Logo di Conformità WCAG-1 di Livello Tripla A, W3C-WAI Web Content Accessibility Guidelines 1.0 Validazione XHTML 1.0 Validazione CSS 2

Indice

  1. Ereditarietà e polimorfismo, ADT code
  2. ereditarietà e derivazione di classi
  3. funzioni virtuali e classi astratte
  4. classe astratta per l'ADT union-find
  5. implementazione dell'ADT union-find
  6. l'ADT coda FIFO: interfaccia
  7. implementazione della coda con un array
  8. implementazione della coda con una lista
  9. esercizi

ereditarietà e derivazione di classi

in C++, come in tutti i linguaggi di programmazione ad oggetti, è possibile organizzare le definizioni di classi in gerarchie di ereditarietà, dove ogni classe derivata eredita membri pubblici, tranne i costruttori, e protected dalle classi che la precedono nella gerarchia

l'ereditarietà si dice:

la derivazione immediata di una classe D, detta derivata, da una classe B, detta di base, si codifica con la sintassi:

in cui la specifica public mantiene inalterata la visibilità dei membri ereditati

funzioni virtuali e classi astratte

in una classe derivata si può ridefinire il corpo di funzioni membro ereditate

... se una funzione è dichiarata virtual, allora le sue invocazioni su oggetti seguono la definizione data nel tipo dell'oggetto piuttosto che in quello determinato dal riferimento

... una funzione virtuale pura non ha definizione nella classe di base, detta astratta, e deve essere definita nelle classi concrete derivate da essa

classe astratta per l'ADT union-find

uf_interface.h : interfaccia astratta dell'ADT union-find

uf.h : derivazione con aggiunta di un puntatore, accessibile alle classi derivate (la classe rimane astratta)

UFI.h : derivazione concreta dell'interfaccia per il tipo parametro int

implementazione dell'ADT union-find

UFI_private.h : strutture dati e funzioni private per l'algoritmo di quick-union pesata

UFI.c++ : implementazione per l'algoritmo di quick-union pesata

l'ADT coda FIFO: interfaccia

un'altra importante classe contenitore è la coda, ingl. queue : sequenza finita, di lunghezza variabile, di dati omogenei, ad accesso sequenziale con disciplina FIFO

la coda è una struttura dati fondamentale:

  • nella comunicazione: canali di trasmissione
  • nella concorrenza:
    • gestione FIFO di richieste di servizio
    • reti di code, ingl. queueing networks
rappresentazione grafica di una rete di code

queue.h: come nel caso dell'interfaccia della pila, per esplorare implementazioni diverse dell'ADT con diverse strutture dati, usiamo una direttiva #include per la parte privata:

implementazione della coda con un array

strutture dati private queue-private.h:

implementazione delle operazioni queue.c++ : per il costruttore si richiede il parametro

implementazione della coda con una lista

strutture dati private queue-private.h:

implementazione delle operazioni queue.c++: le due varianti del costruttore sono simili

esercizi

  1. codificare l'implementazione dell'ADT union-find per altri algoritmi fra quelli visti nella prima lezione, ad es. quick-find e quick-union
  2. usando l'interfaccia UFI.h dell'ADT union-find, codificare un programma che accetti da linea di comando un intero N e generi quindi una sequenza casuale di coppie di interi non negativi minori di N finché il grafo (non orientato) così costruito abbia una sola componente connessa, producendo infine in output il numero M di coppie generate; valutare quindi empiricamente le prestazioni, per valori crescenti di N, delle diverse versioni di tale programma ottenute usando diverse implementazioni dell'ADT in questione, ovvero quella vista qui per l'algoritmo quick union pesata e quelle prodotte nell'esercizio precedente
  3. esercizio 4.22 del testo (Sedgewick, 2003), a p.158, adattato al caso della coda: modificare l'interfaccia della coda sostituendo empty con count, che restituisce il numero di elementi nella coda, e implementarla usando sia array che liste concatenate
  4. esercizi 4.38 e 4.39 (modificato) del testo (Sedgewick, 2003), a p.174: modificare le due implementazioni della coda viste sopra in modo che si invochi una funzione membro error() quando il client invoca una get su una coda vuota o una put su una coda piena