Ci sono almeno due algoritmi con cui - chi prima, chi poi - tutti ci siamo trovati a doverci confrontare:
- Il calcolo del codice fiscale,
- il calcolo del Lunedì di Pasqua
Sul primo si è scritto molto, ed io stesso ho contribuito ad aumentare le pagine ad esso dedicato pubblicando su Visual Basic & .NET Journal l'articolo "Calcolo del codice fiscale in VB6" nei primi mesi del 2004.
Sulla Pasqua, invece, si trovano molti meno esempi ed articoli, tantè che spesso si tende ad inserire nei propri programmi un elenco dei giorni di Pasqua dei successivi 20 anni senza implmentare alcun algoritmo di calcolo.
Provo a colmare questa lacuna, anche se - come si vedrà - l'algoritmo risulta essere parecchio empirico e richiede "aggiustamenti" per poter funzionare correttamente.
In generale diciamo che
- Il giorno di Pasqua (e di conseguenza il Lunedì di Pasqua) cade nella prima Domenica che succede al plenilunio immediatamente successivo all'equinozio di primavera.
- per ragioni astronomiche la data può variare tra il 22 di Marzo ed il 25 di Aprile
Il calcolo si basa su tre variabili, due delle quali sono il risultato di una tabella compilata a priori e statica che ha lo scopo di "aggiustare" il calcolo, la terza è l'anno del quale si vuole conoscere la data del giorno di Pasqua.
| 1583-1699 |
22 |
2 |
| 1700-1799 |
23 |
3 |
| 1800-1899 |
23 |
4 |
| 1900-2099 |
24 |
5 |
| 2100-2199 |
24 |
6 |
| 2200-2299 |
25 |
0 |
| 2300-2399 |
26 |
1 |
Possedendo i dati di questa tabella, è sufficiente eseguire cinque divisioni e considerare i loro resti per ottenere il risultato.desiderato. Come si vede dall'esempio che riporto di seguito, il risultato è un numero che può essere superiore o inferiore a 31. Se è inferiore a 31, allora si considera quel numero come il giorno del mese di Marzo, in caso contrario, si sottre 31 e si considera come mese Aprile.
Riporto qui di seguito una stored procedure per SQL server che realizza tale algoritmo.
CREATE PROCEDURE GetPasqua ( @Anno INT, @Pasqua DATETIME OUTPUT) AS DECLARE @T1 INT DECLARE @T2 INT DECLARE @T3 INT DECLARE @T4 INT DECLARE @T5 INT DECLARE @Var1 INT DECLARE @Var2 INT DECLARE @NumGG INT
SET @T1 = 0 SET @T2 = 0 SET @T3 = 0 SET @T4 = 0 SET @T5 = 0
IF @Anno < 1900 OR @Anno > 2199 BEGIN RAISERROR ('La procedura gestisce solo le date comprese tra il 1500 ed il 2199', 16, 1) END
IF @Anno >= 1900 AND @Anno <= 2099 BEGIN SET @Var1 = 24 SET @Var2 = 5 END IF @Anno >= 2100 AND @Anno <= 2199 BEGIN SET @Var1 = 24 SET @Var2 = 6 END
SET @T1 = @Anno % 19 SET @T2 = @Anno % 4 SET @T3 = @Anno % 7 SET @T4 = ((19 * @T1) + @Var1) % 30 SET @T5 = ((2 * @T2) + (4 * @T3) + (6 * @T4) + @Var2) % 7
SET @NumGG = 22 + @T4 + @T5
IF @NumGG <= 31 BEGIN SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '03' + RIGHT('0' + CAST(@NumGG AS VARCHAR(2)), 2) AS DATETIME) END ELSE BEGIN SET @NumGG = @NumGG - 31 SET @Pasqua = CAST(CAST(@Anno AS VARCHAR(4)) + '04' + RIGHT('0' + CAST(@NumGG AS VARCHAR(2)), 2) AS DATETIME) END
RETURN(0)
|
Lascio a voi l'esercizio di realizzare la stessa procedura con altri linguaggi di programmazione...Buon divertimento!