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à).