Nickolay.info. Алгоритмы. Определение дня недели по дате |
Программа использует формулу Зеллера. Контроль допустимости введённой даты не делается, его легко добавить отсюда.
PROGRAM WEEKDAY;
FUNCTION READINT (MSG:STRING;A,B:INTEGER):INTEGER;
{ввод целого с проверкой корректности:
разрешает числа от A до B включительно }
VAR X:INTEGER;
BEGIN
REPEAT
WRITELN;
WRITE (MSG,' [',A,',',B,'] ');
{$I-}READ(X);{$I+}
IF IORESULT<>0 THEN WRITELN ('ОШИБКА, ВВЕДЕНО НЕ ЧИСЛО')
ELSE IF (X<A) OR (X>B) THEN WRITELN ('ОШИБКА, ВВЕДЕННОЕ ЗНАЧЕНИЕ НЕ ПРИНАДЛЕЖИТ [',A,',',B,']')
ELSE BREAK;
UNTIL FALSE;
READINT:=X;
END;
VAR DAY,MONTH,YEAR,CENT,NUM,WEEK,D0,M0,Y0:INTEGER;
BEGIN
DAY:=READINT ('Введите день',1,31);
MONTH:=READINT('Введите месяц',1,12);
YEAR:=READINT('Введите год',1,32767);
D0:=DAY; M0:=MONTH; Y0:=YEAR;
IF MONTH<3 THEN BEGIN
INC(MONTH,12);
DEC(YEAR);
END;
CENT:=YEAR DIV 100;
NUM:=YEAR MOD 100;
WEEK:=((MONTH+1)*26 DIV 10+DAY+ NUM + NUM div 4+ CENT div 4 - 2*CENT) mod 7;
WRITE (D0,'.',M0,'.',Y0,' ЭТО ');
CASE WEEK OF
0: WRITELN('СУББОТА');
1: WRITELN('ВОСКРЕСЕНЬЕ');
2: WRITELN('ПОНЕДЕЛЬНИК');
3: WRITELN('ВТОРНИК');
4: WRITELN('СРЕДА');
5: WRITELN('ЧЕТВЕРГ');
6: WRITELN('ПЯТНИЦА');
END;
WRITE ('НАЖМИТЕ ENTER ДЛЯ ВЫХОДА');
RESET (INPUT);
READLN;
END.
На C++ можно сделать всё проще и красивее, вот совсем короткий пример для консоли:
#include <cstdio>
int main() {
int d = 29, m = 2, year = 2012;
if (m < 3) { m += 12; year--; }
int c = year / 100, y = year % 100, wd;
wd = ((m + 1) * 26 / 10 + d + y + y / 4 + c / 4 - 2 * c) % 7;
const char* days[] = { "Sat","Sun","Mon","Tue","Wed","Thu","Fri" };
printf("\n%s", days[wd]);
return 0;
}
Моя статья "Строим вечный календарь"
Статья о формуле Зеллера в Википедии
|
|