Quando arriva Pasqua? Calcolare la Pasqua in C – Guida e funzioni

In vista del mese pasquale mi è venuta voglia di imparare, dopo tanti anni, come calcolare questa domenica festiva per tutti i cristiani.

Prima di tutto bisogna documentarsi un po sulla matematica che c’è dietro…quindi sono arrivato sulla pagina di Wikipedia in cui è illustrato l’intero calcolo della Pasqua.

Sopratutto vorrei riportarvi la parte della formula, quella che a noi interessa:

Questo algoritmo, sviluppato dal matematico tedesco Carl Friedrich Gauss, scoperto nel 1800[1][2] a parte un passaggio corretto da Gauss stesso nel 1816.[3], dà direttamente la data della Pasqua.
L’anno di cui si calcola la Pasqua sia contrassegnato da Y; mod è l’operatore modulo che restituisce il resto della divisione fra numeri interi (ad esempio, 13 mod 5 = 3 perché 13 diviso 5 fa 2 con resto 3).
Si calcolano dapprima a, b e c nel seguente modo:
a = Y mod 19
b = Y mod 4
c = Y mod 7
Poi si calcolano
d = (19a + M) mod 30
e = (2b + 4c + 6d + N) mod 7
Secondo il calendario giuliano si deve usare M = 15 e N = 6, mentre per il calendario gregoriano i valori di M and N variano a seconda degli anni considerati, secondo la seguente tabella:

Anni M N
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
2400-2499 25 1

Se (d + e) < 10, allora la Pasqua cade il giorno (d + e + 22) del mese di marzo, altrimenti si verificherà il (d + e − 9)-esimo giorno del mese di aprile.
Si tenga tuttavia conto delle seguenti eccezioni:
Se la data risultante dalla formula è il 26 aprile, allora la Pasqua cadrà il giorno 19 aprile;
Se la data risultante dalla formula è il 25 aprile e contemporaneamente d = 28, e = 6 e a > 10, allora la Pasqua cadrà il 18 aprile.

Una volta stabilita la tabella e le regole andiamo a tradurre il tutto in puro linguaggio C.

[box type="tick" size="large" border="full"]Codice migliorato[/box]
[code lang="c"]
/*
 Anni M N
 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
 2400-2499 25 1
 */
#include <stdio.h>
#include <stdlib.h> /*atoi()*/

#define M 24
#define N 5
int main(int argc, char *argv[]){
    if (argc < 2){
        printf("Manca l'anno.\n");
        return 0;
    }
    int anno=atoi(argv[1]);
    int a = anno % 19;
    int b = anno % 4;
    int c = anno % 7;

    int d=(19*a+M)%30;
    int e=(2*b+4*c+6*d+N)%7;
    int giornoPasqua;
    char *mese;

    if ((d+e)<10) {
        giornoPasqua=(d+e+22);
        mese="marzo";
    }
    else {
        giornoPasqua=(d+e-9);
        mese="aprile";
    }

    //eccezioni

    if (giornoPasqua == 26) {
        giornoPasqua=19;
        mese="aprile";
    }
    else if (giornoPasqua==25 && d==28 && e==6 && a>10) {
        giornoPasqua=18;
        mese="aprile";
    }

    printf("Pasqua: Domenica, %i %s\n",giornoPasqua,mese);
    return 0;
}
[/code]



download codice sorgente