Linguaggi di Programmazione + laboratorio - Laurea ICD
Tracce delle prove di laboratorio - a.a. dal 2008 al 2010
Definire in C++ una classe PILA di interi, implementata con puntatori, contenente:
 gli operatori standard di pop, push, pilavuota; (2 punti)
 un costruttore che inizializzi di default il numero a 0; (1 punto)
 un metodo che rovesci la pila; (2 punti)
Definire una classe derivata PILAPLUS, contenente un metodo che conti gli elementi della pila (1
punto).
Implementare in C++, con puntatori, la struttura dati ALBERO BINARIO DI INTERI:
 definire i metodi di inserimento, di eliminazione di una foglia, valutazione dell’albero vuoto,
visualizzazione degli elementi per livelli (2 punti);
 definire una classe derivata ALBERO BINARI DI INTERI PARI, con un costruttore
appropriato (1 punto);
Implementare in C++, con puntatori, la struttura dati LISTA DI INTERI:
 definire i metodi di inserimento in testa e in coda, di eliminazione di un elemento, valutazione
della lista vuota, visualizzazione degli elementi (2 punti);
 definire una classe derivata LISTA DI INTERI PARI, con un costruttore appropriato (1
punto);
Implementare in C++, con puntatori, la struttura dati ALBERO BINARIO (no binary search tree), in
cui ogni nodo contiene una stringa di caratteri;
 definire i metodi di inserimento, di eliminazione di una foglia, visualizzazione degli elementi (3
punti).
Implementare in C++, con puntatori, la struttura dati LISTA DI STRINGHE con i suoi metodi
standard di inlista e outlista (1 punto);
 definire il metodo che inserisce nella lista le foglie dell’albero di cui sopra (2 punti).
(Importante: ricordate che si può accedere alle struttura definite solo tramite gli operatori
standard.)
Implementare in C++ la struttura dati INSIEME DI INTERI:
 definire i metodi di inserimento ed eliminazione di un elemento, valutazione dell’insieme vuoto,
visualizzazione degli elementi (2 punti);
 definire una classe derivata INSIEME DI INTERI PARI, con un costruttore appropriato (1
punto);
 realizzare i metodi di intersezione e unione di due insiemi (2 punti).
(Importante: ricordate che si può accedere alla struttura definita solo tramite gli operatori
standard.)
Implementare in C++, con puntatori, la struttura dati LISTA DI INTERI:
 definire i metodi di inserimento in testa e in coda, di eliminazione dalla testa o dalla coda,
valutazione della lista vuota, visualizzazione degli elementi (1 punto);
 definire la classe derivata PILA DI INTERI, che implementi gli operatori di pop, push, pila
vuota, sfruttando quelli già definiti per la lista (2 punti);
Definire la classe RATIONAL per effettuare operazioni matematiche sui numeri razionali,
rappresentati come quoziente di due numeri interi.
1. Scrivere un programma di prova per verificare l’adeguatezza della vostra classe, con almeno
inserimento e visualizzazione. (2 punti)
2. Realizzare i metodi di addizione, sottrazione, prodotto di due numeri razionali. (2 punti)
3. Realizzare il metodo che semplifica il numero (2/4 diventa 1/2; 6/3 diventa 2). (2 punti)
Suggerimento: rappresentate i dati private con due numeri interi: numeratore e denominatore; il
costruttore deve inizializzare ogni oggetto della classe, se dichiarato, e deve contenere valori di default
nel caso l’oggetto non sia inizializzato.
Definire la classe RECTANGLE, con attributi lunghezza e larghezza, ognuno dei quali ha il valore 1 di
default. Ha due funzioni membro che calcolano e mostrano il perimetro e l’area del rettangolo, e
funzioni set e get per ogni attributo. (2 punti)
Scrivere un programma che rileva, lancia e gestisce un’eccezione di divisione per zero (1 punto).
Fornire un esempio di accesso a dati e funzioni membro di un oggetto tramite i tre tipi di handle
(nome, riferimento, puntatore a un oggetto). (1 punto)
Fornire un esempio di classe definita per composizione e del suo costruttore. (2 punti)
Fornire un esempio di classe con costruttore con elementi di default e di classe con costruttore con
parametri, anche parziali. (1 punto)
Fornire un esempio che spieghi come l’ordine di chiamata di costruttori e distruttori di una classe sia
influenzato dalla categoria di memorizzazione dell’oggetto. (2 punti)
Mostrare come sia possibile accedere a un dato membro private tramite un alias. (1 punto)
Mostrare cosa succede se si modifica un dato membro costante con l’operatore di assegnamento, e
come invece deve essere fatta la modifica. (1 punto)
Fornire un esempio di copia di default membro a membro. (1 punto)
Fornire un esempio di utilizzo di funzioni membro costanti su dati membro costanti, di funzioni
membro non costanti su dati membro costanti, di funzioni membro costanti su dati membro non
costanti. (1 punti)
Mostrare cosa succede se si modifica un dato membro costante con l’operatore di assegnamento, e
come invece deve essere fatta la modifica. (1 punto)
Fornire un esempio di classe base e classe derivata, e dell’ordine di chiamata di costruttore e distruttore
della classe derivata. (2 punti)
Fornire un esempio di creazione di un oggetto usando argomenti di default. (2 punti)
Fornire un esempio di chiamata in cascata di funzioni membro. (2 punti)
Fornire un esempio di modifica di un dato private con una funzione friend. (1 punto)
Mostrare cosa succede se si modifica un dato membro costante con l’operatore di assegnamento, e
come invece deve essere fatta la modifica. (1 punto)
Definire una gerarchia di classi in cui la classe A è classe base, B è derivata da A, e C è derivata da B;
evidenziare la forma di inizializzazione e l’ordine di chiamata di costruttori e distruttori (2 punti).
Scrivere un programma che rileva, lancia e gestisce un’eccezione di divisione per zero (2 punti).
Fornire un esempio di modifica di un dato private con una funzione friend. (2 punti)
Fornire un esempio che mostri le caratteristiche di una funzione virtuale. (1 punto)
Scrivere un programma che illustri se (e come) sia possibile accedere a un dato protetto dall’esterno
della sua gerarchia di classi. (2 punti).
Scrivere un programma che illustri la relazione fra tipo di ereditarietà e accesso ai membri di una classe.
(2 punti)
Linguaggi di Programmazione + laboratorio - Laurea ICD
Tracce delle prove scritte - a.a. dal 2008 al 2010
Scritto 9 gennaio 2009
1. Definire in ML una lista di interi e scrivere la funzione che, a partire da una lista, costruisce la lista
degli interi pari. (3 punti)
2. Scrivere la grammatica che genera il linguaggio {anbn, n >0}. (3 punti)
3. Scope statico, scope dinamico e problemi di scope; fornire definizioni ed esempi (4 punti)
4. Gestione della memoria tramite heap: blocchi a dimensione fissa e variabile. (4 punti)
5. Polimorfismo (overloading, universale parametrico, universale di sottotipo). (3 punti)
6. Ereditarietà: ereditarietà e visibilità, ereditarietà singola e multipla, C++ e Java (3 punti)
Scritto 29 gennaio 2009
1. Definire in ML il tipo di dato lista di interi e scrivere la funzione che fonde due liste ordinate,
producendo una lista ordinata. (3 punti)
2. Scrivere la grammatica che genera il linguaggio {anbmcp , n=m oppure m=p}. (3 punti)
3. Definire la gerarchia di Chomsky e fornire un esempio per ogni tipo di linguaggio (2 punti).
4. Dire cosa viene stampato dal seguente frammento di codice scritto in un linguaggio che usa scope
statico e passaggio per riferimento (4 punti):
{ int x=0;
int A (reference int y) { int x=2; y=y+1; return B(y)+x ; }
int B (reference int y) { int C (reference int y) { int x=3; return A(y)+x+y ;}
if (y==1) return C(x)+y ; else return x+y ;}
write (A(x)); }
5. fornire in un qualsiasi linguaggio di programmazione una funzione f tale che la valutazione
dell’espressione (a+f(b))*(c+f(b)) fatta da sinistra a destra abbia un risultato diverso da quello
ottenuto con la valutazione da destra a sinistra. (3 punti)
6. passaggio per valore-risultato e passaggio per riferimento: definizioni e differenze. (3 punti)
7. Equivalenza fra tipi: per nome e strutturale; compatibilità e conversione (2 punti).
Scritto 18 febbraio 2009
1. Definire in la funzione che restituisce la profondità dell’albero binario di interi. (3 punti)
2. Scrivere la grammatica per il linguaggio {w{0,1}* , w rappresenta un numero pari}. (3 punti)
3. Dare la definizione di grammatica ambigua e fornire un esempio. (2 punti).
4. Comando IF, comando CASE, implementazione e differenze. (3 punti)
5. Fornire in un qualsiasi linguaggio di programmazione una funzione ricorsiva tale che il numero
massimo dei RdA per essa presenti a run-time sulla pila sia determinabile staticamente. (3 punti)
6. Politiche di deep binding e shallow binding. (3 punti)
7. Si consideri le definizioni seguenti delle classi e del frammento di programma. Si dia il valore di
u, v, w, z al termine dell’esecuzione. (3 punti)
abstract class A {
int u, v, w, z;
int val = 1;
A a;
int foo (int x);}
B b;
abstract class B extending A {
C c;
int val = 2;}
D d = new D(3);
abstract class C extending B {
a = d;
int n = 0;
b = d;
int foo (int x) {return x + val + n;}}
c = d;
abstract class D extending C {
u = a.foo(1);
int n;
v = b.foo(1);
D (int v) {n = v;}
w = c.foo(1);
int foo (int x) {return x + val + n;}}
z = d.foo(1);
Scritto 27 febbraio 2009
1. Definire in ML i tipi di dato “albero binario di interi” e “lista di interi” e scrivere la funzione che
dato un albero, produce la lista contente le foglie dell’albero, elencate da sinistra a destra. (3 punti)
2. Scrivere la grammatica context-free che genera il linguaggio delle stringhe formate dai caratteri “a” e
“b”, con il numero di a diverso dal numero di b. (3 punti)
3. Dire cosa viene stampato dal seguente frammento di codice scritto in un linguaggio che usa scope
statico e passaggio per riferimento (3 punti):
{ int x=2;
int A (reference int y) { x= x+y; y=y+1; }
{int x=5; int y=5; A(x); write(x); }
write(x); }
4. Ricorsione in coda, definizione ed esempi. (3 punti)
5. Esempio della differenza fra passaggio per valore-risultato e passaggio per riferimento. (2
punti)
6. Modalità di allocazione in memoria di un oggetto di tipo array. 3 punti)
7. Dire quali sono i valori di lucchetti e chiavi dopo l’esecuzione del seguente codice scritto in un
linguaggio che adotti il modello delle variabile a riferimento e la tecnica lock and keys. (3
punti)
C foo = new C();
C bar = new C();
C fie = foo;
Bar = fie;
Scritto 18 marzo 2009
1. Definire in ML il tipo di dato ”lista di interi” e scrivere la funzione che fonde due liste. (1 punto)
2. Definire in ML i tipi di dato “albero binario di interi” e “lista di interi” e scrivere la funzione che
dato un albero, produce la lista contente le foglie dell’albero, elencate da sinistra a destra. (2 punti)
3. Qual è il linguaggio generato dalla seguente grammatica? (1 punto)
S  aaSaa | T
T  bbTbb | c
4. Scrivere la grammatica che genera il linguaggio delle parole formate dalle lettere “a”, “b”, “c”, senza
doppie. (2 punti)
5. Fornire in un qualsiasi linguaggio di programmazione una funzione ricorsiva tale che il numero
massimo dei RdA presenti a run-time sia determinabile staticamente. Perché? (3 punti)
6. Buddy system. (3 punti)
7. Illustrare l’applicazione delle politiche di deep binding e shallow binding nel seguente esempio.
(3 punti)
{ int x = 1;
int f (int y) { return x+y; }
void g (int h(bool b)) {int x=2; return h(3)+x;}
...
{ int x=4;
int z=g(f);} }
8. Tecnica mark and sweep: vantaggi e svantaggi (2 punti).
9. Definizione e implementazione del passaggio per costante. Dire qual’è il comportamento di un
interprete di uno pseudolinguaggio che ammette parametri per costante a fronte del seguente
codice. (3 punti)
int x = 2;
int foo (constant int y) { write(y); y=y+1}
foo(x);
write(x);
Scritto 13 gennaio 2010
1. Definire in ML il tipo di dato “lista di interi” e scrivere la funzione che data una lista di interi l e un
intero k, calcola il numero di elementi minori di k nella lista l (2 punti)
2. PER CHI PORTA IL PROGRAMMA 2009-2010: Descrivere il funzionamento della macchina
SECD (2 punti)
2 bis. PER CHI PORTA I PROGRAMMI DEGLI ANNI PRECEDENTI: Definire in ML una lista
di interi e scrivere la funzione che, a partire da una lista, costruisce la lista degli interi pari. (2 punti)
3. Scrivere la grammatica che genera il linguaggio delle stringhe formate dai caratteri “a” e “b”, con il
numero di a diverso dal numero di b (2 punti)
4. Fornire in un qualsiasi linguaggio di programmazione una funzione ricorsiva tale che il numero
massimo dei RdA presenti a run-time sia determinabile staticamente. Perché? (3 punti)
5. Buddy system. (3 punti)
6. Illustrare l’applicazione delle politiche di deep binding e shallow binding nel seguente esempio.
(3 punti)
{
int x = 1;
int f (int y) { return x+y; }
void g (int h(bool b)) {int x=2; return h(3)+x;}
...
{
int x=4;
int z=g(f);}
7. Tecnica mark and sweep: vantaggi e svantaggi (2 punti).
8. Definizione e implementazione del passaggio per costante. Dire qual’è il comportamento di un
interprete di uno pseudolinguaggio che ammette parametri per costante a fronte del seguente
codice. (3 punti)
int x = 2;
int foo (constant int y) { write(y); y=y+1}
foo(x);
write(x);
Scritto 13 gennaio 2010
1. Definire in ML la funzione che trova la posizione del minimo intero in una lista di interi la (2
punti)
2. PER CHI PORTA IL PROGRAMMA 2009-2010: Descrivere il funzionamento della macchina
SECD (2 punti)
2 bis. PER CHI PORTA I PROGRAMMI DEGLI ANNI PRECEDENTI: Definire in ML la
funzione che dati gli interi n ed m, creare la lista [n, n+1, …, m-1, m]. (2 punti)
3. Scrivere la grammatica che genera il linguaggio {anbmcp , n=m oppure m=p}. (3 punti)
4. fornire in un qualsiasi linguaggio di programmazione una funzione f tale che la valutazione
dell’espressione (a+f(b))*(c+f(b)) fatta da sinistra a destra abbia un risultato diverso da quello
ottenuto con la valutazione da destra a sinistra. Discutere le motivazioni (3 punti)
5. Dire cosa viene stampato dal seguente frammento di codice scritto in un linguaggio che usa scope
statico e passaggio per riferimento (4 punti):
{
int x=0;
Int A (reference int y) { int x=2; y=y+1; return B(y)+x ; }
int B (reference int y) { int C (reference int y) { int x=3; return A(y)+x+y ;}
if (y==1) return C(x)+y ; else return x+y ;}
write (A(x)); }
6. Illustrare l’applicazione delle politiche di deep binding e shallow binding nel seguente esempio.
(3 punti)
{ int x = 1;
int f (int y) { return x+y; }
void g (int h(bool b)) {int x=2; return h(3)+x;}
...
{int x=4;
int z=g(f);}
7. Equivalenza fra tipi: per nome e strutturale; compatibilità e conversione (3 punti).
Scritto 19 febbraio 2010
1. Definire in ML la funzione rovescia una lista di interi (3 punti)
2. PER CHI PORTA IL PROGRAMMA 2009-2010: Descrivere il funzionamento della macchina
SECD (2 punti)
2 bis. PER CHI PORTA I PROGRAMMI DEGLI ANNI PRECEDENTI: Definire in ML la
funzione che dati gli interi n ed m, creare la lista [n, n+1, …, m-1, m]. (2 punti)
3. Qual è il linguaggio generato dalla seguente grammatica? (3 punti)
4.
5.
6.
7.
S  aAb
aA  aaAb
A
Tecniche di allocazione di un array in memoria (3 punti)
Implementazione delle regole di scope (3 punti):
Strategie di valutazione delle espressioni nei linguaggi funzionali (3 punti)
Implementazione delle classi e dell’ereditarietà singola nei linguaggi a oggetti. (3 punti)
Scritto 24 febbraio 2010
1. Definire in ML il tipo di dato “albero di interi” e scrivere la funzione che restituisce la profondità
dell’albero (2 punti)
2. PER CHI PORTA IL PROGRAMMA 2009-2010: Descrivere il funzionamento della macchina
SECD (2 punti)
2 bis. PER TUTTI GLI ALTRI: Definire in ML la funzione che dati gli interi n ed m, crea la lista [n,
n+1, …, m-1, m]. (2 punti)
3. Scrivere la grammatica che genera il linguaggio {anbpcn+p | n, p >= 0} (2 punti)
4. Comando IF e comando CASE: implementazioni e differenze. (3 punti)
5. Definizione e implementazione del passaggio per costante. Dire qual’è il comportamento di un
interprete di uno pseudolinguaggio che ammette parametri per costante a fronte del seguente
codice. (3 punti)
int x = 2;
int foo (constant int y) { write(y); y=y+1}
foo(x);
write(x);
6. Dire cosa viene stampato dal seguente frammento di codice scritto in un linguaggio che usa
scope statico e passaggio per riferimento (2 punti):
{ int x=0;
int A (reference int y) {
int x=2;
y=y+1;
return B(y)+x ; }
int B (reference int y) { int C (reference int y) { int x=3;
return A(y)+x+y ;}
if (y==1) return C(x)+y ;
else return x+y ;}
write (A(x)); }
7. Strategie di valutazione delle espressioni nei linguaggi funzionali (3 punti)
8. Implementazione delle classi e dell’ereditarietà singola nei linguaggi a oggetti. (3 punti)
Scritto 10 marzo 2010
1. Definire in ML la funzione rovescia una lista di interi (3 punti)
2. PER CHI PORTA IL PROGRAMMA 2009-2010: Descrivere il funzionamento della macchina
SECD (2 punti)
2 bis.
PER CHI PORTA I PROGRAMMI DEGLI ANNI PRECEDENTI: Definire in ML la
funzione che dati gli interi n ed m, creare la lista [n, n+1, …, m-1, m]. (2 punti)
3. Qual è il linguaggio generato dalla seguente grammatica? (3 punti)
4.
5.
6.
7.
S  aAb
aA  aaAb
A
Tecniche di allocazione di un array in memoria (3 punti)
Implementazione delle regole di scope (3 punti):
Strategie di valutazione delle espressioni nei linguaggi funzionali (3 punti)
Implementazione delle classi e dell’ereditarietà singola nei linguaggi a oggetti. (3 punti)