Иллюстрированный самоучитель по Turbo Pascal

Примеры программ. Вычисление дня недели.

Теперь можно разработать процедуру INPUTDATE. Ввод даты не вызывает трудностей – стандартные процедуры WRITE и READLN отлично приспособлены для этой цели. Для проверки правильности даты нужно проверить принадлежность месяца диапазону 1…12 и года – диапазону 1582…4903. Кроме того, число не должно выходить из диапазона 1…31. Если Вы не очень настаиваете на более точной проверке числа в зависимости от месяца и года (для февраля), то программная реализация процедуры будет следующей:

Procedure InputDate(var d,m,y: Integer;
var correctly: Boolean);
{Вводит в переменные d, m и у очередную дату и проверяет ее.
Если дата правильная, устанавливает correctly=true, иначе correctly=false }
begin {InputDate}
Write('Введите дату в формате ДД ММ ГГ: ');
ReadLn(d,m,y);
correctly: = (d>=l) and (d<=31) and (m>=l)
and (m<=12) and (y >=1582) and (y<=4903)
end; {InputDate}

При выполнении этой процедуры ввод, например, трех нулей приведет к присвоению переменной CORRECTLY значения FALSE, что вызовет завершение работы программы.

Теперь разберемся с процедурой WRITEDAY. Получив в параметрах обращения день, месяц и год, она должна:

  • преобразовать месяц и год так, как описано выше (год должен начинаться 1 марта);
  • вычислить день недели;
  • выдать на экран результат.

Первое и второе действия очень просты и легко программируются. Что касается выдачи на экран, то можно потребовать от программы, чтобы эта выдача была не просто числом от 0 до 6, а одной из строк "воскресенье", "понедельник",…, "суббота". Для этого потребуются дополнительные усилия: нужно сначала создать массив строковых констант с именем, например, DAYS_OF_WEEK (дни_недели), а затем выбрать из этого массива и выдать на экран нужную строку. Создать массив текстовых констант можно с помощью объявления типизированной константы (см. гл. 7):

const
Days_of_week: array [0..6] of String [11] =
('воскресенье','понедельник','вторник', 'среда','четверг','пятница','суббота');

В этом объявлении идентификатор Days_of_week описывается в разделе констант, однако справа от него указан тип данных (массив строк), как если бы описывалась переменная, а уже только после типа стоит знак равенства и заключенный в круглые скобки список элементов массива. В результате получим следующую процедуру:

Procedure WriteDay(d,m,y: Integer);
const
Days_of_week: array [0..6] of String [11] =
('воскресенье','понедельник','вторник', ' среда', ' четверг', ' пятница', ' суббота.');
var
с, w:Integer;
begin
if m <3 then
begin {Месяц январь или февраль}
m: = m + 10;
у: = у – 1
end
else
m: = m – 2; {Остальные месяцы}
с: = у div 100; {Вычисляем столетие}
у: = у 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;

Окончательный вариант программы приведен в прил.5.1.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.