[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