Nickolay.info. Алгоритмы. Количество дней от даты рождения до сегодняшней

Естественно, задачу можно понимать и как "количество дней от введённой даты до сегодняшней", и как "количество дней между двумя датами".

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

{ Подсчитать число дней от введенной даты до сегодняшнего дня }
program Days;
uses Dos;

const mondays: array [1..12] of integer =
    (31,28,31, 30,31,30, 31,31,30, 31,30,31);
var d,d1,d2,m1,m2,y1,y2:word;

function LeapYear (year:word):boolean;
begin
 if (year mod 4=0) and (year mod 100<>0) or (year mod 400=0) then LeapYear:=TRUE
 else LeapYear:=FALSE;
end;

function CorrectDate (day,mon,year:integer):boolean;
var maxday:integer;
begin
 if (year<0) or (mon<1) or (mon>12) or (day<1) then CorrectDate:=FALSE
 else begin
  maxday:=mondays[mon];
  if (LeapYear (year)=TRUE) and (mon=2) then maxday:=29;
  if (day>maxday) then CorrectDate:=FALSE
  else CorrectDate:=TRUE;
 end;
end;

function KolDays (d1,m1,d2,m2,y:word):word;
var i,f,s:word;
begin
 s:=0;
 if m1=m2 then KolDays:=d2-d1
 else for i:=m1 to m2 do begin
  f:=mondays[i];
  if (LeapYear (y)=TRUE) and (i=2) then f:=f+1;
  if i=m1 then s:=s+(f-d1+1)
  else if i=m2 then s:=s+d2
  else s:=s+f;
  KolDays:=s;
 end;
end;

function CountDays (day1,mon1,year1,day2,mon2,year2:word):word;
var f,i:word;
begin
 f:=0;
 if year1=year2 then CountDays:=KolDays (day1,mon1,day2,mon2,year1)
 else for i:=year1 to year2 do begin
  if i=year1 then f:=KolDays (day1,mon1,31,12,year1)
  else if i=year2 then f:=f+KolDays (1,1,day2,mon2,year2)-1
  else f:=f+KolDays (1,1,31,12,i);
  CountDays:=f;
 end;
end;

begin
 getdate (y2,m2,d2,d);
 writeln ('Год Вашего рождения?');
 readln (y1);
 writeln ('Месяц Вашего рождения?');
 readln (m1);
 writeln ('День Вашего рождения?');
 readln (d1);
 if CorrectDate (d1,m1,y1)=FALSE then begin
  writeln ('Недопустимая дата!');  halt;
 end;
 if (y2<y1) or   ( (y2=y1) and
    ( (m2<m1) or ( (m2=m1) and (d2<d1) ) ) ) then begin
    writeln ('Введенная дата позднее сегодняшней!');    halt;
 end;
 d:=CountDays (d1,m1,y1,d2,m2,y2);
 writeln ('Количество дней= ',d);
 reset (input); readln;
end.

 Калькулятор дат: решение на JavaScript

Рейтинг@Mail.ru

вверх гостевая; E-mail