Показать сообщение отдельно

  #7  
Старый 09.11.2007, 00:25
Red_Red1
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
С нами: 10172486

Репутация: 874
По умолчанию

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.

Последний раз редактировалось Red_Red1; 09.11.2007 в 00:29..
 
Ответить с цитированием