Биоритмы
В самом общем виде алгоритм подсчета количества дней, разделяющих две даты, описан выше. При его реализации следует учесть три возможных варианта:
- месячный младенец (год и месяц обеих дат одинаков): количество дней находится простым вычитанием двух чисел;
- годовалый младенец (год обеих дат совпадает): количество дней = (остаток дней в месяце рождения) + (количество дней в текущем месяце) + (количество дней в месяцах, разделяющих обе даты);
- общий вариант (отличаются года): количество дней = (количество дней от даты рождения до конца года) + (количество дней в разделяющих даты годах) + (количество дней от начала текущего года до текущей даты).
С учетом этого составим начальный вариант программной реализации процедуры:
GET_NUMBERS_OF_DAYS: Procedure Get_numbers_of_days (d,m,y,d,m,y: Integer; var days: Integer); {Определение полного количества дней, прошедших от одной даты до другой } {--------------------------} Procedure Variant2; {Подсчет количества дней в месяцах,разделяющих обе даты} begin {Variant2} end; {Variant2} {--------------------------} Procedure Variant3; {Подсчет количества дней в месяцах и годах, разделяющих обе даты} begin {Variant3} end; {Variant3} {--------------------------} begin {Get_numbers_of_days} if (y = y0) and (m = m0) then {Даты отличаются только днями: } days: = d – d0 else {Даты отличаются не только днями:} begin days: = d + Size_of_Month [m0] – d0; {Учитываем количество дней в текущем месяце и количество дней до конца месяца рождения} if (y0 mod 4=0) and (m0 = 2) then inc(days); {Учитываем високосный год} if у = y0 then Variant2 {Разница в месяцах одного и того же года} else Variant3 {Даты отличаются годами} end end; {Get_numbers_of_days}
В этом фрагменте используется способ связи вспомогательных процедур VARIANT2 и VARIANT3 с основной процедурой через глобальные переменные, которыми являются параметры обращения к основной процедуре. Вспомогательные процедуры удобнее всего реализовать на основе циклов WHILE:
Procedure Variant2; {Подсчет количества дней в месяцах, разделяющих обе даты } var mm: Integer; begin {Variant2} mm: = m0; while mm < m do begin days: = days + Size_of_Month [mm]; if (mm = 2) and (y0 mod 4=0) then inc (days); inc (mm) end end; {Variant2} {--------------------------} Procedure Variant3; {Подсчет количества дней в месяцах и годах, разделяющих обе даты } var mm/ УУ: Integer; begin {Variant3} mm: = m0 + 1; while mm <= 12 do {Учитываем остаток года рождения:} begin days: = days+Size_of_Month [mm]; if (mm = 2) and (y0 mod 4=0) then inc (days); inc (mm) end; yy: = y0 + 1; while yy < у do {Прибавляем разницу лет:} begin days: = days + 365; if yy mod 4=0 then inc (days); inc (yy) end; mm: = 1; while mm < m do {Прибавляем начало текущего года:} begin days: = days + Size_of_Month [mm]; if (y mod 4=0) and (mm = 2) then inc (days); inc (mm) end end; {Variant3}