Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Определения дня недели по дате


Автор: 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
Код

int DayOFWeek(int d, int m, int y)
{
 if(m<2)
 {
   inc(m, 12);
   dec(y);
 }

 int N = d + 2 * m + int(0.6 * (m + 1)) + y +
   int(y / 4) - int(y / 100) +int(y / 400) + 2;
 N = int((N / 7 - int(N / 7)) * 7 + 0.5);

 return(N);
}


Попробуй. Откуда коэффициены берутся, не знаю, насчёт синтаксической правильности (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
Большое спасибо, Леонид.
Буду разбираться, думаю кроме дня недели найду еще много интересного smile.gif , если ты не против
thumbs-up.gif

Автор: DENNN 14.5.2003, 12:42
http://www.codeproject.com/datetime/
там покапайся smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)