Pers.narod.ru. Алгоритмы. Определение дня недели по дате |
Программа использует формулу Зеллера. Контроль допустимости введённой даты не делается, его легко добавить отсюда.
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:INTEGER; BEGIN DAY:=READINT ('Введите день',1,31); MONTH:=READINT('Введите месяц',1,12); YEAR:=READINT('Введите год',1,32767); 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 (DAY,'.',MONTH,'.',YEAR,' ЭТО '); 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 <stdio.h> void 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; char *days[]={"Sat","Sun","Mon","Tue","Wed","Thu","Fri"}; printf ("\n%s",days[wd]); }
Моя статья "Строим вечный календарь"
Статья о формуле Зеллера в Википедии
гостевая; E-mail |