Разработать процедуры определения количества дней от рождест-ва Христова

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

erazer89
Сообщения: 1
Зарегистрирован: 18 дек 2008, 11:48

Разработать процедуры определения количества дней от рождест-ва Христова по текущий день в формате DD/MM/YYYY (с учетом високосных лет).

Подскажите как это реальзивать.
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Неправильно сформулированная задача, т.к. переход с Юлианского на Грирорианский календарь был значительно позже Рождества Христова, а именно 4 октября 1582 года, но в России переход на новый стиль был осуществлен еще позже.

Распределение високосных годов
* Каждый год, номер которого кратен 4 — високосный.
* Однако, каждый год кратный 100 — не високосный.
* Однако, каждый год кратный 400 все же високосный — 1600, 2000 и т.д.
Эти правила дают среднюю продолжительность года равной 365,2425

Вам для решения этой задачи нужно уметь вычислять кратность 4-м, 100 и 400 и делать сравнительно простое вычисление. На ассемблере прочтите подробно описание целочисленного деления div и все сразу станет понятно.
На заказ: VBA, Excel mc-black@yandex.ru
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):Неправильно сформулированная задача, т.к. переход с Юлианского на Грирорианский календарь был значительно позже Рождества Христова, а именно 4 октября 1582 года, но в России переход на новый стиль был осуществлен еще позже.
Задача поставлена не неправильно, а просто не полно. Надо, например, так: "Разработать процедуры определения количества дней от рождест-ва Христова по текущий день в формате DD/MM/YYYY, с учетом високосных лет и того, что в первой версии календаря их ещё не было, дату коррекции календаря взять инностранную."
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Пример для 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. Примерно так, разве что на пару дней я мог немного ошибиться - требует перепроверки.
На заказ: VBA, Excel mc-black@yandex.ru
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):Пример для 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 - не високосный.
Разве? Надо ведь с рождества. А это даже не в прошлом тысячелетии.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

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 до нашей эры?] :) Т.е., если формально следовать условию задачи (мы же считаем прошедшие ДНИ), то надо учесть этот "хвостик" конца года.
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):Т.е. помимо вышеуказанных условий есть еще одно: каждый 4000-й год - НЕ високосный
Ты серьёзно? Даже первого четырёхтысячного года ещё не было и до него не дожиёт ни автор проги, ни сама прога, ни её юзверь.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

BBB

Насчет 4000 нигде пока не слышал. Можете указать источник информации более достоверный, чем функция в Паскале? По-моему пока этот срок не настал и до конца еще никто точно не договорился по корректировке через 4000 лет. Время же еще есть, чтобы договориться)))

Насчет даты рождения Христа по Григорианскому календарю, сейчас фиг знает как оно, возможно и так как Вы пишите, ведь до введения Григорианского был Юлианский календарь, тогда было сделано несколько корректировок дат. Когда Иисус родился там вообще х.з. какой календарь был. Я так понимаю, что человеку надо решить задачу без лишнего религиозного фанатизма, т.е. с такими (примерно) неверными допущениями:
1. Предполагаем, что рождение Иисуса стало началом отсчета дат по Григорианскому календарю.
2. Первым днем (с рождения Христа) этого календаря предположим, что будет 1 января 0001 года от Рождетва Христова.
Тогда можно уже не спорить, а начинать тупо вычислять.

А кто-нибудь знал, что в СССР где-то в 30-х годах для удобства планирования временно вводились 5-и и 6-и дневные недели?!))))) Если не верите, могу уточнить, когда именно.

erazer89, когда-то я написал небольшую программку-календарь на ассемблере MASM (MASM32 SDK), там есть отсчет количества дней с 1900 года, можешь выдрать оттуда кусок какой понравится и переделать на 0-й год - исходники открытые. http://mc-bkack.narod.ru/dzp.htm
На заказ: VBA, Excel mc-black@yandex.ru
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

mc-black писал(а): Насчет 4000 нигде пока не слышал. Можете указать источник информации более достоверный, чем функция в Паскале? По-моему пока этот срок не настал и до конца еще никто точно не договорился по корректировке через 4000 лет. Время же еще есть, чтобы договориться)))
Увы, нет. Хотя, признаться, я и не искал :) Но я изхожу из того, что разработчики этой библиотеки (весьма используемой, кстати, на стуке 1980-1990-х) вряфд ли вставили это условия "чтобы приколоться" или будучи навеселе :)

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

Маша! Выйди и вернись навеселе! Дубровский в пересказе идиота.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
На таком веселе они и были, Факт!
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить