Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Определения дня недели по дате |
Автор: Nastya 28.4.2003, 17:09 |
САБЖ. На http://alglib.chat.ru/ Нашла алгоритм. По нему получила такую функцию int DayOFWeek(int d, int m, int y) { if(m>2) m++; else { m=m+13; y--; } int n=int(365.25*y)+int(30.6*m)+d-621050; return (n-int(n/7)*7+1); } Во первых не понятно откуда эти числа. Во вторых работает не правильно. Если кто что подскажет буду благодарна. |
Автор: acp 28.4.2003, 18:12 | ||
Попробуй. Откуда коэффициены берутся, не знаю, насчёт синтаксической правильности (inc, dec), преобразования типов (int), не уверен (просто на С очень давно не писал). Если это заработает, то скажу откуда взял. Да, вот ещё - здесь номер дня, по моему начинается с 0. |
Автор: podval 28.4.2003, 19:25 |
Числа понятно откуда. 365.25 - среднее количество дней в четырех идущих подряд годах, один из которых високосный. 30.6 - среднее количество дней в месяце. 7 - количество дней в неделе. Вот из-за этих "средних" и случаются ошибки. Я думаю, за основу надо взять принцип, заложенный в программах типа "вечный календарь". К сожалению, с ходу, не скажу, как конкретно там сделано. |
Автор: acp 28.4.2003, 20:49 |
Хм... Вышенаписанный код, это, собственно, и есть реализация "вечного календаря". |
Автор: Nastya 29.4.2003, 10:02 |
Может я что-то не поняла, но получила такую функцияю. Работает она все-таки не правильно. И еще месяц с 1 по 12 или с 0 по 11? int DayOFWeek(int d, int m, int y) { if(m<2) { m+= 12; y--; } double N = d + 2 * m + int(0.6 * (m + 1)) + y + int(y / 4) - int(y / 100) +int(y / 400) + 2; N = (N / 7 - int(N / 7)) * 7 + 0.5; return((int)N); } n сделала double, т.к. автоматически округлялось где не надо и были все нули. |
Автор: Crait 29.4.2003, 17:50 |
Nastya, если Вам нужно получить результат и используете вы BCB/Delphy, могу порекомендовать воспользоваться классом TDateTime - там есть все что надо. Ну а в случае применения других компиляторов тоже, вероятно, будет полезно заглянуть в исходниики VCL. |
Автор: &-ray 10.5.2003, 20:36 |
для делфей: function DayOfWeek(Date: TDateTime): Integer; возвращает значение: 1 (воскресенье ) .. 7 (суббота) |
Автор: Nastya 11.5.2003, 09:37 |
Спасибо, но мне надо на С. Я конечно выкрутилась поигравшись с функциями из time.h, но там мне кое,что не нравится, да и как-то грамоздки и некрасиво получилось. |
Автор: Leonid 11.5.2003, 19:45 |
www |
Автор: Nastya 13.5.2003, 13:26 |
Большое спасибо, Леонид. Буду разбираться, думаю кроме дня недели найду еще много интересного ![]() ![]() |
Автор: DENNN 14.5.2003, 12:42 |
http://www.codeproject.com/datetime/ там покапайся ![]() |