[IAN] Re: Velikonoce
Michal SVANDA
svanda na asu....cz
Neděle Duben 20 20:39:51 CEST 2003
Zdravim.
Domnivam se, ze o algoritmu vypoctu Velikonoc neni mnoho co diskutovat, ten
je proste dany a basta.
Pro vypocet se da pomerne uspesne pouzit tzv. Gaussuv algoritmus. Kdysi jsem
mel zapoctovy program se zadanim: "Sestavte program, ktery vypocita datum
velikonocni nedele o roku 1800 do roku 2199, prehledne je vypise a zjisti
cetnost vyskytu Velikonoc v jednotlivych dnech, v nichz mohou nastavat a
zjisti, kdy naposledy nastaly Velikonoce 22.3.".
Zdrojovy kod (Fortran 77) pridavam v priloze, je komentovany, takze z nej
snad bude patrne i ono Gaussovo pravidlo.
Michal
> spise bych v tomto mail-listu uvital debatu treba na thema jak se
> spocitaji Velikonoce - tedy jejich datum.
--
~ Michal SVANDA
'v' Email: svanda na asu....cz, michal na matfyz...
// \\ Homepage: http://www.asu.cas.cz/~svanda
/( )\ ICQ: 56160132
^'^ GSM: +420 605 577166
------------- další část ---------------
PROGRAM Velikonoce
c 8.4.2002 Michal Svanda (svanda na asu.cas.cz)
INTEGER d(1800:2199),m(1800:2199),cetnost(20:56), c, y, a, b,
& vd, rok
rok=0
do i=20,56
cetnost(i)=0
enddo
c naplni se dve pole, m a d, obe obsahuji mesic a den velikonocni nedele,
c index je informace o roce
c datum Velikonoc se pocita Gaussovym pravidlem
do y=1800,2199
C=Y/100
N=Y-19*(Y/19)
K=(C-17)/25
A=C-C/4-(C-K)/3+19*N+15
A=A-30*(A/30)
A=A-(A/28)*(1-(A/28)*(29/(A+1))*((21-N)/11))
B=Y+Y/4+A+2-C+C/4
B=B-7*(B/7)
L=A-B
M(y)=3+(L+40)/44
D(y)=L+28-31*(M(y)/4)
if(m(y).eq.3) then
vd=d(y)
else
vd=d(y)+31
endif
c Soucasne se pocita cetnost vyskytu Velikonoc v jednotlivych dnech,
c pro tento ucel je potreba prevest vse na pouzitelne hodnoty, takze
c udaje 20-31 jsou primo dny mesice brezna a 32-56 jsou dny mesice
c dubna zvetsene o 31
cetnost(vd)=cetnost(vd)+1
c sleduje se posledni vyskyt Velikonoc 22.3.
if((m(y).eq.3).and.(d(y).eq.22)) rok=y
enddo
c Vypis datumu Velikonoc, po deseti na radku, prvni ve sloupci je rok
do y=1800,2199,10
write(*,20) y,(d(y+i),m(y+i), i=0,9)
20 format(1x,i4, 10(3x,i2,'.',i1))
enddo
write(*,*)
c Vykresluje histogram (textove)
c nejprve odshora hodnoty (sloupce)...
do i=1, 20
write(*,98) 21-i
98 format(1x,i2,2x,$)
do j=20,56
if(cetnost(j).ge.(21-i)) then
write(*,99) '*'
else
write(*,99) ' '
endif
99 format(a2,$)
enddo
write(*,*)
enddo
c ... a pak take popiska
write(*,97) '|','|','|','|'
97 format(1x,3x,4(a1,19x))
write(*,96) '20.3.','30.3.','9.4. ','19.4.'
96 format(1x,3x, 4(a5,15x))
c A nakonec informace o tom, kdy byly naposledy Velikonoce 22.3.
write(*,*)
if(rok.ne.0) then
write(*,95) rok
95 format(1x/,' Velikonoce nastaly 22.3. naposledy v roce ',i4)
else
write(*,*) ' Velikonoce v intervalu sledovanych let 22.3.',
& 'nikdy nenastaly'
endif
END
More information about the Ian
mailing list