Страница 1 из 2
Разработать процедуры определения количества дней от рождест-ва Христова
Добавлено: 16 окт 2009, 17:29
erazer89
Разработать процедуры определения количества дней от рождест-ва Христова по текущий день в формате DD/MM/YYYY (с учетом високосных лет).
Подскажите как это реальзивать.
Re: Разработать процедуры определения количества дней от рождест-ва Христова
Добавлено: 20 окт 2009, 10:57
mc-black
Неправильно сформулированная задача, т.к. переход с Юлианского на Грирорианский календарь был значительно позже Рождества Христова, а именно 4 октября 1582 года, но в России переход на новый стиль был осуществлен еще позже.
Распределение високосных годов
* Каждый год, номер которого кратен 4 — високосный.
* Однако, каждый год кратный 100 — не високосный.
* Однако, каждый год кратный 400 все же високосный — 1600, 2000 и т.д.
Эти правила дают среднюю продолжительность года равной 365,2425
Вам для решения этой задачи нужно уметь вычислять кратность 4-м, 100 и 400 и делать сравнительно простое вычисление. На ассемблере прочтите подробно описание целочисленного деления div и все сразу станет понятно.
Re: Разработать процедуры определения количества дней от рождест-ва Христова
Добавлено: 20 окт 2009, 11:05
atavin-ta
" писал(а):Неправильно сформулированная задача, т.к. переход с Юлианского на Грирорианский календарь был значительно позже Рождества Христова, а именно 4 октября 1582 года, но в России переход на новый стиль был осуществлен еще позже.
Задача поставлена не неправильно, а просто не полно. Надо, например, так: "Разработать процедуры определения количества дней от рождест-ва Христова по текущий день в формате DD/MM/YYYY, с учетом високосных лет и того, что в первой версии календаря их ещё не было, дату коррекции календаря взять инностранную."
Re: Разработать процедуры определения количества дней от рождест-ва Христова
Добавлено: 20 окт 2009, 12:59
mc-black
Пример для 20.10.2009:
=(2009-1)*365+2009\4-2009\100+2009\400+(31+(28+0)+31+30+31+30+31+31+30)+20=733641
Пояснения:
'\' обратная косая черта - результат деления нацело без остатка
в скобках подсчитываем количество дней для целых месяцев по массиву количества дней в каждом месяце - для февраля берем 28 дней.
20 - день DD
(28+0) - поскольку 2009 - не високосный, иначе (28+1).
(2009-1), т.к. первый год считать не следует, первый год не был високосным.
-------------------
P.S. Примерно так, разве что на пару дней я мог немного ошибиться - требует перепроверки.
Re: Разработать процедуры определения количества дней от рождест-ва Христова
Добавлено: 20 окт 2009, 13:04
atavin-ta
" писал(а):Пример для 20.10.2009:
2009*365+2009\4-2009\100+2009\400+(31+(28+0)+31+30+31+30+31+31+30) +20
Пояснения:
'\' обратная косая черта - результат деления нацело без остатка
в скобках подсчитываем количество дней для целых месяцев по массиву количества дней в каждом месяце - для февраля берем 28 дней.
20 - день DD
(28+0) - поскольку 2009 - не високосный.
Разве? Надо ведь с рождества. А это даже не в прошлом тысячелетии.
Високосные года
Добавлено: 21 окт 2009, 15:51
BBB
mc-black писал(а):
Распределение високосных годов
* Каждый год, номер которого кратен 4 — високосный.
* Однако, каждый год кратный 100 — не високосный.
* Однако, каждый год кратный 400 все же високосный — 1600, 2000 и т.д.
Эти правила дают среднюю продолжительность года равной 365,2425
В библиотеке Object Pascal (модуль OpDate.pas) високосный год определялся как:
Код: Выделить всё
function IsLeapYear(Year : Integer) : Boolean;
{-Return True if Year is a leap year}
begin
IsLeapYear :=
(Year mod 4 = 0)
and (Year mod 4000 <> 0) and
((Year mod 100 <> 0) or (Year mod 400 = 0));
end;
Т.е. помимо вышеуказанных условий есть еще одно: каждый 4000-й год - НЕ високосный
Насчет алгоритма. Рождество Христово-то ведь не 31 декабря было, а 24 декабря [кстати, 0001 года или 0001 до нашей эры?]

Т.е., если формально следовать условию задачи (мы же считаем прошедшие ДНИ), то надо учесть этот "хвостик" конца года.
Re: Разработать процедуры определения количества дней от рождест-ва Христова
Добавлено: 22 окт 2009, 07:59
atavin-ta
" писал(а):Т.е. помимо вышеуказанных условий есть еще одно: каждый 4000-й год - НЕ високосный
Ты серьёзно? Даже первого четырёхтысячного года ещё не было и до него не дожиёт ни автор проги, ни сама прога, ни её юзверь.
Re: Разработать процедуры определения количества дней от рождест-ва Христова
Добавлено: 22 окт 2009, 10:53
mc-black
BBB
Насчет 4000 нигде пока не слышал. Можете указать источник информации более достоверный, чем функция в Паскале? По-моему пока этот срок не настал и до конца еще никто точно не договорился по корректировке через 4000 лет. Время же еще есть, чтобы договориться)))
Насчет даты рождения Христа по Григорианскому календарю, сейчас фиг знает как оно, возможно и так как Вы пишите, ведь до введения Григорианского был Юлианский календарь, тогда было сделано несколько корректировок дат. Когда Иисус родился там вообще х.з. какой календарь был. Я так понимаю, что человеку надо решить задачу без лишнего религиозного фанатизма, т.е. с такими (примерно)
неверными допущениями:
1. Предполагаем, что рождение Иисуса стало началом отсчета дат по Григорианскому календарю.
2. Первым днем (с рождения Христа) этого календаря предположим, что будет 1 января 0001 года от Рождетва Христова.
Тогда можно уже не спорить, а начинать тупо вычислять.
А кто-нибудь знал, что в СССР где-то в 30-х годах для удобства планирования временно вводились 5-и и 6-и дневные недели?!))))) Если не верите, могу уточнить, когда именно.
erazer89, когда-то я написал небольшую программку-календарь на ассемблере MASM (MASM32 SDK), там есть отсчет количества дней с 1900 года, можешь выдрать оттуда кусок какой понравится и переделать на 0-й год - исходники открытые.
http://mc-bkack.narod.ru/dzp.htm
.
Добавлено: 22 окт 2009, 13:00
BBB
mc-black писал(а):
Насчет 4000 нигде пока не слышал. Можете указать источник информации более достоверный, чем функция в Паскале? По-моему пока этот срок не настал и до конца еще никто точно не договорился по корректировке через 4000 лет. Время же еще есть, чтобы договориться)))
Увы, нет. Хотя, признаться, я и не искал

Но я изхожу из того, что разработчики этой библиотеки (весьма используемой, кстати, на стуке 1980-1990-х) вряфд ли вставили это условия "чтобы приколоться" или будучи навеселе
Кстати, на форуме алгоритм вычисления "Високосный ли год?" уже обсуждался около двух лет назад.
А кто-нибудь знал, что в СССР где-то в 30-х годах для удобства планирования временно вводились 5-и и 6-и дневные недели?!))))) Если не верите, могу уточнить, когда именно.
Слышал про это. Но подробностей не знаю. Кстати, если помните фильм "Волго-Волга", то там есть кадры, когда на фоне параходного гребного колеса прокручиваются титры "Прошел первый день шестидневки", "Прошел второй день шестидневки" и т.д.
erazer89, когда-то я написал небольшую программку-календарь на ассемблере MASM (MASM32 SDK), там есть отсчет количества дней с 1900 года,
В той же упомянутой библиотеке OpDate есть вычисление кол-ва дней с 1600 года. Собственно, у них это объявлено типом данных
Julian = longint и равно как раз ко-ву прошедших дней с 1600 года. И многие процедуры/функции библиотеки имеют дело именно с этим типом.
Re: Разработать процедуры определения количества дней от рождест-ва Христова
Добавлено: 22 окт 2009, 13:11
atavin-ta
Маша! Выйди и вернись навеселе! Дубровский в пересказе идиота.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
На таком веселе они и были, Факт!