Проверьте, правильность введенной даты - Pascal
Формулировка задачи:
Дана дата в формате «дд.мм.гггг» (где «дд» – число, «мм» – номер месяца, «гггг» – год), описанная в виде записи. Проверьте, правильность введенной даты.
Решение задачи: «Проверьте, правильность введенной даты»
textual
Листинг программы
var date: record day, month, year: integer end; //представление даты в виде записи
s: string; //строковое представление даты
max_day, err_day, err_month, err_year: integer;
//макс. кол-во дней, номера неверных символов при преобразовании в число
//дня, месяца и года соответственно
valid: boolean; //флаг верной даты
begin
write('Enter date (dd.mm.yyyy): '); //вводим дату в виде строки
readln(s);
with date do //чтобы писать имена полей записи без указания имени записи, например, day вместо date.day
begin
val(copy(s, 1, 2), day, err_day); //преобразуем день в число
val(copy(s, 4, 2), month, err_month); //преобразуем месяц в число
val(copy(s, 7, 4), year, err_year); //преобразуем год в число
valid := (length(s) = 10) and //будем пока считать дату верной, если длина строки даты 10 символов, и
(s[3] = '.') and (s[6] = '.') and //3 и 6 символы - точки, и
(err_day + err_month + err_year = 0) and //нет ошибок при преобразовании в числа, и
(month >= 1) and (month <= 12) and //допустимый номер месяца, и
(year >= 1000) and (year <= 9999); //допустимый год
if valid //если пока дата верна,
then begin //то делаем проверку на количество дней в месяце
case month of
2: if (year mod 400 = 0) or ((year mod 4 = 0) and (year mod 100 <> 0)) //если месяц февраль и год високосный,
then max_day := 29 //то 29
else max_day := 28; //иначе 28
4, 6, 9, 11: max_day := 30 //если апрель, июнь, сентябрь или ноябрь, то 30
else max_day := 31 //в других случаях 31
end;
valid := (day >= 1) and (day <= max_day) //дата верна, если номер дня верный
end
end;
write('Date is valid: ', valid); //печатаем факт верности введённой даты
readln
end.
Объяснение кода листинга программы
- Объявляется переменная
dateтипаrecordсодержащая поляday,monthиyearтипа integer для представления даты в виде записи. - Объявляется переменная
sтипа string для хранения введенной даты в виде строки. - Объявляются переменные
max_day,err_day,err_month,err_yearтипа integer для хранения максимального количества дней в месяце, номеров неверных символов при преобразовании в число дня, месяца и года соответственно. - Объявляется переменная
validтипа boolean для флага верности введенной даты. - Пользователю предлагается ввести дату в формате
dd.mm.yyyy. - Считывается введенная строка в переменную
s. - Выполняется проверка введенной даты: извлекаются день, месяц и год из строки, преобразуются в числа, проверяются на соответствие ожидаемому формату и допустимые значения, и результат записывается в переменную
valid. - Если введенная дата верна, то осуществляется проверка количества дней в месяце.
- Если месяц - февраль, то проверяется високосный ли год, а затем устанавливается значение переменной
max_dayсоответственно. - В остальных месяцах устанавливается значение
max_dayв зависимости от месяца.
- Если месяц - февраль, то проверяется високосный ли год, а затем устанавливается значение переменной
- Печатается сообщение о том, верна ли введенная дата.
- Конец программы.