Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пасха 
V
    Опции темы
Сый
Дата 12.4.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Поделитесь, пожалуйста, алгоритмом вычисления даты Православной Пасхи.
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Kuber
Дата 12.4.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 7.4.2006
Где: #vingrad

Репутация: нет
Всего: 3



Код

function TtheCalendar.CalcEaster:String;
var B,D,E,Q:Integer;

GF:String;
begin

B:=225-11*(Year Mod 19);
D:=((B-21)Mod 30)+21;
If D>48 then Dec(D);
E:=(Year+(Year Div 4)+D+1)Mod 7;
Q:=D+7-E;
If Q<32 then begin
If ShortDateFormat[1]='d' then
Result:=IntToStr(Q)+'/3/'+IntToStr(Year)

else Result:='3/'+IntToStr(Q)+'/'+IntToStr(Year);
end
else begin
If ShortDateFormat[1]='d' then
Result:=IntToStr(Q-31)+'/4/'+IntToStr(Year)

else Result:='4/'+IntToStr(Q-31)+'/'+IntToStr(Year);
end;
{вычисление страстной пятницы}
If Q<32 then begin
If ShortDateFormat[1]='d' then GF:=IntToStr(Q-2)+'/3/'+IntToStr(Year)
else GF:='3/'+IntToStr(Q-2)+'/'+IntToStr(Year);
end
else begin
If ShortDateFormat[1]='d' then
GF:=IntToStr(Q-31-2)+'/4/'+IntToStr(Year)

else GF:='4/'+IntToStr(Q-31-2)+'/'+IntToStr(Year);
end;

end; 


Вот пожалуйста. Взято из F.A.Q - Kuliba
--------------------
Если меня угораздило написать что то умное и вам понравилось, то не забудте нажать [-]...:)    
PM ICQ   Вверх
Сый
Дата 13.4.2006, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Спасибо.
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 13.4.2006, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Только, по-моему, это алгоритм вычисления Католической Пасхи...
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Kuber
Дата 13.4.2006, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 7.4.2006
Где: #vingrad

Репутация: нет
Всего: 3



Код

function Easter(Year: Integer): TDateTime;

var
  nMonth, nDay, nMoon, nEpact, nSunday,
    nGold, nCent, nCorx, nCorz: Integer;
begin
  { Номер Золотого Года в 19-летнем Metonic-цикле: }
  nGold := (Year mod 19) + 1;
  { Вычисляем столетие: }
  nCent := (Year div 100) + 1;
  { Количество лет, в течение которых отслеживаются високосные года... }
  { для синхронизации с движением солнца: }
  nCorx := (3 * nCent) div 4 - 12;
  { Специальная коррекция для синхронизации Пасхи с орбитой луны: }
  nCorz := (8 * nCent + 5) div 25 - 5;
  { Находим воскресенье: }
  nSunday := (Longint(5) * Year) div 4 - nCorx - 10;
  { ^ Предохраняем переполнение года за отметку 6554}
  { Устанавливаем Epact - определяем момент полной луны: }
  nEpact := (11 * nGold + 20 + nCorz - nCorx) mod 30;
  if nEpact < 0 then
    nEpact := nEpact + 30;
  if ((nEpact = 25) and (nGold > 11)) or (nEpact = 24) then
    nEpact := nEpact + 1;
  { Ищем полную луну: }
  nMoon := 44 - nEpact;
  if nMoon < 21 then
    nMoon := nMoon + 30;
  { Позиционируем на воскресенье: }
  nMoon := nMoon + 7 - ((nSunday + nMoon) mod 7);
  if nMoon > l 31 then
  begin
    nMonth := 4;
    nDay := nMoon - 31;
  end
  else
  begin
    nMonth := 3;
    nDay := nMoon;
  end;
  Easter := EncodeDate(Year, nMonth, nDay);
end; {Easter}


Попробуй этот. К сожалению у меня нет Delphi, чтобы проверить.
Взято из DW6.
--------------------
Если меня угораздило написать что то умное и вам понравилось, то не забудте нажать [-]...:)    
PM ICQ   Вверх
Сый
Дата 13.4.2006, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Вот алгоритм для вычисления даты Католической Пасхи:
Код

ЗАДАЧА Католическая();
ПЕР
  G, C, X, Z, D, E, N: ЦЕЛ;
УКАЗ
  G := (Год ОСТАТОК 19) + 1;
  C := (Год ДЕЛИТЬ 100) + 1;
  X := ((3*C) ДЕЛИТЬ 4) - 12;
  Z := (((8*C) + 5) ДЕЛИТЬ 25) - 5;
  D := ((5*Год) ДЕЛИТЬ 4) - X - 10;
  E := ((11*G) + 20 + Z - X) ОСТАТОК 30;
  ЕСЛИ (E = 24) ИЛИ ((E = 25) И (G > 11)) ТО УВЕЛИЧИТЬ(E) КОН;
  N := 44 - E;
  ЕСЛИ N < 21 ТО УВЕЛИЧИТЬ(N, 30) КОН;
  N := N + 7 - ((D + N) ОСТАТОК 7);
  ЕСЛИ N > 31 ТО Вывод.ЧЦел("Дата Католической Пасхи: %d апреля.^", N - 31, 0, 0, 0)
  ИНАЧЕ Вывод.ЧЦел("Дата Католической Пасхи: %d марта.^", N, 0, 0, 0) КОН
КОН Католическая;

Впрочем, два предыдущих делают тоже самое. Нужно заметить, что Католическая Пасха приходится на март либо апрель. Православная же на апрель либо май. А отличаются тем, что Православная считается по старому стилю (+13 дней (после 2100 - +14)).
Насчёт предыдущего алгоритма:
> nMonth := 4;
> nMonth := 3;
Март, апрель...
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 18.4.2006, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Вобщем, вся задача сводится к тому, чтобы найти, куда прибавить эти 13 дней. Но что-то пока найти у меня это не получилось. Православная Пасха приходится на период с 4 апреля по 8 мая. 
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
Сый
Дата 20.4.2006, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 23.1.2006

Репутация: 2
Всего: 3



Нашёл алгоритм на JavaScript'е:
Код
var arDates = new Array (
    new Array ("Прощённое воскресение",-48),
    new Array ("Начало Великого поста",-47),
    new Array ("Вербное воскресение",-7),
    new Array ("Воскресение Господне - ПАСХА",0),
    new Array ("Вознесение Господне",39),
    new Array ("Троица. Пятидесятница",49),
    new Array ("Начало Петрова поста",57)
    
)
function writeElements (frm) {
    for (i=0;i < arDates.length;i++) {
        document.writeln("<tr><td>"+arDates[i][0]+"</td><td><input type=text size=15></td><td><input size=3 value="+arDates[i][1]+"></td></tr>");
    }
}
function getPDate(frm) {
    var startElement = 3;
    var dDate = parseInt(frm.dt.value,10);
    var old = (frm.sel.options[frm.sel.selectedIndex].value=="0") ? true : false;
//    var century = ((dDate%100) == 0 ) ? Math.floor(dDate/100) : (Math.floor(dDate/100)+1);
    var century =  Math.floor(dDate/100)+1;
    var offset = (old ) ? 0 : (century - Math.floor ((century - 1)/4) - 3) ;
    var bis = ((dDate%4) == 0 ) ? true : false;
    if ((old == false) && ((dDate%100) == 0) && ((dDate%400)!=0)) {bis = false;}
    var a,b,c,d,e;
    var x=15, y=6;
    var dm,dd;
    a=dDate%19;
    b=dDate%4;
    c=dDate%7;
    d=(19*a+x)%30;
    e=(2*b+4*c+6*d+y)%7;
    if ((d+e) >= 10) {dm=3; dd=d+e-9;} 
    else {dm = 2;dd = 22+d+e;}
    dDate = (bis) ? 2000 : 2001;
    var pDate = new Date(dDate,dm,dd);
    var lDate;
    for (i=0;i<arDates.length;i++) {
        l = Date.parse(pDate) + 24*60*60*1000*(offset+arDates[i][1]);
        lDate = new Date(l);
        frm.elements[i*2+startElement].value=retDateString(lDate,old,dDate);
    }
}
function retDateString(tDate,old,year){
var    arMonth = new Array ("января","февраля","марта","апреля","мая","июня","июля","августа","сентября","октября","ноября","декабря");
var ld = tDate.getDate();
var lm = tDate.getMonth();
if (old && ((year%100) == 0) && ((year%400) != 0)) {
    if (ld > 31) { ld = 1; lm = 3; }
    else {ld++;}
}

return (""+ld+" "+arMonth[lm]);
}

Рабочий скрипт можно протестировать тут: http://rus.jino-net.ru/k/psh.htm  

Это сообщение отредактировал(а) Сый - 29.4.2006, 17:57
--------------------
 Язык программирования, родственный языкам Паскаль и Оберон, использующий русские служебные слова - Глагол: http://glagol.nad.ru 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.