Il giorno di pasqua in C

hello_world

Quante volte è capitato di dover generare un calendario o controllare delle date ed abbiamo avuto bisogno di sapere quale fosse il giorno di pasqua di un particolare anno?

E’ possibile calcolarlo con precisione attraverso un semplice ma efficace algoritmo scritto in C, che presentiamo qui di seguito:

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
* pasqua
* ------
* Questa funzione ritorna il mese ed il giorno di Pasqua dell'anno passato come parametro
*
*
* PARAMETRI: aaaa = anno in cui si ricerca (formato aaaa)
* *mm = puntatore alla variabile dove sarà restituito il mese
* *gg = puntatore alla variabile dove sarà restituito il giorno
*
*
* RITORNO: void
*
*/


void pasqua(short aaaa, short *mm, short *gg)
{
short gm[] = {22, 22, 23, 23, 24, 24};
short da[] = {2, 2, 3, 4, 5, 5};
short a, b, c, d, e, i;a = aaaa % 19;

b = aaaa % 4;
c = aaaa % 7;
i = (int) (aaaa / 100) - 15;
d = (19 * a + gm[i]) % 30;
e = (2 * b + 4 * c + 6 * d + da[i]) % 7;

*gg = 22 + d + e;
*mm = 3;
if (*gg > 31)
{
*mm = 4;
*gg -= 31;
}
}

int main (int argc, void **argv)
{

short anno, mese, giorno;
// imposto l'anno
anno = 2012;

pasqua(anno, &mese, &giorno);
printf("Pasqua %04u è il giorno %u del mese %u\n", anno, mese, giorno);

return 0;
}

L’algoritmo come si nota è velocissimo essendo la sua complessità lineare in quanto non ci sono cicli annidati ma si limita ad una serie di operazioni aritmetiche per determinare con esattezza matematica il giorno ed il mese in cui cade il giorno di Pasqua corrispondenti all’anno scelto.

Il codice è semplicissimo da usare e non ha bisogno di ulteriori commenti data la sua chiarezza.
Potete eseguire il download del codice sorgente alla pagina solo codice raggiungibile a questo indirizzo:

http://www.alfonsoprisco.com/wordpress/codice-in-full-immersion/

Per qualsiasi domanda o commento scriveteci pure.

a presto

Share Button
Pin It

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *