Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schaltjahr (https://www.delphipraxis.net/11729-schaltjahr.html)

bixi400 12. Nov 2003 17:54


Schaltjahr
 
So kannst du heraus finden ob die eingegebene Jahreszahl ein Schaltjahr ist:

Delphi-Quellcode:
function Schaltjahr(year:Integer):Boolean;
 var v:Integer;
     x:Real;
begin
  x := year / 4;
  v := trunc ( x );
  if ((x > v)and(x < v+1)) then
   Schaltjahr := False
    else
   Schaltjahr := True;
end;
Beispiel:
Delphi-Quellcode:
...
  if Schaltjahr(2004) = True then
   Label1.Caption := '2004 ist ein Schaltjahr!';
...

Luckie 12. Nov 2003 17:55

Re: Schaltjahr
 
Aus der Delphi Hilfe:
Delphi-Quellcode:
function IsLeapYear(Year: Word): Boolean;
Zitat:

Call IsLeapYear to determine whether the year specified by the Year parameter is a leap year. Year specifies the calendar year.
Unit: SysUtils (D6)

himitsu 12. Nov 2003 18:09

Re: Schaltjahr
 
Das hatte ich hier schon mal verbrockt.
Und wenn du dir mal die Berechnung für Februar anschaust, wirst du bemerken, das nicht jedes durch 4 teilbare Jahr ein Schaltjahr ist. :mrgreen:

Zitat:

Zitat von himitsu
In 'nem Schaltjahr gibt es sogar noch einen 29-Tage-Monat.

Das hier hatte ich mal nach dem gregorianisch-julianischen Kalender (des ist der aktuelle) erstellt.
(das stimmt etwas seit dem 15. Jahrhundert (1583 in Deutschand) bis ...)
Delphi-Quellcode:
Function TageImMonat(Monat, Jahr: Integer): Integer;
  Begin
    Case Monat of
      1, 3, 5, 7, 8, 10, 12: Result := 31;
      4, 6, 9, 11: Result := 30;
      2: If ((Jahr div 4 = 0) and (Jahr div 100 <> 0)) or (Jahr div 400 = 0) Then
           Result := 29 Else Result := 28;
      Else Result := -1;
    End;
  End;


HomerGER 12. Nov 2003 18:15

Re: Schaltjahr
 
wie war das noch alle 2000 jahre ist ein schaltjahr alle 200 nicht alle 100 wieder oder wie war das ?

himitsu 12. Nov 2003 18:30

Re: Schaltjahr
 
:warn: Alle 4 Jahre ist eins, es sei denn das Jahr ist durch 100 teilbar.
Aber wenn es auch noch duch 400 teilbar ist, ist es wieder eins, daher war das Jahr 2000 auch ein Schaltjahr, während das Jahr 1900 kein's war. :mrgreen:

sakura 12. Nov 2003 18:59

Re: Schaltjahr
 
Aufgrund dessen, daß obiger Code die beiden Ausnahmen (alle 100 Jahre, alle 400 Jahre) nicht berücksichtigt, schiebe ich den mal aus der CodeLib raus. Ausserdem gibt es ja noch IsLeapYear, wie Luckie schon angemerkt hat ;-)

...:cat:...

Daniel B 12. Nov 2003 19:00

Re: Schaltjahr
 
Wie Luckie schon sagte gibt es die Funktion in Delphi bereits, die folgendermassen aussieht:
Delphi-Quellcode:
Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
Und das ist meine etwas schnellere Lösung:
Delphi-Quellcode:
Result := ((Year and 3) = 0) and ((Year mod 100 > 0) or (Year mod 400 = 0));

Luckie 12. Nov 2003 19:06

Re: Schaltjahr
 
Und warum ist deine schneller? Ich muss allerdings zu geben, dass sich beide nicht richtig verstehe... :gruebel:

himitsu 14. Nov 2003 11:09

Re: Schaltjahr
 
Hab bei mir 'nen kleine Fehler entdekt. :oops:
(DIV zu MOD geändert)

Delphi-Quellcode:
Function TageImMonat(Monat, Jahr: Integer): Integer;
  Begin
    Case Monat of
      1, 3, 5, 7, 8, 10, 12: Result := 31;
      4, 6, 9, 11: Result := 30;
      2: If ((Jahr mod 4 = 0) and (Jahr mod 100 <> 0)) or (Jahr mod 400 = 0) Then
           Result := 29 Else Result := 28;
      Else Result := -1;
    End;
  End;

Phoenix 14. Nov 2003 12:04

Re: Schaltjahr
 
Das find ich schicker:

Delphi-Quellcode:
uses SysUtils;

function TageImMonat(const Monat, Jahr: integer): integer;
const
   TageImSchaltMonat: array[1..12] of integer = (31,29,31,30,31,30,31,31,30,31,30,31);
   TageImMonat: array[1..12] of integer = (31,28,31,30,31,30,31,31,30,31,30,31);
begin
   if isLeapYear(Jahr) then
      result := TageImSchaltMonat[Monat]
   else
      result := TageImMonat[Monat];
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz