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