Newsgroup: it.comp.lang.visual-basic
Titolo: [!] Giorno di Pasqua

Ciao e grazie mille sin da ora.
Ciao, la prossima volta per favore evita l'HTML, ti incollo qui la risposta
data da G.Paolo Bizzaro - 
g...@rsadvnet.NOSPAM.it
 a dicembre del 97.
*** INIZIO ****
Il metodo è pubblicato a pagina 27 del libro di Jean Meeus "Astronomia con
il computer - Formule, metodi di calcolo, esempi numerici" - ed.Hoepli -
(Lire 25000 nel 1990 - libro molto interessante - titolo originale
dell'opera "Astronomical Formulæ for Calculators" ) ove si dice, a proposito
del calcolo della data di Pasqua:
----------------------------------------------------------------------------
----
«Il metodo qui descritto è stato pubblicato da Spencer Jones nel suo libro
General Astronomy (pagg.73-74 dell'edizione del 1922). È stato ripubblicato
nel Journal of the British Astronomical Association, vol.88, pag.91
(dicembre 1977), dove si dice che fu sviluppato nel 1876 e che comparve
nell'Ecclesiastic Calendar di Butcher.
A differenza della formula data da Gauss, questo metodo non ha eccezioni ed
è valido per tutti gli anni nel Calendario Gregoriano, ossia dal 1583 in
poi. La procedura per determinare la data della Pasqua à la seguente:
dividere per quoziente resto
l'anno x 19 - a
l'anno x 100 b c
b 4 d e
b+8 25 f -
b-f+1 3 g -
19a+b-d-g+15 30 - h
c 4 i k
32+2e+2i-h-k 7 - l
a+11h-22l 451 m -
h+l-7m+114 31 n p
Allora n = numero del mese (3=marzo, 4=aprile)
p+1 = giorno del mese in cui cade la domenica di Pasqua
(...omissis...)
Le date estreme della Pasqua sono Marzo 22 (come nel 1818 e nel 2285) ed
Aprile 25 (come nel 1886, nel 1943 e nel 2038)»
----------------------------------------------------------------------------
----
E per i più pigri, ecco l'algoritmo che:
- Butcher ha pubblicato nel 1876 in "Ecclesiastic Calendar",
- Spencer Jones ha ri-pubblicato nel 1922 in "General Astronomy"
- è stato nuovamente ri-ri-pubblicato nel 1977 in "Journal of the British
Astronomical Association"
- Jean Meeus ha ri-ri-ri-pubblicato nel 1979 in "Astronomical Formulæ for
Calculators"
- G.Paolo Bizzaro ha convertito in VB ed inviato a
it.comp.lang.visual-basic" martedì 16 dicembre 1997
sperando che non ve lo rivendiate come farina del vostro sacco!
Public Function PasquaGregoriana(anno%) As Date
a% = anno% Mod 19
b% = anno% \ 100: c% = anno% Mod 100
d% = b% \ 4: e% = b% Mod 4
f% = (b% + 8) \ 25
g% = (b% - f% + 1) \ 3
h% = (19 * a% + b - d - g + 15) Mod 30
i% = c% \ 4: k% = c% Mod 4
l% = (32 + e% + e% + i% + i% - h% - k%) Mod 7
m% = (a% + 11 * h% + 22 * l%) \ 451
m1% = (h% + l% - 7 * m% + 114)
mese% = m1% \ 31: giorno% = (m1% Mod 31) + 1
PasquaGregoriana = DateSerial(anno%, mese%, giorno%)
End Function
Oppure, se volete visualizzare correttamente date inferiori al 1º gennaio
1900, dato che DateSerial restituirebbe valori negativi:
Public Function PasquaGregorianaStringa$(anno%)
Dim strMese$(12)
strMese$(1) = "gennaio": strMese$(2) = "febbraio": strMese$(3) = "marzo"
strMese$(4) = "aprile": strMese$(5) = "": strMese$(6) = "giugno"
strMese$(7) = "luglio": strMese$(8) = "agosto": strMese$(9) = "settembre"
strMese$(10) = "ottobre": strMese$(11) = "": strMese$(12) = "dicembre"
a% = anno% Mod 19
b% = anno% \ 100: c% = anno% Mod 100
d% = b% \ 4: e% = b% Mod 4
f% = (b% + 8) \ 25
g% = (b% - f% + 1) \ 3
h% = (19 * a% + b - d - g + 15) Mod 30
i% = c% \ 4: k% = c% Mod 4
l% = (32 + e% + e% + i% + i% - h% - k%) Mod 7
m% = (a% + 11 * h% + 22 * l%) \ 451
m1% = (h% + l% - 7 * m% + 114)
mese% = m1% \ 31: giorno% = (m1% Mod 31) + 1
PasquaGregorianaStringa$ = CStr(giorno%) & " " & strMese$(mese%) & " " &
CStr(anno%)
End Function
Ho verificato l'algoritmo (so che non è ottimizzato né personalizzato per i
vostri comodi, mica farete fare tutto a me!) e funziona correttamente per i
citati anni "limite" 1818, 2285, 1886, 1943 e 2038, e anche per il 1997, per
gli altri anni non so dove verificare ma, visto l'autore ed il peso del
libro ove l'ho trovato, voglio fidarmi dell'algoritmo.
--
G.Paolo Bizzaro - 
g...@rsadvnet.NOSPAM.it
**** FINE *****
Ciao
--
Andrea :-{)
acm...@hotmail.com
================================================
Leggi 
http://beatles.cselt.it/news-it/FAQ.html
 e
http://beatles.cselt.it/news-it/gruppi-it.html
Potresti imparare qualcosa di piu' sui NG
================================================

End Function
Dato che Pasqua cade solo di marzo o aprile, alla funzione di sopra,
scritta al volo senza ottimizzazione, puoi togliere
Dim strMese$(12) e le quattro righe successive con i nomi dei mesi,
e sostituire la riga
  PasquaGregorianaStringa$ = CStr(giorno%) & " " & strMese$(mese%) _
   & " " & CStr(anno%)
con
  PasquaGregorianaStringa$ = CStr(giorno%)  _
   & iif(mese%=3," marzo "," aprile ") & CStr(anno%)
Anche se leggermente OT, se a qualcuno interessa l'algoritmo già pronto in
linguaggio C, lo posso postare qui.
Ciao
            gpb

 
Egregio G.Paolo, riesci ad inviarmi una versione funzionante dell'algoritmo in VB, con tanto di piccolo progetto per farla
andare.
Lo farei io, ma in questi giorni ho molto poco tempo, e vorrei mettere questo algoritmo sul Sito Comune (vedi in fondo), a
patto di avere il tuo consenso.
Saluti
-- 
Hi, Ciao
Ettore                 By -MES-
http://freeweb.aspide.it/freeweb/ilmes
Il sito comune di programmatori VB
http://members.xoom.com/it_lang_vb

linguaggio C, lo posso postare qui.
Ciao,
se hai l'algoritmo gia pronto in C mi interessa !! eventualmente
se non vuoi incorrere nell'ira funesta di alcuni me lo puoi postare ??
Grazie e Ciao
Roberto Corti
Amministratore di rete
rco...@NOSPAMtinet.ch
togliere NOSPAM per l'indirizzo

Ettore                 By -MES-
Purtroppo programmo con Access, ed ho quindi qualche problemino a creare un
progetto con il VB, che non ho installato neppure nella versione demo.
Comunque quando e come vuoi metti pure l'algoritmo nel sito comune
(veramente ottimo, già downloadato tutto!): non solo ti dò il consenso,
ma non ti nascondo che mi fa pure piacere.
Mi viene solo un dubbio (ti riscrivo l'algoritmo di seguito)
Public Function PasquaGregoriana(anno%) As Date
  a% = anno% Mod 19
  b% = anno% \ 100: c% = anno% Mod 100
  d% = b% \ 4: e% = b% Mod 4
  f% = (b% + 8) \ 25
  g% = (b% - f% + 1) \ 3
  h% = (19 * a% + b - d - g + 15) Mod 30
  i% = c% \ 4: k% = c% Mod 4
  l% = (32 + e% + e% + i% + i% - h% - k%) Mod 7
  m% = (a% + 11 * h% + 22 * l%) \ 451
  m1% = (h% + l% - 7 * m% + 114)
  mese% = m1% \ 31: giorno% = (m1% Mod 31) + 1
  PasquaGregoriana = DateSerial(anno%, mese%, giorno%)
End Function
Nel VBA di Access tale algoritmo funziona, ma in VB esistono le variabili
"Date" e la funzione "DateSerial"? Altrimenti sarebbe necessario modificarlo
opportunamente...
Per Roberto "Loba" Corti e per gli altri a cui può interessare segue il
listato di un brevissimo programmino con lo stesso algoritmo di cui sopra in
linguaggio C (scusate l'OT).
================================================
#include <stdio.h>
#include <stdlib.h>
// Restituisce il giorno della Pasqua Gregoriana passando
// come parametro l'anno. Se il numero restituito è <= 31,
// il mese è marzo, sennò è aprile ed il giorno esatto è: risultato-31
int PasquaGregoriana (int anno)
{
int a,b,c,d,e,f,g,h,i,k,l,m,n,mese,giorno;
a = anno % 19 ;
b = anno / 100 ;  c = anno % 100 ;
d = b / 4; e = b % 4 ;
f = (b + 8) / 25 ;
g = (b - f + 1) / 3 ;
h = (19 * a + b - d - g + 15) % 30 ;
i = c / 4 ; k = c % 4 ;
l = (32 + e + e + i + i - h - k) % 7 ;
m = (a + 11 * h + 22 * l) / 451 ;
n = (h + l - 7 * m + 114) ;
mese = n / 31 ; giorno = (n % 31) + 1 ;
return (mese==3 ? giorno : giorno+31 );
}
void StampaPasqua(int anno)
{
int giorno = PasquaGregoriana(anno) ;
printf ("%2i %s %i\n", (giorno<=31 ? giorno : giorno-31 ),
                        (giorno<=31 ? "mar" : "apr" ), anno);
}
int main(int argc,char **argv)
{
int i,giorno;
if (argc==1)
   for (i=1583;i<2583;i++)
     StampaPasqua(i);
else if (argc==3)
    for (i=atoi(argv[1]);i<=atoi(argv[2]);i++)
      StampaPasqua(i);
else
   for (i=1;i<argc;i++)
     StampaPasqua(atoi(argv[i]));
return 0;
}
================================================
Ciao
        Giampaolo