Linguaggi di Programmazione + laboratorio - Laurea ICD Tracce delle prove di laboratorio - a.a. dal 2008 al 2011 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); Implementare in C++ la struttura dati CODA DI INTERI: definire i metodi di inserimento ed eliminazione di un elemento, valutazione dell’insieme vuoto, visualizzazione degli elementi (1 punto); definire una classe derivata CODA DI INTERI PARI, con un costruttore adatto (1 punto); realizzare il metodo che appende una coda a un’altra e visualizza la coda ottenuta. (1 punto). (Importante: ricordate che si può accedere alle strutture definite solo tramite gli operatori standard.) 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) Mostrare se e’ possibile creare una classe con due costruttori; quando e come è invocato uno piuttosto che l’altro? (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). Definire una gerarchia di classi in cui la classe C è derivata dalla classe A e dalla classe B, e mostrare se e come la classe C può utilizzare i metodi e i dati membro delle classi A e B (2 punto). 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) Definire una classe a vostra scelta; istanziare un certo numero di oggetti; mostrare un modo per contare quanti oggetti sono istanziati in un certo momento dell’esecuzione del programma (1 punto). Fornire un esempio di classe con costruttore con elementi di default e di classe con costruttore con parametri, anche parziali. (1 punto) Linguaggi di Programmazione + laboratorio - Laurea ICD Tracce delle prove scritte - a.a. dal 2008 al 2011 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) Scritto giugno 2010 1. Definire in ML la funzione che rovescia una lista di interi (3 punti) 2. 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): Implementazione delle classi e dell’ereditarietà singola nei linguaggi a oggetti. (3 punti) 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 luglio 2010 1. 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) 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. 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)); } 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. (3 punti) 5. Politiche di deep binding e shallow binding. (3 punti) 6. 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); 7. Strategie di valutazione delle espressioni nei linguaggi funzionali (2 punti) Oppure: 7 Bis. Implementazione delle classi e dell’ereditarietà singola nei linguaggi a oggetti. (2 punti) Scritto 8 febbraio 2011 1. 2. 3. 4. 5. 6. Descrivere le modalità di implementazione interpretativa e compilativa (3 punti) Implementazione del comando CASE (3 punti) Passaggio per valore-risultato: definizione, esempi e problematiche (3 punti) Macchina SECD: descrizione e esempi di funzionamento (3 punti) Implementazione dell’ereditarietà singola (3 punti) Chiarire i concetti di interfaccia, implementazione, incapsulamento, occultamento dell’informazione con riferimento ai tipi di dato astratti. (3 punti) 7. Tecnica mark and sweep: descrizione, vantaggi e svantaggi. (2 punti) Scritto 18 febbraio 2011 Definizione di redex, ridotto e -regola; per ogni definizione fornire un esempio (3punti). Scrivere la funzione che restituisce l’immagine riflessa di un albero binario (3punti). Selezione dinamica dei metodi: problematiche ed esempi (3punti). Sono date le seguenti definizioni di tipi in un linguaggio di programmazione che usa equivalenza strutturale fra tipi: type T1 = struct {int a; bool b;}; type T2 = struct {int a; bool b;}; type T3 = struct {T2 u; T1 v;}; type T4 = struct {T1 u; T2 v;}; Con le dichiarazioni T3 c; T4 d; si dica se è ammesso l’assegnamento c=d e perché (3punti). 5. In un linguaggio con eccezioni è data la seguente funzione: int f(int x){ if (X==0) return 1; else if (X==1) throws ECC; else if (X==2) return f(1); else try {return f(x-1);} catch ECC {return x+1;}} Quale valore è ritornato da f(4) e perchè? (3punti) 6. Il seguente frammento di codice è scritto in un linguaggio di programmazione che ammette iterazione determinata controllata numericamente, espressa con il costrutto for. Si dica cosa viene stampato e perché. (3punti) z=1; for i=1 to 5+z do { write(i); z++;} write(z); 7. Si scriva un frammento di codice tale che il numero massimo di record di attivazione presenti sulla pila a run-time non sia determinabile staticamente; si scriva un frammento di codice tale che il numero massimo di record di attivazione presenti sulla pila a run-time sia determinabile staticamente; spiegare le differenze (2 punti). 1. 2. 3. 4. Scritto 24 gennaio 2011 1. 2. 3. 4. 5. 6. Descrivere le modalità di implementazione interpretativa e compilativa (3 punti) Implementazione del comando CASE (3 punti) Passaggio per valore-risultato: definizione, esempi e problematiche (3 punti) Macchina SECD: descrizione e esempi di funzionamento (3 punti) Implementazione dell’ereditarietà singola (3 punti) Chiarire i concetti di interfaccia, implementazione, incapsulamento, occultamento dell’informazione con riferimento ai tipi di dato astratti. (3 punti) 7. Tecnica mark and sweep: descrizione, vantaggi e svantaggi. (2 punti)