2 helat
Сообщение от
helat
http://www.kursovik.com/programming/109011.html
Расчет количества дней между датами
Программа расчитывает количество дней между двумя датами, заданных тремя чслами - год, месяц, день.
Расчет ведется по всем правилам, с учетом високосных годов.
нужен сабж на паскале (Pascal)
Вот тоже решил написать свой вариан. Когда тестил, использовал ссылку которую ты привел. Также проверил програмку от G1yuK (от Dumkopff запустить неудалось). Вывод такой - програмка приведенная по ссылке и предложеная G1yuK ошибается на единицу если второй (большей) датой ставим високосный год. Тестил на таких примерах:
1984.01.01 Первая дата
1984.02.29 Вторая дата
Результат = 59
Если ставим
1984.01.01 Первая дата
1984.03.01 Вторая дата
Результат = 59 (Тоже !!!!)
Хотя 1984 год есть високосный и разница между 1 января и 1 марта - 60 дней.
Если взять даты:
1984.01.01 Первая дата
1984.12.31 Вторая дата
Результат = 364 (неверно, должно быть 365!!!)
Если ставим
1984.01.01 Первая дата
1985.01.01 Вторая дата
Результат = 366 (Правильно, НО КУДА ДЕЛСЯ 365 день?)
Еще ты жаловался на "мудреный" код от Dumkopff.
Привожу свою реализацию. Алгоритм и код очень простой, и у меня нету этой ошибки в високосным годом. Прошу потестить может и я где ошибся

Да и еще программа простая но есть минусы: не проверяет правильность введеной даты, не проверяет соответсвие дней месяцу т.е. можно написать 2000.02.35. Но при корректном вводе считает правильно (я надеюсь).
Код:
uses crt;
type
mymas=array[1..12] of integer;
const d1:mymas=(0,31,59,90,120,151,181,212,243,273,304,334); {Dlya NE vicokosnogo}
d2:mymas=(0,31,60,91,121,152,182,213,244,274,305,335); {Dlya vicokosnogo}
var data:string[10];
d:mymas;
god,mes,den,kol_v:integer;
kol_dney:array[1..3] of longint;
er,i:integer;{for error and cikl :)}
begin
clrscr;
for i:=1 to 2 do
begin
readln(data); {GGGG.MM.DD}
Val(Copy(data,1,4),god,er);
Val(Copy(data,6,2),mes,er);
Val(Copy(data,9,2),den,er);
{Proverka na "visokosnost"}
if ((god mod 4)=0) and (((god mod 100)<>0)or((god mod 400)=0)) then d:= d2 {Dlya vicokosnogo}
else d:= d1;{Dlya NE vicokosnogo}
kol_v:=((god-1) div 4)-((god-1) div 100)+((god-1) div 400);
kol_dney[i]:=god*365+kol_v+d[mes]+den;
end;
kol_dney[3]:=kol_dney[2]-kol_dney[1];
writeln(kol_dney[3],' Days');
write('HAI+IMUTE ''Enter'' DLYA BUXODA');
readln;
end.