|
Алгоритм нахождения дня недели из даты
Для нахождения дня недели нужно сперва задатся стартовой датой, например
я задался датой 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;
}
Готовый вариант программы сможете найти, щелкнув в навигационной панели ссылку
Готовые программы.
|