Иллюстрированный самоучитель по Turbo Pascal

Биоритмы

В самом общем виде алгоритм подсчета количества дней, разделяющих две даты, описан выше. При его реализации следует учесть три возможных варианта:

  • месячный младенец (год и месяц обеих дат одинаков): количество дней находится простым вычитанием двух чисел;
  • годовалый младенец (год обеих дат совпадает): количество дней = (остаток дней в месяце рождения) + (количество дней в текущем месяце) + (количество дней в месяцах, разделяющих обе даты);
  • общий вариант (отличаются года): количество дней = (количество дней от даты рождения до конца года) + (количество дней в разделяющих даты годах) + (количество дней от начала текущего года до текущей даты).

С учетом этого составим начальный вариант программной реализации процедуры:

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}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.