Forum > General

problem with leap year to count.

(1/2) > >>

mikex:
Hi there

I have written program for school work 2 times but i cant figure out the problem. First time my program didn't counted dates like 1.1.2005 - 1.1.2007

Then I fixed that by deleting  small part and rewriting it but now it dont count the leap year .. i need it exactly from calendar .. 2012 .. 2016.. but its impossible task for me now. I have no time left to try it and fail gain.

Commentery and counters are in my language but it does not rly matter ... ;)

Any kind of help with that would be lovely. Thanks.
var d1,d2,m1,m2,r1,r2,i,x,r1i,r2i: integer;     mesic31, mesic30: set of byte;     dni,dni2: longint;     v:array[1..12] of integer;   begin write('den1='); readln(d1); write('mesic1=');readln(m1); write('rok1=');readln(r1); write('den2=');readln(d2); write('mesic2=');readln(m2); write('rok2=');readln(r2); mesic31:=[1,3,5,7,8,10,12]; {mesice ktere maji 31 dni} mesic30:=[4,6,9,11];          {mesice ktere maji 30 dni}   r1i:=r1;r2i:=r2;       for i:=1 to 12 do begin     if i in mesic31 then     v:=31;     if i in mesic30 then     v:=30;     if i=2 then      {unor ma 28 dni}     v:=28; end;                     {rozdelime program do dvou casti: dni a dni2 , dni v rozmezi jednoho roku nebo vice let} dni:=0; for i:=m1 to 12 do         dni:=dni+v;         dni:=dni-d1; for i:=m2-1 downto 1 do         dni:=dni+v;         dni:=dni+d2; r2:=r2-1;   x:=(r2-r1) div 4;               {jednou za 4 roky pridame jeden den prestupniho roku} dni:=dni+(365*(r2-r1))+x;   dni2:=0;   for i:=m1 to m2-1 do          dni2:=dni2+v;          dni2:=dni2-d1+d2; if r1i=r2i then writeln('pocet dni je ',dni2) else writeln('pocet dni je ',dni);   readln; end.

engkin:
Number of days in the 2nd month of any year is a function to the year itself. It seems to me that your code assumes a fixed number: 28 days.

--- Code: ---  for i := 1 to 12 do
begin
..
if i = 2 then {unor ma 28 dni}
v[i] := 28; //<------
end;

--- End code ---

When you use it later in this part:

--- Code: ---  for i := m1 to 12 do
dni := dni + v[i];

--- End code ---
You should consider r1.

While for next part:

--- Code: ---  for i := m2 - 1 downto 1 do
dni := dni + v[i];

--- End code ---
You should consider r2.

This calculation is an approximation, but is not correct for your purpose.

--- Code: ---  x := (r2 - r1) div 4; {jednou za 4 roky pridame jeden den prestupniho roku}
dni := dni + (365 * (r2 - r1)) + x;

--- End code ---
For instance, when r1 is a leap year consider the effect of having d1, m1 prior to the leap day of that year vis. after that day. On the other hand, not every four years include a leap year.

Windsurfer:
I have not read your code, but a year is a leap year if it is divisible by 4 unless it is divisible by 100 unless it is divisible by 1000.

Note the second 'unless'. This means that all years divisible by 1000 are NOT leap years. This is a common mistake.

engkin:

--- Quote from: Windsurfer on November 22, 2014, 10:15:37 am ---I have not read your code, but a year is a leap year if it is divisible by 4 unless it is divisible by 100 unless it is divisible by 1000.

Note the second 'unless'. This means that all years divisible by 1000 are NOT leap years. This is a common mistake.

--- End quote ---
It is 400, not 1000. I know you won't take my word for it  :P, so here is Wikipedia:

--- Quote ---if (year is not divisible by 4) then (it is a common year)
else
if (year is not divisible by 100) then (it is a leap year)
else
if (year is not divisible by 400) then (it is a common year)
else (it is a leap year)

--- End quote ---

marcov:
Dateutils has

--- Code: ---Function IsInLeapYear(const AValue: TDateTime): Boolean;

--- End code ---

Navigation

[#] Next page

Go to full version