Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Работа с датами

16 views
Skip to first unread message

Alexander Wolf

unread,
May 14, 2011, 8:33:16 AM5/14/11
to
Привет, All!

Hикто не подскажет алгоритма нахождения порядкового номера дня в году по дате,
и алгоритма нахождения даты по порядковому номеру дня в году. Подозреваю, что
эти алгоритмы будут похожи на алгоритм нахождения юлианской даты (JD и/или MJD)
- я прав?

С наилучшими пожеланиями, Alexander.

Nickita A Startcev

unread,
May 14, 2011, 12:11:56 PM5/14/11
to
Привет, Alexander !


14 May 11 , 17:33 Alexander Wolf писал к All:

AW> Hикто не подскажет алгоритма нахождения порядкового номера дня в году
AW> по дате, и алгоритма нахождения даты по порядковому номеру дня в году.
AW> Подозреваю, что эти алгоритмы будут похожи на алгоритм нахождения
AW> юлианской даты (JD и/или MJD) - я прав?

Hу, вычесть нулевое января текущего года - это нетрудно.

. С уважением, Hикита.
icq:240059686, lj-user:nicka_startcev
... Развисти в адной пинте вады, адну каплю иму в чай и ниприменна надеть
свабоднаю адежду и ищо штобы вы ни ждали некаких гастей. (ц)Пратчет

Alexander Wolf

unread,
May 16, 2011, 2:08:00 AM5/16/11
to
Привет, Nickita!

14 май 11 21:11, Nickita A Startcev -> Alexander Wolf в сообщении по ссылке
area://ru.algorithms?msgid=2:5022/49.61+4dceb7f9:

NS> Hу, вычесть нулевое января текущего года - это нетрудно.

Меня все же интересуют алгоритмы, а не конкретные реализации в конкретных
языках программировния. Особенно меня интересует алгоритм вычисления даты по


порядковому номеру дня в году.

С наилучшими пожеланиями, Alexander.

Alexander Ivanov

unread,
May 16, 2011, 12:05:42 PM5/16/11
to
Привет, Alexander!

16 май 11 11:08, Alexander Wolf -> Nickita A Startcev:

AW> Меня все же интересуют алгоритмы, а не конкретные реализации в
AW> конкретных языках программировния. Особенно меня интересует алгоритм
AW> вычисления даты по порядковому номеру дня в году.

Hужно составить массивы порядковых номеров первых чисел месяцев для обычного и
високосного года.
дальше - очевидно.
С наилучшими пожеланиями, Alexander.

Alexander Zabairatsky

unread,
May 18, 2011, 10:25:23 PM5/18/11
to
Hello Alexander!

16 May 11 11:08, Alexander Wolf wrote to Nickita A Startcev:


NS>> Hу, вычесть нулевое января текущего года - это нетрудно.

AW> Меня все же интересуют алгоритмы, а не конкретные реализации в
AW> конкретных языках программировния.

А самому сообразить не ку? И на каком языке излагать эти алгоритмы? Блок-схему
рисовать, да? :-)

Впрочем, такие простые алгоритмы достаточно просто описываются и без
блок-схемы.

AW> Особенно меня интересует алгоритм вычисления даты по порядковому
AW> номеру дня в году.

Ладно. Сначала общая часть обоих алгоритмов. Берем массив, допустим ML из 12
элементов с индексами от 1 до 12, заполняем его количеством дней в месяцах для
обычного года. Далее проверяем не високосный ли у нас год, если да, то меняем
второй элемент этого массива с 28 на 29.

А теперь раздельно. Сначала номер дня по дате. Берем номер текущего месяца в
качестве индекса в этот массив и меняем эту ячейку на сегодняшнее число. Таким
образом получаем массив, в котором для каждого из месяцев, кроме текущего, в
соответствующей ячейке лежит количество дней этого месяца, для текущего же
лежит текущее число. Осталось просуммировать.

Обратная задача также примитивна. Эапускаешь цикл по индексу от 1 до 12, в
цикле копируешь номер дня в рабочую переменную, вычитаешь из нее очередной
элемент массива, если результат не больше нуля (ноль или минус), выходим из
цикла нелюбимым GOTO, в номере дня будет число, в индексе - месяц. Если
применяемый язык программирования не поддерживает GoTo, то придется оформить
эту процедурку подпрограммой и вместо GOTO использовать RETURN. Если же рабочая
переменная все еще больше нуля, копируем ее значение в номер дня и идем на
следующую итерацию цикла. Если цикл закончился естественным образом, значит
програмке подсунули номер больший, чем 365 (366), что есть ошибка.

Интереснее продумать варианты. Допустим, бывают случаи, когда требуется жесткая
экономия памяти данных - это мы на писюках привыкли к гигабайтам, в крайнем
случае - к сотням мегабайт оперативки, а бывают контроллеры с 1-2К байт
флэш-памяти программы и 32 или 64 _байтами_ оперативной памяти для данных.
Естественно, отдавать 16 байт из этих 32-64 под массив будет сильно жирно,
массив следует делать константным, располагая его в памяти программы, а
изменения (не февраль ли для проверки на високосный год и не текущий ли месяц
для вычисления номера дня в году) делать внутри цикла. Что-то вроде такого

1. Пересылаем в регистр число дней в очередном месяце (по индексу).
2. Проверяем, а может сегодня февраль?
3. Если не февраль, то (7)
4. Смотрим, не високосный ли год?
5 Если нет, то (7)
6. Пересылаем в этот же регистр число 29
7. (Продолжение Содержимсое регистра используем в качестве числа дней в
очередном месяце).

Все пронумерованный пункты, кроме 4-го и 7-го, скорее всего, будут реализованы
одной ассемблерной командой.

А как определить, високосный год, или нет, оставляю тебе в качестве домашнего
задания. :-)

Всего доброго!

А. Забайрацкий.


Alexander Zabairatsky

unread,
May 20, 2011, 10:52:42 PM5/20/11
to
Hello Alexander!

19 May 11 07:25, Alexander Zabairatsky wrote to Alexander Wolf:


AZ> 1. Пересылаем в регистр число дней в очередном месяце (по индексу).
AZ> 2. Проверяем, а может сегодня февраль?
AZ> 3. Если не февраль, то (7)
AZ> 4. Смотрим, не високосный ли год?
AZ> 5 Если нет, то (7)
AZ> 6. Пересылаем в этот же регистр число 29
AZ> 7. (Продолжение Содержимсое регистра используем в качестве числа дней
AZ> в очередном месяце).

AZ> Все пронумерованный пункты, кроме 4-го и 7-го, скорее всего, будут
AZ> реализованы одной ассемблерной командой.

Я не совсем удачно выразился. Я имел в виду: "Каждый из пронумерованных
пунктов, кроме 4-го и 7-го, скорее всего, будет реализован одной ассемблерной
командой"ю

Всего доброго!

А. Забайрацкий.


0 new messages