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]);
}

 Моя статья "Строим вечный календарь"

 Статья о формуле Зеллера в Википедии

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz