ПРАКТИЧЕСКИЙ ПРИМЕР НА PASCAL
3.1. Задание. Написать программу, позволяющую: вычислять количество дней в том месяце, которому принадлежит заданная дата d; проверять правильность даты d (т.е. чтобы не было 31 июня, 30 февраля и т.д.); подсчитывать, сколько дней прошло от начала нашей эры (1.01.1) до даты d.
Рис. 3.1 Структурная блок-схема Входные и выходные параметры программы Исходными данными для решения этой задачи являются: - число (dd); - месяц (mm); - год (yyyy). Выходные данные: - количество дней (days) в месяце, которому принадлежит заданная дата; - количество дней, прошедших от начала нашей эры (Alldays) до заданной даты.
Листинг программы
Program DATE; var Date: string[11]; {Введённая дата (d)} Day: Shortint; {день} Month: Shortint; {месяц} Year: integer; {год} {Функция возвращает количество дней в указанном месяце. Вход: month - номер месяца Выход: количество дней в указанном месяце} function Days(month: byte): byte; begin case month of {В этих месяцах 31 день: } 1, 3, 5, 7, 8, 10, 12: Days: = 31; {Високосным является каждый четвёртый год кроме каждого сотого, но каждый четырёхсотый} 2: if (Year mod 400 = 0) or ((Year mod 4 = 0) and (Year mod 100 < > 0)) then Days: = 29 else Days: = 28; {Все остальные месяцы - 30 дней} else Days: = 30; end; end; {Функция перевода даты из строкового формата в цифровой и проверки корректности её ввода} function Date2Var(date: string): boolean; var code: integer; p: byte; begin {Предполагаем, что дата введена неверно} Date2Var: = false; {Ищем позицию точки в строке} p: = pos('.', date); {Если точка найдена: } if p < > 0 then begin {преобразовываем значение до точки в число} val(copy(date, 1, p-1), Day, code); {Если преобразование произошло успешно: } if code = 0 then begin {Удаляем символы до точки включительно} delete(date, 1, p); {Ищем следующую точку} p: = pos('.', date); {Если точка найдена: } if p < > 0 then begin {преобразовываем значение до точки в номер месяца} val(copy(date, 1, p-1), Month, code); {Если преобразование произошло успешно: } if code = 0 then begin {Удаляем символы до точки включительно} delete(date, 1, p); {Преобразовываем остаток строки в номер года} val(date, Year, code); {Если преобразование произошло успешно: } if code = 0 then {Проверяем, получились ли положительные числа} if Day > 0 then if (Month > 0) and (Month < = 12) then if Year > 0 then {Проверяем, соответствует ли число дней введённому месяцу} if Days(Month) > = Day then {если все проверки завершились успешно, возвращаем true} Date2Var: = true; end; end; end; end; end; {Функция возвращает количество дней, прошедших с начала эры до указанной даты} function AllDays: longint; var y, tmp: longint; i: integer; begin y: = Year-1; {Находим количество дней, прошедших до начала указанного года} tmp: = y*365 + y div 4 - y div 100 + y div 400; {Прибавляем количество дней до начала указанного месяца} for i: = 1 to Month-1 do tmp: = tmp+Days(i); {Прибавляем количество дней, прошедших в указанном месяце (не считая последний)} tmp: = tmp + Day-1; {Присваиваем функции возвращаемый результат} AllDays: = tmp; end; {Начало основной программы} begin write('Введите дату в формате dd.mm.yyyy: '); readln(Date); if not Date2Var(Date) then writeln('Дата введена неверно! ') else begin writeln('Во введённом месяце дней: ', Days(Month)); writeln('От начала эры прошло дней: ', AllDays); writeln('Нажмите Enter для выхода...'); readln; end; end.
|