Вот, навоял по быстрому. Только программа не учитывает высокосный год, но при желании его без проблем можно туда втюхать. Львинную долю кода занимает парсер строки в надлежащий формат времени и + учёт всех неверных вводов. А так, весь алгоритм сводится к процедуре IncDate. Если не нужен парсер, просто выдерните его из кода и все, а данные задавайте на прямую.
| Код | const CDelim= '.'; {Разделитель} CMonth= 12; {Количество месяцев в году} {Количество дней в каждом месяце} CDay: array[1..CMonth] of byte= (31,28,31,30,31,30,31,31,30,31,30,31);
type {Формат даты} TDate= record day: byte; month: byte; year: word; end;
{-----------------------------------------------} { Функция парсит строку в нужный нам формат TDate. Большая ф-ия только из за того, что предусмотрены все варианты неправильного ввода. Если данные всегда задаются правильно, то можно убрать все условия об ошибках} function ParseDate (s: string; var date: TDate): byte; var i, err: byte; {Позиция поиска, ошибка} begin i:= pos (CDelim, s); {Находим разделитель} if (i = 0) then {"Не правильный формат даты"} begin ParseDate:= 1; exit; end; val(copy (s, 1, i-1), date.day, err); {Выдёргиваем занчение дня} if (err <> 0) then {"Не правильно введён день"} begin ParseDate:= 2; exit; end; delete (s, 1, i); {Убираем использованную часть} i:= pos (CDelim, s); {Находим разделитель} if (i = 0) then {"Не введён месяц"} begin ParseDate:= 3; exit; end; val(copy (s, 1, i-1), date.month, err); {Выдёргиваем занчение месяца} if (err <> 0) then {"Не правильно введён месяц"} begin ParseDate:= 4; exit; end; delete (s, 1, i); {Убираем использованную часть} val(copy (s, 1, length (s)), date.year, err); {Выдёргиваем занчение года} if (err <> 0) then {Не правильно введён год} begin ParseDate:= 5; exit; end; {Проверяем правильность ввода месяца (1 <= месяц <= 12)} if (date.month > CMonth) or (date.month < 1) then begin ParseDate:= 6; exit; end; {Проверяем правильность ввода дня месяца} if (date.day > CDay[date.month]) or (date.day < 1) then begin ParseDate:= 7; exit; end; ParseDate:= 0; end; {-----------------------------------------------} procedure IncDate (var date: TDate); begin inc (date.day); {Если после инкремента день завышен} if (date.day > CDay[date.month]) then begin date.day:= 1; inc (date.month); {Если после инкремента месяц завышен} if (date.month > CMonth) then begin date.month:= 1; inc (date.year); end; end; end; {-----------------------------------------------} var str: string; date: TDate; begin writeln ('Введите дату (пример: 12.02.2009)'); readln (str); case (ParseDate (str, date)) of 0: begin IncDate (date); writeln (date.day, CDelim, date.month, CDelim, date.year); end; 1: writeln ('Не правильный формат даты'); 2: writeln ('Не правильно введён день'); 3: writeln ('Не введён месяц'); 4: writeln ('Не правильно введён месяц'); 5: writeln ('Не правильно введён год'); 6: writeln ('Такого месяца не существует'); 7: writeln ('Для данного месяца не существует такого дня'); end; end.
|
|