Linguaggio C++ - Dipartimento di Informatica

annuncio pubblicitario
Linguaggi di programmazione + laboratorio (a.a. 2007-2008) - laurea INFCD – Bari
Emanuele Covino
Programma quasi definitivo
Requisiti preliminari: Linguaggio C. Corso di Programmazione. Corso di Fondamenti di Informatica.
Teoria
Introduzione a un generico linguaggio (Gabbrielli, Martini – capitolo 1 e 13; Sethi - capitolo 2)
Panoramica storica. Macchine astratte e interprete. Implementazione di un linguaggio. Gerarchie di
macchine astratte. Un linguaggio per le espressioni (mosaic): sintassi e semantica. Introduzione a ML.
Sintassi e semantica (Ausiello – capitolo 2; Gabbrielli, Martini - capitolo 2; Sethi – capitolo 10)
Grammatiche libere. Derivazioni e linguaggi. Alberi di derivazione. La gerachia di Chomsky. BNF e
diagrammi sintattici. Il problema del riconoscimento. Linguaggi regolari e automi a stati finiti. Automi
non deterministici. Vincoli sintattici contestuali. Compilatori. Semantica. Pragmatica.
Nomi e ambiente (Gabbrielli, Martini - capitolo 4; Sethi - capitoli 3 e 4)
Nomi ed oggetti denotabili. Ambiente e blocchi: tipi ed operazioni sull’ambiente. Regole di scope:
scope statico, dinamico, problemi di scope.
Gestione della memoria (Gabbrielli, Martini – capitolo 5; Sethi - capitolo 4)
Tecniche di gestione della memoria. Gestione statica. Gestione dinamica tramite pila: blocchi in-line,
procedure, gestione della pila. Gestione dinamica tramite heap: blocchi di dimensione fissa e variabile.
Implementazione delle regole di scope: catena statica, display, lista di associazioni e CRT.
Strutturare il controllo (Gabbrielli, Martini – capitolo 6; Sethi - capitolo 2 e 3)
Espressioni: sintassi, semantica, valutazione. Comando: variabili, assegnamenti. Comandi per il
controllo di sequenza: comandi espliciti, condizionali, iterativi. Ricorsione: tail recursion.
Astrarre sul controllo (Gabbrielli, Martini – capitolo 7; Sethi – capitolo 5)
Sottoprogrammi: astrazione funzionale, passaggio dei parametri. Eccezioni.
Strutturare i dati (Gabbrielli, Martini – capitolo 8)
Tipi di dato. Sistemi di tipi. Tipi scalari e composti. Equivalenza fra tipi: per nome, strutturale.
Compatibilità e conversione. Polimorfismo: overdoading, polimorfismo universale parametrico e di
sottotipo. Controllo e inferenza di tipo. Sicurezza. Dangling reference. Garbage collection.
Programmazione object oriented (Gabbrielli, Martini – capitoli 9 e 10; Sethi - capitolo 6)
Astrarre sui dati: tipi astratti, nascondere l’informazione. Limiti dei tipi di dato astratti. Concetti
fondamentali: oggetti, classi, incapsulamento, sottotipi, ereditarietà (singola e multipla), selezione
dinamica dei metodi.
Testi consigliati:
 Gabbrielli, Martini - Linguaggi di programmazione - McGraw-Hill.
 R. Sethi. Linguaggi di programmazione, Zanichelli
 Ausiello, D’amore, Gambosi. Linguaggi, modelli, complessità. Utet
Laboratorio
Linguaggio C++ (Deitel, Deitel – capitoli 9, 10, 11, 12, 13)
Linguaggio C. Classi e astrazioni dati. Classi friend. Allocazione dinamica della memoria. Overloading
di operatori. Ereditarietà. Polimorfismo.
Testi consigliati
 Deitel, Deitel - C++ fondamenti di programmazione – Apogeo
 Oualline S.. C++, corso di programmazione. Jackson libri
 Qualsiasi manuale di C++ che trovate in biblioteca
Programmi da svolgere in laboratorio (possibili tracce di esame)



















Algoritmi di ordinamento e ricerca.
Gestione di stringhe: contare i caratteri, ordinarli, scrivere e leggere stringhe.
Data una espressione aritmetica in forma infissa, definire la sua notazione postfissa e prefissa.
Data una espressione aritmetica in forma postfissa calcolarla usando uno stack.
Definire la struttura coda usando un vettore unidimensionale.
Definire la struttura coda usando una lista linkata e una doppiamente linkata.
Definire la struttura stack usando un vettore unidimensionale.
Definire la struttura stack usando una lista linkata.
Definire la struttura albero binario (puntatori); definire un albero binario di ricerca.
Alberi , liste e pile (come sopra) usando le classi.
Costruire un programma che gestisca le date e il tempo (guardare l’esempio sul Deitel& Deitel).
Implementare una lista bidirezionale con i puntatori; ogni campo della lista contiene un intero.
Ordinare la lista con uno degli ordinamenti che avete studiato. Implementare (almeno) gli
operatori dell'algebra utili alla soluzione.
Il tipo di dato dequeue (double ended queue) è una sequenza modificabile ad entrambi gli
estremi, in cui è possibile inserire un elemento in testa o in fondo, e/o cancellare un elemento
dalla testa o dal fondo. Fornire una realizzazione in C++ di tale tipo di dato, mediante
puntatori, implementando gli operatori di inserimento e cancellazione dalla testa e dalla coda.
La profondità di un albero è il massimo livello delle sue foglie. Si fornisca una realizzazione in
C++ di tale struttura e la funzione che calcola la profondità dell’albero.
Si fornisca una realizzazione in C++ di un albero i cui nodi contengono valori interi. Dopo
aver scritto gli operatori necessari alla soluzione, si implementi la funzione che cancella tutte le
foglie per le quali il percorso radice-foglia ha somma complessiva dei valori uguale a k.
Dati due insiemi realizzati con liste non ordinate, realizzare in C++ la funzione
INTERSEZIONE, implementando (almeno) gli operatori dell’algebra utili alla soluzione.
Scrivere in C++ l’implementazione di due liste monodirezionali ordinate, realizzate con i
puntatori, (scrivere gli operatori utili alla soluzione del problema). Scrivere la funzione che le
fonde, restituendo una unica lista ordinata.
Data una pila realizzata con puntatori, scrivere la funzione C++ che restituisce la pila
rovesciata. Scrivete gli operatori utili alla soluzione del problema.
Dato un albero i cui nodi contengono valori interi, scrivere gli operatori tipici di tale struttura
(in particolare, l’inserimento e la cancellazione di una foglia), e elencare i valori contenuti nei
nodi effettuando una visita in ampiezza (o in profondità).
Scarica