Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Теория программирования > Алгоритмы
Перезагрузить страницу Как определить день недели по дате С++
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
eXistenz eXistenz вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.10.2005
По умолчанию Как определить день недели по дате С++ - 29.10.2005, 02:04

САБЖ
З.ы. Поисковик и msdn.com не помогли
Ответить с цитированием
  (#2 (permalink)) Старый
Kislov Kislov вне форума
Member
 
Сообщений: 576
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 06.05.2004
По умолчанию 29.10.2005, 13:46

функция localtime
Ответить с цитированием
  (#3 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 29.10.2005, 16:37

Вход:
year - год (2001..?)
month - месяц (0..11)
day - день (0..30)

Выход:
result - день недели (0..6)

1. Корректный алгоритм.
Код:
uint dayofweek(uint year, uint month, uint day)
{
  uint t1, t2, t2r, t3;
  static uint m[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
  t1 = year - 2000;
  t2 = t1 / 100;
  t2r = t1 % 100;
  t3 = t1 + (t1 >> 2) - t2 + (t2 >> 2) - 1;
  if ( ((t1 & 0x0003 == 0) && ((t2r != 0) || (t2 & 0x0003 == 0))) && (month < 2) ) then t3--;
  return (t3 + m[month] + day) % 7;
}
2. Быстрый алгоритм (для 2001..2099 года).
Код:
uint dayofweek(uint year, uint month, uint day)
{
  uint t1, t2;
  static uint m[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
  t1 = year - 2001;
  t2 = m[month];
  if ( (year & 0x0003 == 0) && (month >> 1 != 0) ) then t2++;
  return (t1 + (t1 >> 2) + t2 + day) % 7;
}
Ответить с цитированием
  (#4 (permalink)) Старый
SiMM SiMM вне форума
Member
 
Сообщений: 1,961
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.08.2003
По умолчанию 29.10.2005, 19:32

Для любой даты начиная с 1583 года смотреть сюда
Цитата:
Originally posted by michael
[b]1. Корректный алгоритм.
Первоисточник? Там вроде сказано, что действует для дат от 1996 года до 2100
Ответить с цитированием
  (#5 (permalink)) Старый
michael michael вне форума
Member
 
Сообщений: 969
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.08.2003
По умолчанию 29.10.2005, 22:22

Цитата:
Originally posted by SiMM
[b]Первоисточник? Там вроде сказано, что действует для дат от 1996 года до 2100
Я немного изменил алгоритм (в той программе високосный год рассчитывается по схеме год делится на 4 - високосный, а не той, что представлена на этой же странице выше).
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Кошмар Кошмар вне форума
Member
 
Сообщений: 2,694
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.04.2005
По умолчанию 30.10.2005, 12:23

Цитата:
год рассчитывается по схеме год делится на 4 - високосный
Есть исключения...


импортирован с progz.ru
Ответить с цитированием
  (#7 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 30.10.2005, 12:34

Цитата:
Originally posted by Кошмар
[b]<div class='quotetop'>Цитата
Цитата:
год рассчитывается по схеме год делится на 4 - високосный
Есть исключения...[/quote]

Например?
Ответить с цитированием
  (#8 (permalink)) Старый
eXistenz eXistenz вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.10.2005
По умолчанию 30.10.2005, 12:54

Код:
int t1, t2; 
   int m[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5}; 
   t1 = year - 2001; 
   t2 = m[month]; 
   if ( (year & 0x0003 == 0) && (month >> 1 != 0) ) t2++; 
   DWORD ddd=(t1 + (t1 >> 2) + t2 + day) % 7;
вот этот пашет... только Январь - 0 а Декабрь - 11, не по русски как то ну да ладно)
а кто сможет объяснить как это работает? побитовый сдвиг.. нафиг?
Ответить с цитированием
  (#9 (permalink)) Старый
SiMM SiMM вне форума
Member
 
Сообщений: 1,961
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.08.2003
По умолчанию 30.10.2005, 14:07

[quote][quote]
Цитата:
побитовый сдвиг.. нафиг?
Потому что сдвиг вправо на n быстрее деления на 2^n.
Ответить с цитированием
  (#10 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 30.10.2005, 14:26

Цитата:
Originally posted by SiMM+-->
Цитата:
Цитата:
Originally posted by Garik@
[b]<!--QuoteBegin-Кошмар
Цитата:
Цитата:
[b]<div class='quotetop'>Цитата
Цитата:
год рассчитывается по схеме год делится на 4 - високосный
Есть исключения...
Например?
В частности, 1900 и 2100 годы - не високосные [/quote]

Поясни плиз...
Ответить с цитированием
  (#11 (permalink)) Старый
eXistenz eXistenz вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.10.2005
По умолчанию 30.10.2005, 14:29

а маска зачем?
if ( (year & 0x0003 == 0) && (month >> 1 != 0) )
Ответить с цитированием
  (#12 (permalink)) Старый
Кошмар Кошмар вне форума
Member
 
Сообщений: 2,694
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.04.2005
По умолчанию 30.10.2005, 14:45

Цитата:
Originally posted by Garik+-->
Цитата:
Цитата:
Originally posted by SiMM+--><div class='quotetop'>Цитата(SiMM)
Цитата:
<!--QuoteBegin-Garik
Цитата:
@
[b]<!--QuoteBegin-Кошмар
Цитата:
Цитата:
[b]<div class='quotetop'>Цитата
Цитата:
год рассчитывается по схеме год делится на 4 - високосный
Есть исключения...
Например?
В частности, 1900 и 2100 годы - не високосные [/quote]

Поясни плиз...
[/quote]

годы типа 1700,1800,1900,2100,2300 (у них число сотен не делится на 4) считаются простыми, а не високосными.
Кроме того, при существующей системе исчисления ошибка в 1 сутки накапливается за 3300 лет, так что через это время нужно делать ещё один год-исключение.


импортирован с progz.ru
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
SiMM SiMM вне форума
Member
 
Сообщений: 1,961
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.08.2003
По умолчанию 30.10.2005, 14:55

Цитата:
Originally posted by eXistenz
[b]а маска зачем?
if ( (year & 0x0003 == 0) && (month >> 1 != 0) )
За тем же, за чем и сдвиги year & 2^n-1 куда быстрее, чем year % 2^n
Фактически это то же самое, что получить "выдвинутые" биты.
Цитата:
Originally posted by Garik+-->
Цитата:
<!--QuoteBegin-SiMM
Цитата:
[b]В частности, 1900 и 2100 годы - не високосные
Поясни плиз...
http://ru.wikipedia.org/wiki/Високосный_год
Ответить с цитированием
  (#14 (permalink)) Старый
eXistenz eXistenz вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 29.10.2005
По умолчанию 30.10.2005, 16:04

скорость не так важна....
что там проверяется? как мне преподу объяснить?
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посчитать общий километраж по каждому дню недели в отдельности. Egorikas Pascal 0 31.03.2012 18:38
Как сделать редактирование даты начала недели olejaaa C++ Builder 0 02.04.2011 01:55
Помогите решить задачу про дни недели (срочно) Djarus Prolog 5 23.12.2010 23:04
Как вычислить день недели Александр Рябов DHTML, JavaScript, VBScript 1 13.10.2006 13:37
Как по месяцу и году определить последний день этого месяца Илюх@ C++ Builder 2 24.07.2006 13:25
Как выводить сообщение по дате Sta_mst Delphi 8 07.07.2006 13:11
Автофильтр по дате в Excel imported_Diletant Visual Basic 2 03.02.2006 01:08
Как сделать упорядочение по дате redfield SQL 0 26.10.2005 13:29
Как определять порядковый номер предыдущей недели Евгения DHTML, JavaScript, VBScript 0 04.07.2005 16:33
поиск по дате veriky PHP 2 06.10.2004 10:11
Как по введенной дате(дд мм год) определить день недели Zemfiriak Вопросы начинающих программистов 0 26.03.2004 08:35
Сортировка по дате как это сделать Nicolo.pas Delphi 24 29.12.2003 11:02



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов