Numeri, espressioni, calcoli, caratteri, input Una classe Borsellino
Transcript
Numeri, espressioni, calcoli, caratteri, input Una classe Borsellino
Numeri, espressioni, calcoli, caratteri, input Una classe Borsellino /** Realizza un borsellino per le monete. Registra il numero di monete e calcola il valore totale */ public class Purse { /** Costruisce un borsellino vuoto */ public Purse() { } Interi e decimali Definizione di costanti Espressioni Funzioni matematiche Classi involucro La bora torio di P rogra mma zione - Luca Te s e i /** Aggiunge monete di tipo "nickel" al borsellino @param count il numero di nickel da aggiungere */ public void addNickels(int count) { } 1 Classe Borsellino contd La bora torio di P rogra mma zione - Luca Te s e i 2 Esempio duso /** Aggiunge monete di tipo "dime" al borsellino @param count il numero di dime da aggiungere */ public void addDimes(int count) { } /** Aggiunge monete di tipo "quarter" al borsellino @param count il numero di quarter da aggiungere */ public void addQuarters(int count) { } /** Ispeziona il valore totale delle monete nel borsellino @returns la somma dei valori di tutte le monete attualmente presenti */ public double getTotal() { } Purse myPurse = new Purse(); myPurse.addNickels(3); myPurse.addDimes(1); myPurse.addQuarters(2); double totalValue = myPurse.getTotal(); totalValue conterrà 0,75 cioè il valore in dollari delle monete contenute nel borsellino } La bora torio di P rogra mma zione - Luca Te s e i 3 La bora torio di P rogra mma zione - Luca Te s e i 4 Primi passi per limplementazione di Purse Numeri interi e numeri decimali Per rappresentare quantità che si contano naturalmente con multipli di 1 (positivi o negativi) usiamo variabili di tipo intero (int) Nellesempio del borsellino int è il tipo dei parametri dei metodi addXXX Questo perché è naturale considerare le monete come quantità indivisibili e quindi quantificate con un numero intero Il metodo getTotal() invece restituisce un double Questo perché è naturale per un valore che rappresenta una quantità di dollari avere dei decimali La bora torio di P rogra mma zione - Luca Te s e i Ogni oggetto di tipo Purse può essere descritto dalla quantità di nickels, dimes e quarters che contiente Inseriamo quindi tre variabili istanza di tipo int per rappresentare queste quantità ... private int nickels; private int dimes; private int quarters; 5 La bora torio di P rogra mma zione - Luca Te s e i Primi passi per limplementazione di Purse Costanti numeriche public double getTotal() { return nickels * 0.05 + dimes * 0.1 + quarters * 0.25; } L * indica la moltiplicazione (perché o ´ non si trovano generalmente nelle tastiere) Lespressione dopo return segue le regole di associatività e precedenza tipiche dellaritmetica (la grammatica di Java per le espressioni segue le regole che abbiamo visto a Programmazione) Il valore ottenuto è un numero in virgola mobile poiché moltiplicando un intero per un numero decimale si ottiene un numero decimale, in generale La bora torio di P rogra mma zione - Luca Te s e i 6 7 Nelle costanti numeriche che si possono scrivere nel codice la virgola deve essere indicata come punto decimale Si può usare anche la notazione esponenziale Ad esempio 5,0 ´ 10-3 si scrive come 5.0E-3 Cioè si usa il punto decimale e si scrive E seguito dallesponente di ´ 10 La bora torio di P rogra mma zione - Luca Te s e i 8 Numeri interi Numeri interi Un numero intero è un numero senza decimali che può essere sia positivo che negativo Il tipo base Java corrispondente ai numeri interi è int Una variabile int può contenere i numeri interi da 2147483648 a +2147483647 31 bit + 1 bit per il segno = 32 bit di memoria allocati per ogni variabile int La bora torio di P rogra mma zione - Luca Te s e i Esistono altri tipi base di interi che possono rappresentare meno o più numeri di int • short: 16 bit - Range: da -215 a 215-1 • byte: 8 bit - Range da 27 a 27-1 • long: 64 bit - Range da 263 a 263 1 9 Numeri in virgola mobile 10 Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della virgola Es. 250 25 0.25 0.025 hanno tutti le stesse cifre significative (25), ciò che cambia è la posizione della virgola (da qui virgola mobile) Naturalmente la rappresentazione in realtà è in base 2 In java la virgola è rappresentata dal punto decimale come nella notazione anglosassone (come tutte le calcolatrici del resto) La bora torio di P rogra mma zione - Luca Te s e i La bora torio di P rogra mma zione - Luca Te s e i 11 • double può rappresentare circa 15 cifre significative: è il tipo con maggiore precisione (doppia precisione) • float può rappresentare circa 7 cifre significative: precisione spesso insufficiente, ma calcoli più veloci Per precisione si intende la grandezza degli errori dovuti all arrotondamento che inevitabilmente si commettono con luso di questi numeri La bora torio di P rogra mma zione - Luca Te s e i 12 Precisione Numeri rappresentabili public class ProvaPrecisione { public static void main(String [] argv) { double originalPrice = 3E14; double discountedPrice = originalPrice – 0.05; double discount = originalPrice – discountedPrice; // dovrebbe essere 0.05 System.out.println(discount); // stampa 0.0625 – Errore dovuto //all’arrotondamento da rappresentazione } } La bora torio di P rogra mma zione - Luca Te s e i 13 La bora torio di P rogra mma zione - Luca Te s e i Numeri a lunghezza e precisione arbitraria 14 Numeri a lunghezza e precisione arbitraria Il pacchetto java.math contiene una classe BigInteger i cui oggetti possono rappresentare numeri interi di lunghezza arbitraria Lo stesso pacchetto contiene una classe BigDecimal i cui oggetti possono rappresentare numeri a virgola mobile con precisione arbitraria Per questi numeri non si possono usare i normali operatori + * - / = I corrispondenti metodi add, multiply, subtract, divide ed equals sono forniti dalle relative classi: BigInteger a = new BigInteger(“123456789”); BigInteger b = new BigInteger(“987654321”); BigInteger c = a.multiply(b); System.out.println(c); // stampa 121932631112635269 La bora torio di P rogra mma zione - Luca Te s e i Il tipo float può rappresentare il range dei numeri, positivi o negativi, con valore assoluto che va da 2-149 a (2-2-23)2127 Il tipo double può rappresentare il range dei numeri, positivi o negativi, con valore assoluto che va da 2-1074 a (2-2-52)21023 15 Naturalmente i calcoli con questi numeri sono più lenti di quelli fatti con i numeri dei tipi base e richiedono più memoria La bora torio di P rogra mma zione - Luca Te s e i 16 Costruttore di Purse Implementazione di addNickels Public Purse() { nickels = 0; dimes = 0; quarters = 0; } Il costruttore di default farebbe esattamente la stessa cosa, ma lo specifichiamo per chiarezza public void addNickels(int count) { nickels = nickels + count; } È la tipica istruzione di incremento di un valore Lassegnamento prima valuta la parte a sinistra dell= e quindi considera il valore corrente della variabile istanza intera nickels al quale aggiunge il valore di count Il valore così ottenuto sarà assegnato alla variabile istanza nickels, cioè sarà il suo valore dopo lesecuzione dellistruzione (si può pensare che sia il valore che nickels ha dopo il ; finale) La bora torio di P rogra mma zione - Luca Te s e i 17 La bora torio di P rogra mma zione - Luca Te s e i 18 Altre istruzioni di incremento Incremento di 1 In Java, come in C, esiste una forma abbreviata per lincremento nickels = nickels + count; può essere scritta equivalentemente come nickels += count; La stessa abbreviazione si può usare anche per gli altri operatori (*, /, -): P *= q; // equivalente a p = p * q; Unistruzione che ricorre molto frequentemente nei programmi è lincremento o il decremento di una variabile intera di una unità In Java, come in C, esistono abbreviazioni speciali per questi casi: i++; // equivalente a i = i + 1; e a i +=1; i--; // equivalente a i = i – 1; e a i -=1; La bora torio di P rogra mma zione - Luca Te s e i 19 La bora torio di P rogra mma zione - Luca Te s e i 20 Costanti Costanti public double getTotal() { return nickels * 0.05 + dimes * 0.1 + quarters * 0.25; } La maggior parte del codice si documenta da sé, ma in questo caso i numeri 0.05, 0.1 e 0.25 compaiono senza nessuna spiegazione È buona regola evitare di inserire nel codice questi numeri magici La bora torio di P rogra mma zione - Luca Te s e i 21 La bora torio di P rogra mma zione - Luca Te s e i Costanti 22 final public double getTotal() { final double NICKEL_VALUE = 0.05; final double DIME_VALUE = 0.1; final double QUARTER_VALUE = 0.25; return nickels * NICKEL_VALUE + dimes * DIME_VALUE + quarters * QUARTER_VALUE; } La bora torio di P rogra mma zione - Luca Te s e i Le costanti possono essere pensate come dei nomi a cui è associato un valore Tale associazione rimane valida per tutta la vita della costante e non cambia mai In genere, per convenzione, le costanti sono scritte tutte maiuscole e si usa lunderscore come separatore nel caso che il nome sia composto da più parole In Java una costante si dichiara come una variabile (di frame) usando la parola chiave final e inizializzando il valore nella dichiarazione 23 In generale in Java la parola chiave final indica un qualcosa che non può essere più modificato (vedremo che esistono, oltre alle variabili, anche classi final, cioè che non possono essere estese) Il compilatore dà errore se si cerca di modificare una variabile final. La bora torio di P rogra mma zione - Luca Te s e i 24 Costanti Costanti La dichiarazione di una variabile con lo specificatore final ha lo stesso effetto di una qualsiasi altra definizione di variabile Viene cioè allocata la nuova variabile sul frame corrente dellattivazione corrente Al momento della chiusura del blocco del frame in cui è stata definita essa scompare E il controllo del compilatore che la rende non modificabile La bora torio di P rogra mma zione - Luca Te s e i 25 La bora torio di P rogra mma zione - Luca Te s e i static 26 static Lo specificatore static deriva dal C e il suo nome può risultare fuorviante In Java, se nella definizione di una classe viene inserita una variabile istanza con lo specificatore static, quella variabile istanza va considerata come elemento della classe In genere le variabili istanza formano lo stato di ogni oggetto della classe che viene creato Le variabili istanza static invece non vanno a far parte dello stato degli oggetti della classe, ma fanno parte della definizione della classe stessa La bora torio di P rogra mma zione - Luca Te s e i In genere però le costanti sono utili in diversi metodi della stessa classe Per evitare di dover ridefinire le variabili final in ogni metodo che le usa (ed evitare anche errori se il valore viene modificato solo in alcuni metodi, ad esempio in unaltra versione del programma) possiamo pensare di associare le costanti direttamente alla classe Per definire costanti che si riferiscono ad una classe si può usare lo specificatore static 27 Esiste una sola copia di una variabile istanza static di una classe e si riferisce allintera classe Per riferirla e/o modificarla si usa la notazione NomeClasse.nomeVariabileIstanzaStatic Alle variabili istanza static possono essere associati tutti i possibili specificatori di accesso: public, private e protected Inoltre possono essere final, cioè costanti di classe La bora torio di P rogra mma zione - Luca Te s e i 28 Esempio Esempio Vedremo più avanti degli esempi in cui sono utili variabili static di classe Per adesso useremo questa possibilità solo per specificare costanti Nel nostro caso le costanti che indicano il valore di ogni moneta sembrano essere utili solo nel contesto della classe Purse e quindi le dichiariamo private Molte classi delle API hanno invece delle costanti pubbliche che si possono usare La bora torio di P rogra mma zione - Luca Te s e i public class Purse { ... private static final double NICKEL_VALUE = 0.05; private static final double DIME_VALUE = 0.1; private static final double QUARTER_VALUE = 0.25; ... } 29 La bora torio di P rogra mma zione - Luca Te s e i Esempio Operazioni fra interi e decimali Allinterno dei metodi della classe si possono riferire le variabili static (sia final che non) semplicemente con il loro nome (nel caso di conflitto va invece specificato il nome completo (cioè NomeClasse.nomeVariabile), ad esempio Purse.NICKEL_VALUE public double getTotal() { return nickels * NICKEL_VALUE + dimes * DIME_VALUE + quarters * QUARTER_VALUE; } La bora torio di P rogra mma zione - Luca Te s e i 30 31 In Java gli operatori + - * / si possono combinare come si vuole insieme a costanti numeriche, variabili di frame, variabili istanza e chiamate di metodi per ottenere espressioni aritmetiche Gli operandi possono essere sia numeri interi (byte, short, int, long) che numeri in virgola mobile (float, double) Il risultato è un intero solo se tutti gli operandi sono interi Basta che un solo operando si in virgola mobile perché il valore di tutta lespressione sia in virgola mobile La bora torio di P rogra mma zione - Luca Te s e i 32 Espressioni aritmetiche Espressioni aritmetiche La grammatica per le espressioni aritmetiche che si possono scrivere in Java è la seguente: EàE+T|ET|T TàT*F|T/F|F F à -<Op> | <Op> <Op> à (E) | <Num> | <Ide> | <DotExpr> La grammatica implementa le regole tipiche di associatività e precedenza degli operatori F è un ulteriore livello di precedenza per loperatore unario (che lega più di tutti) usato per cambiare il segno a un operando La bora torio di P rogra mma zione - Luca Te s e i 33 La bora torio di P rogra mma zione - Luca Te s e i Espressioni aritmetiche 34 Divisione Esempi: –7 * 4 à valore 28 (int) – 11 + 2.0 / 4 à valore 11.5 (double) – (11 + 2.0) / 4 à valore 3.25 (double) – this.nickels * this.getTotal() – 3 * 7 à supponendo che il valore della variabile istanza nickel delloggetto this sia 3 (int) e che il totale this.getTotal() sia 12.5 (double) si ottiene un valore double a causa del valore double delloperando this.getTotal(). Il valore è 16.5 La bora torio di P rogra mma zione - Luca Te s e i <Num> è un simbolo non terminale che genera tutte le possibili costanti numeriche (intere e decimali, con o senza notazione esponenziale) <Ide> è un simbolo non terminale che genera tutti i possibili identificatori Java <DotExpr> è un simbolo non terminale che genera tutte le possibili espressioni formate da nomi e/o chiamate di metodi separate da punti (ad esempio myPurse.getTotal() rappresenta un double, this.nickels rappresenta un int allinterno di un metodo della classe Purse ) 35 Bisogna prestare unattenzione particolare al simbolo / In Java esso rappresenta sia la divisione usuale che la divisione intera Viene applicata la divisione intera se entrambi gli operandi sono interi La divisione intera restituisce solo la parte intera del risultato! 7 / 4 à valore 1! Non 1.75! 7 / 4.0 à valore 1.75 (4.0 non intero) La bora torio di P rogra mma zione - Luca Te s e i 36 Resto della divisione intera Errore comune Il simbolo % è un operatore binario che si può applicare solo fra due interi Calcola il resto della divisione intera fra il primo e il secondo 7 % 4 à valore 3 La bora torio di P rogra mma zione - Luca Te s e i Loverloading del simbolo / porta spesso ad errori logici difficili da individuare Ad esempio: ... int p1 = 21; // punteggio prima prova int p2 = 24; // punteggio seconda prova int p3 = 22; // punteggio terza prova double media = (p1 + p2 + p3) / 3; System.out.println(media); /* Stampa 22.0! Non 22.3333333!! */ 37 La bora torio di P rogra mma zione - Luca Te s e i Errore comune Metodi static Per ottenere il risultato che vogliamo bisogna fare in modo che almeno uno degli operandi sia un double // Se un intero viene assegnato a una variabile // di tipo double viene convertito a double double totale = p1 + p2 + p3; // totale è un valore double double media = totale / 3.0; Oppure double media = (p1 + p2 + p3) / 3.0; La bora torio di P rogra mma zione - Luca Te s e i 38 39 La classe java.lang.Math (vedi API) è una collezione di costanti e metodi static Abbiamo già visto che una variabile istanza dichiarata come static si riferisce alla classe e ne esiste ununica copia (non viene inserita nello stato degli oggetti della classe che vengono creati) Anche un metodo può essere dichiarato come static e, analogamente, esso si riferisce alla classe È analogo a una funzione del C La bora torio di P rogra mma zione - Luca Te s e i 40 Funzioni e costanti matematiche Metodi static Un metodo static non può essere invocato su un oggetto della classe Lunico modo per mandare in esecuzione il metodo static è quello di scrivere NomeClasse.nomeMetodo(parametri); Allinterno di un metodo statico non è disponibile il parametro implicito this (poiché non cè nessun oggetto su cui il metodo è stato invocato) Per il resto il meccanismo di esecuzione è analogo a quello dei metodi non statici (in particolare la creazione di una nuova attivazione e il meccanismo di passaggio e gestione dei parametri espliciti) La bora torio di P rogra mma zione - Luca Te s e i 41 La bora torio di P rogra mma zione - Luca Te s e i Conversioni di tipi 42 Conversioni esplicite Il compilatore esegue alcune conversioni di tipo implicitamente: Quando un valore intero viene assegnato ad una variabile double o float, il valore viene convertito in double o float automaticamente ... double pippo = 4; // 4 è una costante intera System.out.println(pippo); // Stampa 4.0 4.0 è la rappresentazione di una costante a virgola mobile (cè il punto decimale) La conversione precedente viene eseguita automaticamente perché non comporta nessuna perdita di informazione (i numeri interi hanno i loro corrispondenti nei numeri a virgola mobile) Quando un assegnamento, invece, può provocare una perdita di informazione viene segnalato dal compilatore come errore Una errore di questo genere si ha, ad esempio, quando si tenta di assegnare un valore a virgola mobile ad una variabile intera int prova = 3.5; // Errore di // compilazione La bora torio di P rogra mma zione - Luca Te s e i Definite nella classe java.lang.Math come costanti e metodi static Pi greco: Math.PI Base dei logaritmi naturali: Math.E Radice quadrata: double radiceDi2 = Math.sqrt(2); Coseno: double cosenoDiPiGrecoMezzi = Math.cos(Math.PI / 2); Consultare le API per vedere tutte le altre funzioni disponibili 43 La bora torio di P rogra mma zione - Luca Te s e i 44 Conversioni esplicite Casting Per forzare il compilatore ad accettare lassegnamento (se si vuole accettare la perdita di informazione che ne deriva) si deve fare una conversione di tipo esplicita Questa operazione si chiama casting int prova = (int)3.5; // accettato Leffetto di questo casting è di buttare via la parte decimale del numero a virgola mobile e di assegnare a prova solo la parte intera 3 La bora torio di P rogra mma zione - Luca Te s e i 45 Il casting si può fare fra diversi tipi base Ogni volta che si fa si accetta la possibilità di perdere informazione Ad esempio, facendo un casting da double a float si potranno perdere alcune cifre significative Così come facendo un casting da int a short La bora torio di P rogra mma zione - Luca Te s e i 46 Casting Arrotondamenti Loperatore di casting (il tipo tra parentesi) lega più degli operatori aritmetici double total = 3.456; int prova = (int) total * 100; Esegue il casting su total e il valore di prova sarà 300 int prova = (int)(total * 100); Esegue il casting sul valore della moltiplicazione e il valore di prova sarà 345 Il casting da valori a virgola mobile a interi produce come risultato la parte intera del valore, anche se il valore è molto prossimo al valore intero successivo int prova = (int) 4.99; // prova vale 4 Per eseguire gli arrotondamenti secondo la regola usuale (se il primo decimale è da 0 a 4 si prende la parte intera, altrimenti la parte intera + 1) si può usare il metodo static Math.round (consultare le API: il valore restituito da Math.round è un long! Quindi bisogna fare un ulteriore casting se si vuole assegnare il risultato ad un int) La bora torio di P rogra mma zione - Luca Te s e i 47 La bora torio di P rogra mma zione - Luca Te s e i 48 Classi involucro Classe Integer Ognuno dei tipi base di Java ha una classe corrispondente nel pacchetto java.lang (consultare le API) Queste classi vengono dette classi involucro Gli oggetti di queste classi possono un valore del tipo base corrispondente La vera utilità sta nelle costanti e nei metodi statici che forniscono Prendiamo ad esempio la classe java.lang.Integer Un oggetto di questa classe può contenere un valore intero Tale valore non si trova in una variabile di frame come i soliti int Si trova nello heap allinterno delloggetto corrispondente Costanti static utili della classe: La bora torio di P rogra mma zione - Luca Te s e i 49 La bora torio di P rogra mma zione - Luca Te s e i Classe Integer 50 Classe Integer Metodi statici pubblici utili della classe Integer public static int parseInt(String s) Cerca di interpretare il contenuto della stringa s come la rappresentazione di una costante intera: • Integer.parseInt(“15”) restituisce lintero 15 La bora torio di P rogra mma zione - Luca Te s e i Integer.MIN_VALUE (minimo int rappresentabile) Integer.MAX_VALUE (massimo int rappresentabile) 51 Se la stringa contiene dei caratteri che non possono essere considerati la rappresentazione di un intero allora il metodo parseInt lancerà uneccezione Le eccezioni sono il meccanismo di base di Java per gestire gli errori Per adesso non gestiamo questa eccezione, vedremo più avanti come si fa Se uneccezione non viene gestita (il termine giusto sarebbe catturata) il programma termina con errore indicando quale eccezione si è verificata e la pila di attivazioni corrente (ci permette di risalire al punto preciso del programma in cui si è verificata) La bora torio di P rogra mma zione - Luca Te s e i 52 Esercizio Esercizio Riscrivere il costruttore della classe Purse in modo che chieda in input il numero di monete iniziali Aggiungere alla classe Purse un metodo che restituisca il totale in dollari e in penny (100 penny = 1 dollaro) (Suggerimento: usare la divisione intera e il resto della divisione intera) Scrivere una classe RisolutoreEquazione2Grado Il costruttore deve chiedere in input i coefficienti a, b, c dellequazione Implementare i due metodi per dare le due soluzioni: La bora torio di P rogra mma zione - Luca Te s e i 53 public double getFirstSolution() public double getSecondSolution() Scrivere una classe di test La bora torio di P rogra mma zione - Luca Te s e i Esercizio Esercizio contd Scrivere un programma che assista un cassiere nel dare il resto Input: sommaDaPagare e sommaRicevuta La differenza sommaRicevuta sommaDaPagare rappresenta il resto da dare Il resto deve essere corrisposto usando le seguenti banconote/monete: 1 dollaro, 1 Quarter, 1 Dimes, 1 Nickel, 1 Penny Il programma deve indicare quante monete di ogni tipo il cassiere deve dare --continuaà La bora torio di P rogra mma zione - Luca Te s e i 54 55 Il programma deve fornire una soluzione che corrisponda allerogazione del minimo numero possibile di banconote/monete Esempio Cassiere harry = new Cassiere(); harry.setSommaDaPagare(8.37); harry.riceve(10); int dollars = harry.returnDollars(); // Restituisce 1 int quarters = harry.returnQuarters(); // Restituisce 2 int dimes = harry.returnDimes(); // Restituisce 1 int nickels = harry.returnNickels(); // Restituisce 0 int pennies = harry.returnPennies(); // Restituisce 3 La bora torio di P rogra mma zione - Luca Te s e i 56 Esercizio Esercizio Scrivere un programma che legge un numero intero e poi stampa le sue cifre, una ad una, in ordine inverso Scrivere un programma che calcoli la data della domenica di Pasqua, che è la prima domenica dopo la prima luna piena di primavera, di un qualunque anno. Esempio: se leggo 78349 Deve stampare Si usi il seguente algoritmo ideato da Carl Friedrich Gauss nel 1800: Sia y lanno (1800, 2001, ...) 9 4 Dividi y per 19 ottenendo il resto a. Ignora il quoziente 3 Dividi y per 100 ottenendo il quoziente b e il resto c 8 Continua à 7 La bora torio di P rogra mma zione - Luca Te s e i 57 La bora torio di P rogra mma zione - Luca Te s e i Esercizio contd Dividi b per 4 ottenendo quoziente d e resto e Dividi 8 * b + 13 per 25 ottenendo il quoziente g. Ignora il resto. Dividi 19 * a + b - d - g + 15 per 30 ottenendo il resto h. Ignora il quoziente. Esercizio contd Dividi c per 4 , ottenendo il quoziente j e il resto k Dividi a + 11 * h per 319, ottenendo il quoziente m. Ignora il resto Continua à La bora torio di P rogra mma zione - Luca Te s e i 58 59 Dividi 2 * e + 2 * j - k - h + m + 32 per 7 ottenendo il resto r. Ignora il quoziente Dividi h - m + r + 90 per 25, ottenendo il quoziente n. Ignora il resto Dividi h - m + r + n + 19 per 32 ottenendo il resto p. Ignora il quoziente Pasqua cade il giorno p del mese n Scrivere una classe Year con metodi getEasterDay() e getEasterMonth() La bora torio di P rogra mma zione - Luca Te s e i 60