logo
  • userLoginStatus

Welcome

Our website is made possible by displaying online advertisements to our visitors.
Please disable your ad blocker to continue.

Current View

Computer Engineering - Ingegneria del Software

Collection of exams 2014

Collections of notes, exercises or exams

Politecnico di Milano Anno accademico 2012-2013 Ingegneria del Software – Appello del 12 febbraio 2014Cognome: Nome: Matricola: Sezione (segnarne una):BaresiGhezziSan PietroIstruzioni 1. La mancata indicazione dei dati anagraci e della sezione comporta l`annullamento del compito. 2. Al termine, consegnare solo i fogli distribuiti utilizzando il retro delle pagine in caso di necessit a. Non separare questi fogli. Eventuali fogli di brutta, ecc. non verranno in nessun caso presi in considerazione. E possibile scrivere in matita. 3. E possibile consultare liberamente libri, manuali o appunti. E proibito l'uso di ogni dispositivo elettronico (quali calcolatrici tascabili, telefoni cellulari, ecc.). 4. Non e possibile lasciare l'aula conservando il tema della prova in corso. 5. Tempo a disposizione: 2h. Esercizio 1: Esercizio 2: Esercizio 3: Esercizio 4: 1! Esercizio 1 Si scrivano le pre- e post-condizioni in JML per i seguenti metodi statici:public static boolean diagonali(int[][] a)che riceve come parametro una matrice quadrata di interi e restituiscetruese le somme dei valori sulle due diagonali sono uguali,falsealtrimenti. public static boolean diagonali(ArrayList a, int p)che riceve come parametri un arrayList di interi e una posizionep. Il metodo restituiscetruesepnon e maggiore della lunghezza dia e se tutti gli elementi in posizione minore dipsono minori di tutti quelli in posizione maggiore di dip, mentre restituiscefalsealtrimenti. public static boolean diagonali(int[][] a, int p)che riceve come parametri una ma- trice quadrata di interi e un interop. Sep e minore della dimensione della matrice, la coppia di indici(p,p) identica un elementoesulla diagonale della matrice e divide la diagonale medesima in due partid 1e d 2( e escluso). Il metodo restituiscetruese, e solo se, la somma degli elementi della sotto-matrice la cui diagonale  ed 1 e uguale alla somma degli elementi della sotto-matrice la cui diagonale ed 2. 2 Esercizio 2 Si considerino le seguenti classi Java: public class ClassA {public void stampa(ClassA p) {System.out.println("AAA"); } } public class ClassB extends ClassA {public void stampa(ClassB p) {System.out.println("BBB"); } public void stampa(ClassA p) {System.out.println("AAA/BBB"); } } public class ClassC extends ClassA {public void stampa(ClassC p) { System.out.println("CCC"); } public void stampa(ClassA p) {System.out.println("AAA/CCC"); } } Si spieghi cosa stamperebbe il seguente metodomain, motivando brevemente le risposte: public static void main(String[] args) {ClassA a1, a2; ClassB b1; ClassC c1; a1 = new ClassB(); b1 = new ClassB(); c1 = new ClassC(); a2 = new ClassC(); b1.stampa(b1); a1.stampa(b1); b1.stampa(c1); c1.stampa(c1); c1.stampa(a1); a2.stampa(c1); } Cosa succederebbe seClassCereditasse daClassBe non daClassA? 3 Esercizio 3 Si consideri il seguente metodo Java: public static int test(int x, int y) {int z = 7; while (z > 0) {if (z - x < 0 && y != 1) z = z % (y-1); else return z; z++; } return z; } Si disegni il diagramma del usso di controllo; Si spieghi il comportamento del metodo perx=8ey=-2; Con il caso di test precedente vengono coperte tutte le decisioni? Giusticare la risposta, mostrando, in caso negativo, quali decisioni non sono coperte. 4 Esercizio 4 Un ristorante deve gestire i clienti, i tavoli, con il relativo numero di posti e la suddivisione in fumatori e non fumatori, e le prenotazioni, effettuate dai clienti per un certo giorno ed ora e un determinato numero di persone. Ad ogni prenotazione viene assegnato uno o pi u tavoli, nella zona fumatori o non fumatori in funzione della richiesta fatta. Il ristorante vuole anche tener traccia dei camerieri che servono i diversi tavoli, delle pietanze e bevande ordinate e del relativo conto nale (per cliente o per tavolo).Dei clienti interessa il nome e numero di telefono, mentre dei camerieri interessa il nome e gli anni di servizio. Per quanto riguarda piatti e bevande, interessa il nome, il prezzo unitario ed eventuali richieste particolari. L'ammontare nale del conto e dato dalla somma dei prezzi dei singoli piatti e delle bevande, tenendo conto di eventuali richieste particolari, moltiplicati per il numero di pezzi serviti.Si progetti un diagramma delle classi “dettagliato” per la gestione del ristorante e un diagramma di sequenza per la prenotazione di un tavolo per quattro persone. Il diagramma di sequenza deve usare unframeper rappresentare i due casi in cui il tavolo richiesto sia o non sia disponibile. 5 Politecnico di Milano Anno accademico 2012-2013 Ingegneria del Software – Appello del 27 febbraio 2014Cognome: Nome: Matricola:Istruzioni 1. La mancata indicazione dei dati anagraci e della sezione comporta l`annullamento del compito. 2. Al termine, consegnare solo i fogli distribuiti utilizzando il retro delle pagine in caso di necessit a. Non separare questi fogli. Eventuali fogli di brutta, ecc. non verranno in nessun caso presi in considerazione. E possibile scrivere in matita. 3. E possibile consultare liberamente libri, manuali o appunti. E proibito l'uso di ogni dispositivo elettronico (quali calcolatrici tascabili, telefoni cellulari, ecc.). 4. Non e possibile lasciare l'aula conservando il tema della prova in corso. 5. Tempo a disposizione: 2h. Esercizio 1: Esercizio 2: Esercizio 3: Esercizio 4: 1! Esercizio 1 Si scrivano le pre- e post-condizioni del metodostatic boolean confronto(ArrayList a, ArrayList b), nei tre casi seguenti: 1. Il metodo ritornatruese gli arrayListaebcontengono gli stessi elementi, magari in ordine diverso, senza ammettere elementi ripetuti; 2. Il metodo ritornatruese gli arrayListaebcontengono gli stessi elementi, magari in ordine diverso, ammet- tendo elementi ripetuti; 3. Il metodo ritornatruese gli arrayListaebcontengono gli stessi elementi, magari in ordine diverso, ammet- tendo sia elementi ripetuti sia il caso in cui il numero di occorrenze di un certo elementoninapossa essere diverso dal numero dininb. 2 Esercizio 2 IlGuardarobadi una persona contiene abiti indossabili sempre (istanze diAbito) e abiti stagionali (AbitoStagionale), adatti solo per una o pi u stagioni: 1. Volendo denire un'opportuna gerarchia di abiti, e supponendo che ogni abito offra un metodopublic boolean indossabile(Stagione s), sarebbe possibile denire una gerarchia di ereditariet a che rispetti il princi- pio di sostituibilit a di Liskov? Motivare brevemente la risposta. 2. Volendo denire un iteratoreabitiEstivi()per la classeGuardarobache restituisca i soli abiti adatti alla stagione estiva, quali classi denireste per le diverse tipologie di abito e per l'iteratore e come implementereste i suoi metodi? 3. L'uso di una classeastrattasemplicherebbe la realizzazione dell'iteratore? 3 Esercizio 3 Si consideri il seguente metodo Java: public static int test(int x, int y) {int z = x; while (z >= 0) {if (z < y || x=-1) break; else x = x /z; z--; } return z; } 1. Si disegni il diagramma del usso di controllo; 2. Si identichi, se esiste, un insieme di test (minimo) per coprire tutte le istruzioni e le decisioni (branch) delmetodo. 3. Si identichi, se esiste, un insieme di test (minimo) per coprire tutte le istruzioni e le condizioni del metodo. 4. Si spieghi il comportamento del metodo perx=4ey=-1. 4 Esercizio 4 Si progetti il diagramma delle classi UML per realizzare una semplice applicazione che opera su array di interi. Oltre alle solite operazioni di somma degli elementi, ricerca del valore minimo, medio e massimo e di calcolo della mediana, l'applicazione deve consentire la visualizzazione degli array in modi diversi. Ad esempio, sarebbe possibile usare il modo compatto (3;45;8;56), oppure quello standard (a[0] = 3; a[1] = 45; a[2] =8; a[3] = 56). Si vorrebbe anche poter aggiungere ulteriori formati di stampa personalizzati senza stravolgere le classi esistenti. Come si potrebbe realizzare la struttura delle classi per essere certi di avere un solo motore di calcolo e per poter variare le opzioni di stampa in modo semplice? Qualidesign patternutilizzereste? 5 Politecnico di Milano Anno accademico 2013-2014 Ingegneria del Software – Appello del 10 luglio 2014Cognome: Nome: Matricola: Sezione (segnarne una):BaresiGhezziSan PietroIstruzioni 1. La mancata indicazione dei dati anagraci e della sezione comporta l`annullamento del compito. 2. Al termine, consegnare solo i fogli distribuiti utilizzando il retro delle pagine in caso di necessit a. Non separare questi fogli. Eventuali fogli di brutta, ecc. non verranno in nessun caso presi in considerazione. E possibile scrivere in matita. 3. E possibile consultare liberamente libri, manuali o appunti. E proibito l'uso di ogni dispositivo elettronico (quali calcolatrici tascabili, telefoni cellulari, ecc.). 4. Non e possibile lasciare l'aula conservando il tema della prova in corso. 5. Tempo a disposizione: 2h. 6. Se il compito risultasse insufciente, non sar a possible partecipare al prossimo appello. Esercizio 1: Esercizio 2: Esercizio 3: Esercizio 4: Esercizio 5: 1! Esercizio 1 ´ E data la specica della classeIntSet(come presentata in aula), con i seguenti metodi: osservatori puriisIn,size; costruttori:IntSet; modicatori:insert,remove. Si vuole aggiungere un nuovo metodo, chiamatoextract, che restituisce un IntSet e che ha parametroxintero. Il metodo solleva un'eccezioneIllegalArgumentsexnon appartiene all'insieme corrente, altrimenti restituisce il sottoinsieme dei valori contenuti nell'insieme corrente inferiori ax. 1. Fornire una specica formale del metodo extract, ipotizzando che si tratti di un osservatore puro. 2. Denire un insieme di casi di test per il metodo utilizzando un approccioblack-box 3. Supporre che il metodoextractabbia l'effetto collaterale di eliminare dall'insieme corrente il sottoinsieme calcolato. Come cambia la specica? 4. Come cambia l'insieme dei dati di test per la nuova versione del metodo? SOLUZIONE Punto 1 IL metodo extract deve essere dichiarato puro e deve avere questa clausola ensures //@ ensures (forall int i;;(result.isIn(i) this.isIn(i) && i0 ==> //@ Math.abs(sommaX/numPunti() -getBaricentro.getX()) = 2) {if (x >= 0 || l > 0) x = x % l;else break; } return; } 1. Si disegni il diagramma del usso di controllo; 2. Si identichi, se esiste, un insieme di test (minimo) per coprire tutte le istruzioni e le decisioni (branch) delmetodo. 3. Si identichi, se esiste, un insieme di test (minimo) per coprire tutte le istruzioni e le condizioni del metodo. 4. In generale un insieme di test che copre tutte le decisioni compre anche tutte le condizioni? Nel caso non fossevero, potremmo dire che invece un insieme di test che copre tutte le condizioni compre anche tutte le decisioni? 1) ...2) Non esiste un insieme che possa coprire tutte le istruzioni: il break (e il relativo branch) non e raggiungibile (infatti, il resto della divisione di un numero positivoxper un interolnon pu o che essere non negativo). Un insieme che copre tutti le rimanenti istruzioni e branch e costituito da due dati di test: Primo dato: per uscire dal primo return basta prenderex 0(a causa della valutazione corto-circuitata), non e preso in considerazione nella valutazione del valore dell'or. Si pu o esercitare il caso false della condizionel >0, che corrisponde al= 0, ossia un dato di test del tipo(2;""), che causa tuttavia una DivisionByZeroException. 4) Naturalmente coprire tutte le decisioni non garantisce la copertura della condizioni. Anche il viceversa, tuttavia, non vale in generale: si tratta di casi ”patologici”, in cui il valore di verita' di una condizione non cambia anche assegnando tutti i possibili di valori di verita' alle condizioni elementari di cui e' composta. Esempi tipici sono i seguenti, dovexeysono variabili booleane: if (x && y && !x)) ...//sempre falso else ... if (x&&y ? !x : false) ... //sempre falso else ... if (foo(x && y)) ...//dove foo restituisce sempre false else ... Pur esercitando tutte le condizioni perxe pery, i branch else non possono essere eseguiti. 6 Esercizio 5 Si consideri la classeStackche implementa la seguente interfaccia: interface Stack_interface {void push(int n); int pop();//estrae e ritorna l'elemento in cima allo stack boolean is_empty(); } Si ipotizzi che oggetti della classeStackpossano essere manipolati concorrentemente e che quindi si debba garantire un accesso corretto. Se un task cerca di effettuare l'operazionepopquando l'oggetto stack e vuoto, esso dovr a essere sospeso no a che un altro task non avr a effettuato un'operazionepush(a meno che non intervenga una InterruptedException). Si completi la parziale implementazione dei metodi in modo da garantire appunto un accesso corretto. class Stack implements Stack_interface {private class Element {int info; Element next; Element(int n, Element e) { info = n; next = e; } } private Element first; public Stack() { first = null; } public void push(int n){ } public int pop(){ } public boolean is_empty(){ } } SOLUZIONE Una soluzione, senza particolari requisiti di efcienza, consiste nel dichiarare synchronized i tre metodi. La push deve noticare i thread che sono in attesa che la pila non sia vuota per completare un pop. Ignoriamo anche la gestione di InterruptedException. public synchronized void push(int n){first = new Element(n,first); notifyAll(); } public synchronized int pop(){while (first == null) wait(); Element elm = first; first = first.next; return elm.info; } public synchronized boolean is_empty(){return (first == null); } 7 Politecnico di Milano Anno accademico 2013-2014 Ingegneria del Software – Appello del 23 luglio 2014Cognome: Nome: Matricola: Sezione (segnarne una):BaresiGhezziSan PietroIstruzioni 1. La mancata indicazione dei dati anagraci e della sezione comporta l`annullamento del compito. 2. Al termine, consegnare solo i fogli distribuiti utilizzando il retro delle pagine in caso di necessit a. Non separare questi fogli. Eventuali fogli di brutta, ecc. non verranno in nessun caso presi in considerazione. E possibile scrivere in matita. 3. E possibile consultare liberamente libri, manuali o appunti. E proibito l'uso di ogni dispositivo elettronico (quali calcolatrici tascabili, telefoni cellulari, ecc.). 4. Non e possibile lasciare l'aula conservando il tema della prova in corso. 5. Tempo a disposizione: 2h. Esercizio 1: Esercizio 2: Esercizio 3: Esercizio 4: Esercizio 5: 1! Esercizio 1 Durante la realizzazione di un gioco multi-giocatore, occorre denire una struttura dati, adatta a rappresentare un labirinto. Il labirinto e costituito da stanze, collegate da porte magiche. Vi e una stanza di ingresso al labirinto e un certo numero di stanze di uscita dallo stesso. Ogni stanza ha un nome (una stringa) ed e dotata di almeno una porta per passare istantaneamente in una stanza diversa. Anche ogni porta ha un nome; se da una stanzaxesiste una porta verso una stanzay, allora questa porta e unica. Il labirinto in Java e rappresentato da una classe immutabile, i cui esemplari sono costruiti a partire da un le opportuno, caratteristica che per semplicit a qui ignoriamo. Di seguito e riportata la specica delle classi rilevanti. public /*@ pure @ */ class Stanza { //s e' l'insieme delle porte in uscita a this public Stanza(Set s, String nome); //@ensures (* esult e' l'insieme di porte in uscita dalla stanza this *); public Set porteOut(); //@ensures (* esult e' il nome della stanza this *); public String nome() } public /*@ pure @ */ class Porta { //x e' la stanza verso cui si viene trasportati public Porta(Stanza x, String nome) //@ensures (* esult e' la stanza a cui si viene trasportati passando attraverso this. *); public Stanza versoStanza(); //@ensures (* esult e' il nome della porta this *); public String nome() } public /*@ pure @ */ class Labirinto { public Labirinto(...strutture adeguate a caricare un labirinto non vuoto...); //@ensures (* esult e' true se, e solo se, esiste una porta che //@ collega direttamente la stanza x alla stanza y*); public boolean esistePorta(Stanza x, Stanza y) //@ensures (* esult e' la stanza di ingresso al labirinto *) public Stanza ingresso() //@ensures (* esult e' l'insieme di tutte le stanze del labirinto *) public Set stanze() //@ensures (* esult e' il sottoinsieme di stanze() che sono di uscita dal labirinto *) public Set uscite() //@ensures (* esult restituisce un iteratore che itera su tutte le porte di this, //@ una alla volta, in ordine qualunque*); Iterator porte() } Si rammenta che un Set e una collection di Java, in cui non vi possono essere elementi duplicati. Si pu o accedere agli elementi di un set esclusivamente tramite i consueti metodicontains,containsAll,isEmptyesize. 2 Domanda 1 Specicare in JML il metodoesistePorta. SOLUZIONE: Ipotizziamo, qui e nel seguito, che i metodi delle varie classi non ritornino mai il valore null, ne' null sia un valore ammissibile per una porta o una stanza del labirinto. //equires stanze().contains(x) && stanze().contains(y); //@ensures esult == //@ (\exists Porta p; x.porteOut().contains(p); p.versoStanza().equals(y)); Domanda 2Si vuole denire unLabirintoStregato, simile alLabirinto, ma in cui alcune dellePorte sono rimpiazzate da unaPortaStregata. UnaPortaStregata e identica a unaPorta, salvo che la stanza a cui conduce e scelta casualmente fra tutte le stanze. Le classiPortaStregataeLabirintoStregatosono denite nel modo seguente: public class PortaStregata extends Porta {public PortaStregata(Set stanze, String nome); @override //@ensures (* esult e' una stanza scelta a caso *); public Stanza versoStanza(); } public class LabirintoStregato extends Labirinto {// ridefinizione del solo costruttore, che permette di // costruire un labirinto in cui una o piu' porte sono // stregate } Queste ridenizioni vericano il principio di sostituzione? Giusticare la risposta. SOLUZIONE: La classe PortaStregata verica la regola dei metodi, in quanto la postcondizione garantisce di restituire una stanza, che e' tutto quello che viene promesso dalla postcondizione originale. Tuttavia, la regola delle propriet a e violata, in quanto la classa PortaStregata diventa mutabile, ossia non e piu' pura: la stanza restituita e' un invariante della classe originale. La classe LabirintoStregato non viola naturalmente la regola dei metodi, ma anch'essa viola la regola delle proprieta'. Ad esempio, l'invariante che non ci sono in una stanza due porte che conducono a una stessa stanza, puo' essere violato, in quanto in modo causale in certi momenti due porte potrebbero riferirsi alla stessa stanza. 3 Domanda 3 Si consideri una generalizzazione del concetto diPorta, ipotizzando che ogni porta possa avere anche un effetto sulle caratteristiche dell'avatar che la attraversa. Per esempio, unaPorta Magicaconsente all'avatar di assumere alcuni poteri magici per un certo tempo; unaPorta Premioincrementa il punteggio del giocatore; una Porta Resurrezionefornisce una vita supplementare al giocatore; unaPorta Maledizioneprocura una maledizione che rispedisce il giocatore a un livello precedente, ecc. Il tipo delle porte potrebbe cambiare arun-time e nuovi tipi di porta potrebbero essere deniti in base al particolare tipo di gioco che usa il labirinto. Quale potrebbe essere l'organizzazione di una struttura a classi che consente di realizzare un progetto essibile ed estendibile? Non serve scrivere il codice Java, ma un diagramma delle classi UML potrebbe essere utile per rappresentare le diverse classi e le loro relazioni.SOLUZIONE: Si pu o utilizzare una Strategy. Supponendo che vi sia una classe Avatar, che descrive l'avatar di un giocatore, si potrebbe denire l'interfaccia: interface ComportamentoPorta {//@ensures (*agisce sull'avatar p *); public void effetto(Avatar p) } la classe Porta potrebbe essere cos  denita: public class Porta {//questi metodi non cambiano: public Porta(Stanza x, String nome, ComportamentoPorta p) public Stanza versoStanza(); public String nome(); //un pezzo del rep: private ComportamentoPorta comportamento; //nuovo metodo per associare un comportamento public associaEffetto(ComportamentoPorta p) {this.comportamento == p; } } Ad esempio, il comportamento della Porta Premio potrebbe essere ottenuto cos : public class ComportamentoPortaPremio implements ComportamentoPorta {//@ensures (*incremento il punteggio di p *) public void effetto (Avatar p); } Il pattern Strategy consente di modicare a run-time il comportamento della Porta, senza modicare la classe Labirinto. Un Abstract per la gerarchia delle porte non consente di cambiare facilmente il comportamento delle porte: occorre ogni volta una nuova istanza di Porta, copiarvi le altre caratteristiche della Porta esistente e inne memorizzare nel Labirinto la nuova porta al posto di quella vecchia (aggiungendo naturalmente i metodi opportuni per farlo): la struttura e' piu' goffa e poco essibile. Un Decorator puo' svolgere lo stesso ruolo di una Strategy, ma e' eccessivamente generale per risolvere questo problema particolare: un decorator e' utile quando ci sono piu' attributi/metodi che possono variare, anche a livello dell'interfaccia della classe, mentre lo Strategy e' da preferire quando si deve scegliere fra diverse implementazioni di un'operazione (a parita' di interfaccia). 4 Esercizio 2 Sia data per la classeLabirintola seguente implementazione. Il numero totale di stanze del labirinto e memorizzato nel campo interonumStanze. Le stanze sono rappresentate da una mapmappaStanze, che associa ad ogni stanza un intero progressivo (in un ordine arbitrario), partendo da0. Lo0corrisponde sempre alla stanza di ingresso. Il labirinto e rappresentato con una matrice quadratacollegamenti, di dimensionenumStanzenumStanze. Nella posizione(i; j)della matrice e memorizzata, se esiste, la porta che collega la stanza di numeroicon la stanza di numeroj; se la porta non esiste, allora e memorizzato il valorenull. private int numStanze; private Map mappaStanze; private Porta[][] collegamenti; Si rammenta che l'interfacciaMapprevede, fra l'altro, i seguenti metodi puri. Il metodoV get(Object x), dato unxdi tipoK, restituisce l'elemento di tipoVassociato ax, se questo esiste (se non esiste, get restituiscenull). Quindi se p.es.x e la stanza di ingresso,get(x)restituisce l'intero0, ecc. Il metodosize()restituisce la dimensione della mappa (ossia il numero complessivo di stanze). Il metodokeySet()restituisce un Set che con- tiene tutte le chiavi (ossia tutte le stanze memorizzate nella mappa). Inne, il metodovalues()restituisce una Collectionche contiene tutti i valori della mappa. Domanda 1Scrivere l'invariante di rappresentazione. Facoltativamente, si scriva anche la funzione di astrazione (utilizzando la tecnica preferita) della classeLabirinto. 5 SOLUZIONE: //RI: private invariant collegamenti!= null && mappaStanze!= null && //numStanze e' proprio la dim. della matrice collegamenti:numStanze == collegamenti.length && //la matrice collegamenti e' quadrata:( orall int i; 0b>0per potere entrare almeno una volta nel while e nel ramo then, con la condizione cheasia multiplo dibper potere uscire dal ciclo. P.es.a=2, b=1: il programma esegue una volta il while, poi il ramo then: a quel puntoa=b=1e il programma esce; un altro esempio´ ea=6, b=2, che resta tre volte nel ciclo, ecc. Un caso di test che copre l'altro ramo dell'if deve vericarea0) { 3. j = n*(n-1); 4. while (j>0) {----//qui codice che non cambia n e j 5. j--; 6. if (j==0) exit; 7. } 8. ----; 9. }; 1. Si denisca un insieme minimo di casi di test che coprano tutte le istruzioni (si considerino le partitralasciate----come se fossero una singola macro-istruzione); 2. Si denisca un insieme minimo di casi di test che coprano tutti i branch. 3. Si consideri un cammino che esegue il ciclo due volte. Si scriva l'espressione logica che deve es-sere soddisfatta per la percorrenza di detto cammino e si identichi un valore di input che causa la percorrenza dello stesso. Esercizio 5 Si consideri una tabella di dati, realizzata come singleton. Ogni riga della tabella contiene una chiave intera ed una stringa come valore. La tabella offre le seguenti operazioni: 1.searchAndGetriceve come parametro una chiave e restituisce tutte le stringhe memorizzate nella tabella di dati con quella chiave, cancellandola dalla tabella stessa. 2.insertriceve un dato (stringa), con chiave associata, e lo memorizza. La tabella viene usata in un ambiente concorrente da pi u thread. Poich´ e essa ha una dimensione predenita, quando risulta piena, l'invocazione dell'operazioneinsertsospende il task che invoca l'operazione in attesa che venga liberato spazio dall'invocazione disearchAndGet. Si fornisca un'implementazione Java del singletonTabella.