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

code generalizzate, ADT di prima categoria

Lezione 17 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. code generalizzate, ADT di prima categoria
  2. code generalizzate
  3. elementi duplicati, elementi indice
  4. pila senza duplicati con elementi indice
  5. ADT di prima categoria
  6. interfaccia di coda FIFO di I categoria
  7. implementazione di coda FIFO di I categ.
  8. client di una coda FIFO di I categoria
  9. istanziazione di template
  10. procedure di costruzione di programmi
  11. esercizi

code generalizzate

dalle definizioni degli ADT pila e coda emerge che essi differiscono solo per la disciplina di accesso, in particolare per la regola di rimozione di elementi dalla sequenza

ciò conduce al concetto di coda generalizzata:

coda casuale (ingl. random queue):

le operazioni delle code LIFO e FIFO sono eseguite in tempo costante, sia nelle implementazioni con array che in quelle con liste

altri tipi di code generalizzate: coda doppia, code con priorità, tabelle di simboli, ...

elementi duplicati, elementi indice

per un qualsiasi tipo di coda generalizzata è possibile distinguere diversi sottotipi in base alla gestione di elementi duplicati

negli ADT visti sinora (code LIFO, FIFO, random), non era specificata alcuna gestione dei duplicati

in molti casi è preferibile includere nella specifica dell'ADT una disciplina di gestione dei duplicati:

per implementare tali discipline occorre in ogni caso la funzionalità di ricerca di una chiave fra quelle degli elementi in coda, per il riconoscimento dei duplicati

se il tipo della chiave è int, una realizzazione rapida e semplice di questa funzionalità si ottiene con un cast degli elementi al tipo della chiave, purché il tipo degli elementi ne sia una derivazione

si realizza in tal caso una disciplina di gestione dei duplicati mediante elementi indice

pila senza duplicati con elementi indice

assumendo un cast di Elem a int che restituisca un intero < maxN, l'implementazione della pila con array può essere così modificata, per prevenire l'inserimento di duplicati secondo la disciplina ignora il nuovo

strutture dati private ndstack-private.h:

implementazione delle operazioni ndstack.c++ :

ADT di prima categoria

come si è accennato a proposito della ridefinizione di operatori, quando si definisce un nuovo tipo di dato è conveniente poterlo trattare allo stesso modo dei tipi di dati predefiniti

seppur vaga, la definizione rende intuitivamente l'idea, lasciando al programmatore il compito di individuare gli operatori predefiniti dei quali è appropriata la ridefinizione per un nuovo ADT

se l'ADT implementato da una classe è accessibile solo per il tramite dell'interfaccia,
e se non ha puntatori fra i suoi dati membro, allora è un ADT di prima categoria

se la classe che implementa un ADT ha puntatori fra i suoi dati membro, perché l'ADT sia di prima categoria occorre ridefinire opportunamente:

interfaccia di coda FIFO di I categoria

l'interfaccia dell'ADT coda FIFO di I categoria è un'estensione di quella vista nella lezione precedente con costruttore di copia, operatore di assegnamento e distruttore

implementazione di coda FIFO di I categ.

possiamo estendere la già vista implementazione della coda FIFO mediante lista, a un ADT di prima categoria che implementa la precedente interfaccia, se aggiungiamo alle definizioni già date (non replicate qui) le seguenti, rispettivamente nella parte privata e, in quella pubblica, per costruttore di copia, operatore di assegnamento e distruttore:

nel file queue-private.h:

nel file queue.c++:

client di una coda FIFO di I categoria

il programma simula l'accodamento di N richieste di servizio in un sistema casuale di M code FIFO

per il funzionamento corretto del programma è necessario che l'ADT sia di prima categoria

SimQueues.c++:

istanziazione di template

la compilazione separata di implementazione e client della coda FIFO testè viste non segnala alcun problema, tuttavia il linking riserva una sgradevole sorpresa:

ciò accade perché la compilazione separata dell'implementazione del template non genera automaticamente le istanze delle definizioni dei template di funzione richieste dal client

soluzione: aggiungere la compilazione (separata) di dichiarazioni di istanziazione di template, SimQueueTFI.c++:

o, più semplicemente, per tutte le funzioni dell'istanza del template di classe, SimQueueTCI.c++:

procedure di costruzione di programmi

quando si sviluppano più client e/o più implementazioni di uno stesso ADT, è utile predisporre la costruzione di ciascun programma dalla corrispondente combinazione di client e implementazioni

una possibile organizzazione, per lo sviluppo basato su un certo ADT, ne colloca i moduli come segue:

interfacce e implementazioni possono essere rese visibili, nelle directory dove servono a tempo di compilazione, mediante link simbolici, magari creati dinamicamente dalle procedure di costruzione

ecco ad es. una shell per la costruzione del programma di simulazione del sistema di code, assumendo l'esistenza di link a include/queue.h in clients/ e in queue_l/, qui con link queue-private.h a include/concrete/lista.h, e della directory build/simqueues_l/ :

esercizi

  1. esercizio 4.48 del testo (Sedgewick, 2003), a p. 174: realizzare una implementazione con array dell'ADT coda casuale tale che le operazioni di inserimento e rimozione siano eseguite in tempo costante
  2. modificare l'implementazione mediante array della pila senza duplicati, per imporre la disciplina dimentica il vecchio (accodando il nuovo in ordine di arrivo)
  3. modificare l'implementazione mediante array della coda FIFO, vista nella lezione precedente, per implementare una coda FIFO senza duplicati, secondo la disciplina ignora il nuovo
  4. esercizio 4.64 del testo (Sedgewick, 2003), a p. 191: trasformare l'ADT delle relazioni di equivalenza proposto nella lezione precedente in un ADT di prima categoria
  5. estendere l'implementazione mediante array della coda FIFO vista nella lezione precedente, per trasformarla in un ADT di prima categoria