Linguaggi di programmazione + laboratorio (a.a. 2005-2006): programma quasi definitivo INFCD - sede di Taranto Emanuele Covino Teoria Elementi di un linguaggio di programmazione (Sethi - capitolo 2) Un linguaggio per le espressioni (mosaic): sintassi e semantica. Notazioni per le espressioni. Valutazione di espressioni. Dichiarazioni e applicazione di funzioni. Funzioni ricorsive. Ambito lessicale. Tipi. Introduzione a ML. Sintassi e semantica (Auisiello – capitolo 2; Gabbrielli, Martini - capitolo 2) 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. Programmare con gli assegnamenti (Sethi - capitolo 3; Gabbrielli, Martini - capitolo 4) L’effetto di un assegnamento: macchine ad accesso casuale, l-valori, r-valori, il thread di controllo attraverso un programma. Programmazione strutturata: istruzioni atomiche, flusso di controllo strutturato. Tipi di dati e flusso di controllo in C. Nomi ed equivalenze di tipi. Nomi ed ambiente: nomi ed oggetti denotabili, ambiente e blocchi, regole di scope (statico, dinamico), problemi di scope. Attivazione di procedure (Sethi - capitolo 4; Gabbrielli, Martini – capitolo 5) I nomi delle procedure. Dichiarazioni di procedura in C. Metodi per il passaggio dei parametri: chiamata per valore, indirizzo, nome. Tempo di vita delle attivazioni. Alberi di attivazione. Ambito lessicale in C: ambito di una dichiarazione locale, memorizzazione delle variabili locali, organizzazione della memoria, chiamata di procedure, procedure con parametri, eliminazione della ricorsione tail. Espansione delle macro. Link di controllo e di accesso. Configurazione di memoria per i tipi di dati assegnabili. Puntatori ed allocazione dinamica: strutture dati concatenate, operazioni sui puntatori, tipi circolari. Programmazione object oriented (Gabbrielli, Martini - capitolo 10; Sethi - capitolo 6) Tipi di dato astratti. Limiti dei tipi di dato astratti. Concetti fondamentali: oggetti, classi, incapsulamento, sottotipi, ereditarietà (singola e multipla), dispatch. Testi consigliati: R. Sethi. Linguaggi di programmazione, Zanichelli Gabbrielli, Martini - Linguaggi di programmazione - McGraw-Hill. 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 Programmi (possibili tracce in laboratorio) 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. Ordinamenti di stringhe e di numeri: merge sort, quick sort, scambio, alberi. Alberi , liste e pile (come sopra) usando le classi. Costruire un programma che gestisca le date e il tempo, guardare il programma “date” e il programma time dei lucidi. Costruire una classe che simuli la gestione delle liste in programmazione funzionale e che abbia come funzioni pubbliche il car il cdr il cons e la possibilità di comporre le suddette funzioni. 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 (a scelta fra quelle che conoscete, scrivendo gli operatori utili alla soluzione) e la funzione che calcola la profondità dell’albero. Si fornisca una realizzazione in C++ di un albero (a scelta fra quelle che conoscete) 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. Realizzare il quicksort su un vettore di interi in C o in C++, con ordine decrescente. 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à).