Проверка, високосный год или нет. Вычисление дня недели |

|

|
1. Год делится на 400 -> високосный -> конец
2. Год делится на 100 -> не високосный -> конец
3. Год делится на 4 -> високосный -> конец
4. Год не високосный -> конец
5. Всё
А вот моя программка для определения дня недели. Кому надо - разберется.
Работает вроде до 2100 года.
(*
Вычисление дня недели в приложениях автоматического вычисления
дня недели в датах от 1996 года и старше.
Copyright (C) Sergei Frolov, 1998.
v1.0 Jan, 4, 1998.
Программа ориентирована на применение в приложениях, написанных
на языке ассемблера без использования аппаратного умножения/деления
и операций с плавающей запятой.
*)
program denned;
const
YEARS : array[0.. 3] of byte = (0, 2, 3, 4);
MONTHS : array[1..12] of byte = (0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5);
DAYOFWEEKS : array[0..6] of string =
('Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг',
'Пятница', 'Суббота');
var
a, b, c, d, e, f, tmp : byte;
day, month, year : word;
begin
repeat
write('Число XX -> ');
readln(day);
if day = 0 then break; { выход }
write('Месяц XX -> ');
readln(month);
write('Год XXXX -> ');
readln(year);
tmp := year - 1996;
a := tmp and 3;
b := (tmp shr 2) + (tmp and $FC);
c := MONTHS[month];
if (a = 0) and (month > 2) then inc(c);
a := YEARS[a];
e := (a + b + c + day) mod 7;
writeln('Результат: ', DAYOFWEEKS[e]);
writeln;
until false;
end.
Обсудить на форуме »
|
Комментарии для веб-мастера |

|

|

|
Автор: michael |

|
Время: 20-07-03 11:31 |

|

Можно придумать алгоритм и поинтереснее:
Вход:
year - год (2001..?)
month - месяц (0..11)
day
- день (0..30)
Выход:
result - день недели (0..6)
1. Корректный алгоритм.
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--;
result = (t3 + m[month] + day) %
7;
2. Быстрый алгоритм (для 2001..2099 года).
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++;
result = (t1 + (t1 >> 2) + t2 + day) % 7;
Все переменные определяются типом uint (0..65535). А если кто запомнит
массив m[], то по второму алгоритму день недели легко определяется в уме
:).
 | | 
| |
|
Copyright 2000-2002 © Ilia Kantor, при поддержке проекта MANUAL.RU
|
|