Определим дату как запись, состоящую из полей: год, месяц и день. Написать функцию определения количества дней, прошедших от заданной даты до другой, не включая сами даты — Pascal(Паскаль)

Type Year=1583..3000;
Month_number=1..12;
Day=1..12;
Date=Record
dyear:year;
dmonth:month_number;
dday:day;
End;

Год считается високосным (366 дней), если он не последний год столетия и делится без остатка на 4. Кроме того, последний год любого столетия считается високосным годом только в том случае, если его номер делится на 400.
uses crt;
type
year=1583..3000;
month_number=1..12;
day=1..31;
date=record
     dyear:year;
     dmonth:month_number;
     dday:day;
     end;
{функция определения високосного года}
function Visok(n:year):boolean;
begin
if ((n mod 100<>0)and(n mod 4=0))or(n mod 400=0)
then Visok:=true else Visok:=false;
end;
{функция подсчета прошедщих дней в текущем году}
function Dn_gd(a:date):word;
var k,k2:word;
begin
if Visok(a.dyear)then k2:=60 else k2:=59;
case a.dmonth of
1:k:=a.dday;
2:k:=31+a.dday;
3:k:=k2+a.dday;
4:k:=k2+31+a.dday;
5:k:=k2+61+a.dday;
6:k:=k2+92+a.dday;
7:k:=k2+122+a.dday;
8:k:=k2+153+a.dday;
9:k:=k2+184+a.dday;
10:k:=k2+214+a.dday;
11:k:=k2+245+a.dday;
12:k:=k2+275+a.dday;
end;
Dn_gd:=k;
end;
{основная функция определия количества прошедших дней}
function Kol_dn(a,b:date):longint;
var k:longint;
    i:year;
begin
if a.dyear=b.dyear then k:=Dn_gd(b)-Dn_gd(a)-1
else if b.dyear-a.dyear=1 then
 if Visok(a.dyear)then k:=366-Dn_gd(a)+Dn_gd(b)-1
 else k:=365-Dn_gd(a)+Dn_gd(b)-1
else
 begin
  if Visok(a.dyear)then k:=366-Dn_gd(a)+Dn_gd(b)-1
  else k:=365-Dn_gd(a)+Dn_gd(b)-1;
  for i:=a.dyear+1 to b.dyear-1 do
  if Visok(i) then k:=k+366
  else k:=k+365;
 end;
Kol_dn:=k;
end;
{проверка правильности ввода даты}
function Prov(d:date):boolean;
var k:byte;
begin
Prov:=true;
if(d.dyear<1583)or(d.dyear>3000)
or not(d.dmonth in [1..12])
or(d.dday<1)or(d.dday>31)
or((d.dmonth in [4,6,9,11])and(d.dday=31))
or((d.dmonth=2)and Visok(d.dyear) and (d.dday>29))
or((d.dmonth=2)and not Visok(d.dyear) and (d.dday>28))
then Prov:=false;
end;
var a,b,x:date;
begin
clrscr;
x.dyear:=1583;{зададим начальное значение для проверки ввода дат}
x.dmonth:=1;
x.dday:=1;
repeat
writeln('Введите 2 даты в формате дд_мм_гггг вторая позднее:');
repeat
write(' дата 1 - ');
readln(a.dday,a.dmonth,a.dyear);
if not Prov(a) then writeln('Ошибка, повторите ввод.');
until Prov(a);
repeat
write(' дата 2 - ');
readln(b.dday,b.dmonth,b.dyear);
if not Prov(b) then writeln('Ошибка, повторите ввод.');
until Prov(b);
if Kol_dn(x,a)>Kol_dn(x,b) then{проверяем сколько прошло до первой и второй дат}
writeln('Вторая дата меньше первой, повторите ввод.');
until Kol_dn(x,a)<=Kol_dn(x,b);
writeln('Между этими датами(исключая их) прошло ',Kol_dn(a,b),' дн.');
readln
end.

Leave a Comment

84 + = 89