Delphi-PRAXiS

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;

MathiasSimmack 14. Nov 2003 12:09

Re: Schaltjahr
 
Zitat:

Zitat von Luckie
Und warum ist deine schneller?

Ich glaube, die nehmen sich nicht viel. Echte Unterschiede dürften wohl nur messbar sein, und dann auch nur mit einem extrem genauen Timer.

Zitat:

Ich muss allerdings zu geben, dass sich beide nicht richtig verstehe...
Wieso nicht? Ergibt sich doch aus der Beschreibung eines Schaltjahres:
Delphi-Quellcode:
Result :=
  // das Jahr muss durch 4 ohne Rest
  // teilbar sein

  // 2000 / 4 = 500 (Rest 0)
  // 1900 / 4 = 475 (Rest 0)

  (Year mod 4 = 0)

  // UND
  and

  // es muss mit Rest durch 100
  // teilbar sein

  // 2000 / 100 = 20 (Rest 0) = Bedingung stimmt (noch) nicht
  // 1900 / 100 = 19 (Rest 0) = Bedingung stimmt (noch) nicht

  ((Year mod 100 <> 0)

  // bzw.
    or

  // ohne Rest durch 400

  // 2000 / 400 = 5 (Rest 0) = Bedingung für 2000 stimmt jetzt!
  // 1900 / 400 = 4 (Rest 300) = Bedingung für 1900 stimmt NICHT!

   (Year mod 400 = 0));

  // DANN ist es ein Schaltjahr, und darum war 2000 ein
  // Schaltjahr, aber 1900 nicht
@Phoenix: Ein Array reicht auch. Nimm das normale, mit den 28 Tagen für Februar. Dann holst du dir im ersten Schritt den Tag für den Monat, und im zweiten Schritt prüfst du, ob das Jahr ein Schaltjahr ist und der Monat der Februar - wenn Ja, Tag++ ... ;)

Daniel B 14. Nov 2003 13:21

Re: Schaltjahr
 
Zitat:

Zitat von MathiasSimmack
Ich glaube, die nehmen sich nicht viel. Echte Unterschiede dürften wohl nur messbar sein, und dann auch nur mit einem extrem genauen Timer.

Ich hab halt zwei multiplikation und eine addition statt drei multiplikationen, die addition ist halt um ein paar Takte schneller. ;)
Eine Addition = 1 Takzyklus
Eine Multiplikation = 4 Taktzyklen soweit ist das noch in errinerung hab. :D

MathiasSimmack 14. Nov 2003 14:00

Re: Schaltjahr
 
Zitat:

Zitat von Daniel B
Zitat:

Zitat von MathiasSimmack
Ich glaube, die nehmen sich nicht viel. Echte Unterschiede dürften wohl nur messbar sein, und dann auch nur mit einem extrem genauen Timer.

Ich hab halt zwei multiplikation und eine addition statt drei multiplikationen, die addition ist halt um ein paar Takte schneller. ;)
Eine Addition = 1 Takzyklus
Eine Multiplikation = 4 Taktzyklen soweit ist das noch in errinerung hab. :D

Multiplikation? Ist mod nicht eine ... *kicher* Modulation?

Nein, ernsthaft -
Meine persönliche Meinung, in der Musik mögen 3 Takte mehr oder weniger entscheidend sein. In dem Fall hier kann man sie IMHO vernachlässigen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr.

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