|
(******************************************************************************)
(**) ОТДЕЛ Дата;
(******************************************************************************)
(* НАЗНАЧЕНИЕ: работа с календарём *)
(******************************************************************************)
ВИД
Вид- = НАБОР
день,месяц,год:ЦЕЛ
КОН;
(******************************************************************************
* Переводит дату в число дней, прошедших от начала 1 года н. э. (числовое
* представление даты)
******************************************************************************)
ЗАДАЧА ВЧисло-(дата-:Вид):ЦЕЛ;
ПЕР
y,m,n:ЦЕЛ;
УКАЗ
y:=дата.год;
m:=дата.месяц -3;
ЕСЛИ m < 0 ТО
УВЕЛИЧИТЬ(m,12);
УМЕНЬШИТЬ(y)
КОН;
n:=(y*1461 ДЕЛИТЬ 4) + ((m*153+2) ДЕЛИТЬ 5) + дата.день - 306;
ЕСЛИ n > 577737 ТО
n:=n - ((y ДЕЛИТЬ 100)*3 - 5) ДЕЛИТЬ 4
КОН;
ВОЗВРАТ n
КОН ВЧисло;
(******************************************************************************
* Переводит число дней, прошедших от начала 1 года н.э. в дату
******************************************************************************)
ЗАДАЧА ИзЧисла-(n:ЦЕЛ; дата+:Вид);
ПЕР
c,y,m:ЦЕЛ;
УКАЗ
ЕСЛИ n > 577737 ТО
n:=n*4 +1215;
c:=n ДЕЛИТЬ 146097;
n:=n ОСТАТОК 146097 ДЕЛИТЬ 4
ИНАЧЕ
n:=n +305;
c:=0
КОН;
n:=n*4 +3;
y:=n ДЕЛИТЬ 1461;
n:=n ОСТАТОК 1461 ДЕЛИТЬ 4;
n:=n*5 +2;
m:=n ДЕЛИТЬ 153;
n:=n ОСТАТОК 153 ДЕЛИТЬ 5;
ЕСЛИ m > 9 ТО
m:=m -12;
УВЕЛИЧИТЬ(y)
КОН;
дата.год:=100*c + y;
дата.месяц:=m +3;
дата.день:=n +1
КОН ИзЧисла;
(******************************************************************************
* Вычисляет, является ли год високосным
******************************************************************************)
ЗАДАЧА Високосный-(год:ЦЕЛ):КЛЮЧ;
УКАЗ
ВОЗВРАТ ((год ОСТАТОК 4 = 0) И (год ОСТАТОК 100 # 0)) ИЛИ (год ОСТАТОК 400 = 0)
КОН Високосный;
(******************************************************************************
* Возвращает число дней в указаном месяце данного года
******************************************************************************)
ЗАДАЧА ДнейВМесяце-(месяц,год:ЦЕЛ):ЦЕЛ;
ПЕР
дней:ЦЕЛ;
УКАЗ
ВЫБРАТЬ месяц ИЗ
| 1: дней:=31
| 2: ЕСЛИ Високосный(год) ТО дней:=29 ИНАЧЕ дней:=28 КОН
| 3: дней:=31
| 4: дней:=30
| 5: дней:=31
| 6: дней:=30
| 7: дней:=31
| 8: дней:=31
| 9: дней:=30
| 10: дней:=31
| 11: дней:=30
| 12: дней:=31
ИНАЧЕ
дней:=0
КОН;
ВОЗВРАТ дней
КОН ДнейВМесяце;
(******************************************************************************
* Возвращает число дней, которое необходимо прибавить к дате, чтобы перевести её
* из даты Григорианского календаря в дату Юлианского календаря (старый стиль),
* используя числовое представление текущей даты
******************************************************************************)
ЗАДАЧА СтарыйСтиль-(n:ЦЕЛ):ЦЕЛ;
ПЕР
век:ЦЕЛ;
УКАЗ
век:=(n ДЕЛИТЬ 146097)*4 + ((n ОСТАТОК 146097) ДЕЛИТЬ 36524) +1;
ВОЗВРАТ век - ((век-1) ДЕЛИТЬ 4) -3
КОН СтарыйСтиль;
(******************************************************************************
* Возвращает номер текущего дня недели (1-понедельник, ..., 7-воскресенье),
* используя числовое представление текущей даты
******************************************************************************)
ЗАДАЧА ДеньНедели-(дата-:Вид):ЦЕЛ;
ПЕР
c:ЦЕЛ;
УКАЗ
ЕСЛИ дата.месяц < 3 ТО c:=1 ИНАЧЕ c:=0 КОН;
ВОЗВРАТ (
(
3*дата.год -
(7*(дата.год + (дата.месяц+9) ДЕЛИТЬ 12)) ДЕЛИТЬ 4 +
(23*дата.месяц) ДЕЛИТЬ 9 +
дата.день + 2 + ((((дата.год-c) ДЕЛИТЬ 100) +1)*3 ДЕЛИТЬ 4) -16
) ОСТАТОК 7
) +1
КОН ДеньНедели;
ЗАДАЧА ПравославнаяПасха-(год:ЦЕЛ):ЦЕЛ;
ПЕР
a,b,число:ЦЕЛ;
дата:Вид;
УКАЗ
a:=(19*(год ОСТАТОК 19) + 15) ОСТАТОК 30;
b:=a + (2*(год ОСТАТОК 4) + 4*(год ОСТАТОК 7) + 6*a + 6) ОСТАТОК 7;
дата.год:=год;
дата.месяц:=(b+25) ДЕЛИТЬ 35 +3;
дата.день:=b + 22 - 31*(дата.месяц ДЕЛИТЬ 4);
число:=ВЧисло(дата);
ВОЗВРАТ число + СтарыйСтиль(число)
КОН ПравославнаяПасха;
КОН Дата.
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|