Примеры программ. Вычисление дня недели.
Теперь можно разработать процедуру 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.