1) Si definisca una classe FinancialHistory le cui istanze conservano informazioni relative alla gestione di un bilancio. La classe deve fornire i seguenti costruttori e metodi: a) un costruttore con argomento intero che rappresenta l'ammontare iniziale a disposizione; b) un metodo void receiveFrom (int amount, String source) che registra una nuova entrata di amount ricevuta da source (ad esempio, "stipendio"); c) un metodo void spendFor (int amount, String reason) che registra una nuova uscita di amount spesa per reason (ad esempio, "affitto"); d) un metodo int cashOnHand () che restituisce il contante disponibile; e) un metodo int totalReceivedFrom (String source) che restiuisce il totale delle entrate ricevute da source (0 di default); f) un metodo int totalSpentFor (String reason) che restituisce il totale delle uscite spese per reason (0 di default). NB: le liste delle entrate e delle uscite possono essere implementate utilizzando la classe predefinita Hashtable (vedere la documentazione disponibile in rete). Si aggiunga un trattamento con eccezioni delle seguenti situazioni: passaggio come parametro di un ammontare negativo; "bilancio in rosso" (cioe' si tenta di spendere piu' di quel che si ha). Si definisca poi una classe heir DeductibleHistory che tiene anche conto di quali sono le spese deducibili nella dichiarazione dei redditi. La deduzione fiscale puo' essere effettuata solo se il totale delle spese deducibili supera un certo minimo minDeductions. Si aggiungano un metodo di classe setMinDeductions che assegna un valore a tale minimo, un metodo spendDeductibleFor (int amount, String reason) che registra un'uscita deducibile, un metodo int totalDeductions () che ritorna il totale delle spese deducibili ed un metodo boolean isDeductible () che ritorna vero solo se la deduzione fiscale puo' essere effettuata. 2) Si definisca una class BST che implementa gli alberi di ricerca binari con etichette intere. La classe deve fornire almeno un metodo di ricerca/inserimento di un intero, un clone ed un metodo che stampa il risultato della visita inorder. Si definisca poi una classe BSTPlus che implementa gli alberi di ricerca binari in cui si conserva anche l'informazione relativa alla molteplicita' di un etichetta (ossia, si tiene traccia di quante volte e' stato inserito un numero). 3) Si definisca una classe astratta o interfaccia Expr ed opportune classi eredi che implementano le espressioni costruite a partire da variabili (le lettere minuscole dell'alfabeto inglese), numeri (che supponiamo per semplicita' coincidere con gli interi di Java) e gli operatori somma e prodotto. Fornire: gli opportuni costruttori; i metodi che stampano un'espressione in sintassi prefissa, postfissa ed infissa; un metodo che, dato un ambiente (un'associazione di valori interi alle variabili) restituisce il valore intero di un'espressione; un metodo che, data una sostituzione (un'associazione di espressioni alle variabili), restituisce l'espressione ottenuta effettuando la sostituzione. 4) Si definisca una classe Lab che implementa un "labirinto". Un labirinto una matrice quadrata di dimensione n in cui ogni casella puo' essere spazio percorribile o muro; inoltre, nel labirinto e' posto un eroe. Si scriva un metodo che sposta l'eroe nella direzione verso cui rivolto (uno dei 4 lati del labirinto) fin quando e' possibile; lo spostamento di una casella e' possibile se la casella destinazione non muro. Se nella casella destinazione c' il muro l'eroe ruota di novanta gradi verso destra e continua. Il metodo termina quando l'eroe riesce ad uscire dal labirinto (si trascurino i problemi di non terminazione dovuti a configurazioni bloccate). Si definisca poi una classe LabWithMonster che estende la precedente aggiungendo un mostro all'interno del labirinto. Le regole sono come prima, con in piu' il fatto che ora il metodo precedente termina anche nel caso in cui l'eroe finisca nella casella occupata dal mostro e venga quindi mangiato.