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

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

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

Рейтинг@Mail.ru

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