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; }
Моя статья "Строим вечный календарь"
Статья о формуле Зеллера в Википедии
![]() |