Показать сообщение отдельно
Старый 25.02.2012, 11:58   #1 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию Определение даты Пасхи

Осуществил, наконец, давнюю задумку: составил программу расчета даты Пасхи в любом году. Определяются даты Православной (Orthodox), католической (Catholic) и еврейской (Jewish) Пасхи.
Очень это оказалось непростым делом: алгоритмов выложено много, но далеко не все правильные, многие с ошибками, а с учетом того, что создатели сайтов имеют обыкновение бездумно друг у друга копировать, то, сами понимаете... Ну вроде отладил. Если кому интересно, прошу протестировать и, буде ошибки вылезут, о том сообщить.
Ниже выложен исходник на Паскале и экзешник для DOS-моды. Если бы кто из Дельфийцев сделал из этого путный исполняемый файл под Windows, было бы совсем хорошо. Но это так, если есть желание.
Код:
Var
 Y,a,b,c,d,e,f,g,h,i,k,L,m,n,p,A1,M1,Date:LongInt;
 Month:String;
 Ksi,m2:Real;
Begin
 Write('Year = ');
 Readln(Y);
 Writeln;
 a:=(19*(Y mod 19)+15) mod 30;
 b:=(2*(Y mod 4)+4*(Y mod 7)+6*a+6) mod 7;
 If (a+b)>=10 then
  begin
   If a+b-9+13<31 then
    begin
     Month:='April';
     Date:=a+b-9+13;
    end
   else
    begin
     Month:='May';
     Date:=a+b-9+13-30;
    end;
  end
 else
  begin
   Month:='April';
   Date:=22+a+b+13-31;
  end;
 Writeln('Orthodox:');
 Writeln(Date:2,' of '+Month);
 Writeln;
 a:=Y mod 19;
 b:=Y div 100;
 c:=Y mod 100;
 d:=b div 4;
 e:=b mod 4;
 f:=(b+8) div 25;
 g:=(b-f+1) div 3;
 h:=(19*a+b-d-g+15) mod 30;
 i:=c div 4;
 k:=c mod 4;
 L:=(32+2*e+2*i-h-k) mod 7;
 m:=(a+11*h+22*L) div 451;
 n:=(h+L-7*m+114) div 31;
 p:=(h+L-7*m+114) mod 31;
 If n=3 then Month:='March' else Month:='April';
 Date:=p+1;
 Writeln('Catholic:');
 Writeln(Date:2,' of '+Month);
 Writeln;
 A1:=Y+3760;
 a:=(12*A1+17) mod 19;
 b:=A1 mod 4;
 Ksi:=32.0440933+1.5542418*a+0.25*b-0.00317779*A1;
 M1:=Trunc(Ksi);
 m2:=Ksi-1.0*M1;
 c:=(M1+3*A1+5*b+5) mod 7;
 If (c=1) and (a>b) and (m2>=0.63287037) then
  Date:=M1+1
 else
 If (c=2) or (c=4) or (c=6) or
 ((c=0) and (a>11) and (m2>=0.89772376)) then
  Date:=M1+1
 else Date:=M1;
 Inc(Date,13);
 If Date>31 then
  begin
   Month:='April';
   Dec(Date,31);
  end else Month:='March';
 Writeln('Jewish:');
 Writeln(Date:2,' of '+Month);
 Readln;
End.
Вложения
Тип файла: zip easter.zip (40.2 Кб, 55 просмотров)
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070