Elementi di un linguaggio di programmazione (Sethi

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