Сайт SPYRYTUS_LTD© SPYRYTUS - учеба, работа и развлечения title image
Новости :
    Software News
    Hardware News
Обзоры :
    Главная
    Алгоритмы
    Готовые программы
    Игры
Разработка :
    Свои разработки
    Продажа и заказ ПО
Развлечения :
    Отдохни !

Алгоритм нахождения дня недели из даты

      Для нахождения дня недели нужно сперва задатся стартовой датой, например я задался датой 1 января 1900 года. Хотя в принципе алгоритмов нахождения дня недели по дате множество, но этот самый простой на мой взгляд т.к. основан на алгоритме "Юлианский период", который изобретен французским ученым Ж. Скалигером в 1583 г. для хронологических расчетов. Удобство метода заключается в том, что все дни в нем пронумерованы по порядку, независимо от принятой календарной системы, года, месяца, недели ... .
      Суть расчета заключается в том, что количество прошедших дней от стартовой даты вычесляется очень легко : от 01.01.1900 до 01.02.1900 прошло 31 день, т.к. в январе месяце 31 день. А вот например количество дней от 01.01.1900 до 24.02.1900 будет равно : 31 + 24 = 55 дней. Но Вы наверное думаете, а как же поступить если надо посчитать количество дней между 12, 23 годами. Очень просто, для этого нужно определить какой был ближайший высокосный год, затем вычеслить количество дней до нужной даты и + 1 день, думаю догадались зачем 1 день. В высокосном году у февраля месяца 29 дней, а в обычные годы 28 дней. Теперь самое интересное, а как же узнать какой день недели та, или инная дата ? Тоже просто, для этого поделите Ваше количество дней на 7, и остаток будет являтся днем недели. Только есть один ньюанс : для правельного определения дня недели, нужно знать день недели Вашей стартовой даты. Например : 01.01.1900 г. было воскресенье, тогда договариваимся, что воскресенье - это остаток "0", тогда остаток 1 - понедельник, и т.д. по аналогии.
      Теперь пришло время реализовать все выше сказаное в программе. Для хранения количества суток прошедших от стартовой даты, созданим 4 массива по 12 значений в каждом, что соответствует количеству месяцов :

  const Start=1900;
  const YEAR_0[]={0,31,60,91,121,152,182,213,244,274,305,335};
  const YEAR_1[]={366,397,425,456,486,517,547,578,609,639,670,700};
  const YEAR_2[]={731,762,790,821,851,882,912,943,974,1004,1035,1065};
  const YEAR_3[]={1096,1127,1155,1186,1216,1247,1277,1308,1339,1369,1400,1430};

      Теперь нужно вычеслить ближайший высокосный год, переменная HiYear будет содержать ближайший прошедший высокосный год, а переменная YEAR, это введенный Вами год :

int HiYear = (YEAR/4)*4;

затем определяем количество дней прошедших от стартового года до ближайшего высокосного года, переменная Start содержит стартовый год :

int FYear = ((HiYear-Start)/4)*(366+(365*3));;

теперь определим сколько прошло лет от ближайшего высокосного года, и возмем количество суток прошедших от последнего высокосного года, MONTH - это введенный Вами месяц (MONTH-1 сделано потому, что нумерация в массиве начинается с "0").

switch (YEAR - HiYear)
{
  case 0: FYear = FYear + YEAR_0[MONTH-1]; break;
  case 1: FYear = FYear + YEAR_1[MONTH-1]; break;
  case 2: FYear = FYear + YEAR_2[MONTH-1]; break;
  case 3: FYear = FYear + YEAR_3[MONTH-1]; break;
}

      Теперь собственно и само определение дня недели, DAY - введенный Вами день.

switch ((FYear+DAY-1)%7)
{
  case 4: cout<<DAY<<´.´<<MONTH<<´.´<<YEAR<<" it's day - "<<"Thursday.\n"; break;
  case 5: cout<<DAY<<´.´<<MONTH<<´.´<<YEAR<<" it's day - "<<"Friday.\n"; break;
  case 6: cout<<DAY<<´.´<<MONTH<<´.´<<YEAR<<" it's day - "<<"Saturday.\n"; break;
  case 0: cout<<DAY<<´.´<<MONTH<<´.´<<YEAR<<" it's day - "<<"Sunday.\n"; break;
  case 1: cout<<DAY<<´.´<<MONTH<<´.´<<YEAR<<" it's day - "<<"Monday.\n"; break;
  case 2: cout<<DAY<<´.´<<MONTH<<´.´<<YEAR<<" it's day - "<<"Tuesday.\n"; break;
  case 2: cout<<DAY<<´.´<<MONTH<<´.´<<YEAR<<" it's day - "<<"Wednesday.\n"; break;
}

      Готовый вариант программы сможете найти, щелкнув в навигационной панели ссылку Готовые программы.

 
  Перейти вверх страници ВВЕРХ Перейти вверх страници
Сайт хостинга Рейтинг посещаемости Поисковая машина Интернет-магазин CD-дисков
Хостинг от uCoz