{Эта программа вводит дату в формате ДД ММ ГГГГ и выводит на экран
 соответствующий этой дате день недели.
 Описание программы см. п.2.7.1. книги 1}
var
  IsCorrectDate: Boolean; {Признак правильной даты}
  d,m,y        : integer; {Вводимая дата - день, месяц и год}
{-------------------------------}
Procedure InputDate(var d,m,y : integer;
                    var correctly : Boolean);
{Вводит в переменные d, m и y очередную дату и проверяет ее.
Если дата правильная, устанавливает correctly=true, иначе
correctly=false }
begin {InputDate}
  Write('Введите дату в формате ДД ММ ГГГГ: ');
  ReadLn(d,m,y);
  correctly := (d>=1) and (d<=31) and (m>=1)
                      and (m<=12) and (y>=1582) and (y<=4903)
end; {InputDate}
{-------------------------------}
Procedure WriteDay(d,m,y : integer);
const
  Days_of_week: array [0..6] of string [11] =
                ('воскресенье','понедельник','вторник',
                 'среда','четверг','пятница','суббота');
var
  c, w : integer;
begin
  if m < 3 then
    begin				{Месяц январь или февраль}
      m := m + 10;
      y := y - 1
    end
  else
    m := m - 2;			{Остальные месяцы}
  c := y div 100; 		{Вычисляем столетие}
  y := y mod 100; 		{Находим год в столетии}
  w := abs(trunc(2.6*m-0.2)+d+y div 4+y+c div 4-2*c) mod 7;
  WriteLn(Days_of_week[w])
end;
{-------------------------------}
begin
  repeat
    InputDate(d,m,y,IsCorrectDate);
    if IsCorrectDate then
      WriteDay(d,m,y)
  until not IsCorrectDate
end.

