![]() |
Schaltjahr
So kannst du heraus finden ob die eingegebene Jahreszahl ein Schaltjahr ist:
Delphi-Quellcode:
Beispiel:
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;
Delphi-Quellcode:
...
if Schaltjahr(2004) = True then Label1.Caption := '2004 ist ein Schaltjahr!'; ... |
Re: Schaltjahr
Aus der Delphi Hilfe:
Delphi-Quellcode:
function IsLeapYear(Year: Word): Boolean;
Zitat:
|
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:
|
Re: Schaltjahr
wie war das noch alle 2000 jahre ist ein schaltjahr alle 200 nicht alle 100 wieder oder wie war das ?
|
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: |
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:... |
Re: Schaltjahr
Wie Luckie schon sagte gibt es die Funktion in Delphi bereits, die folgendermassen aussieht:
Delphi-Quellcode:
Und das ist meine etwas schnellere Lösung:
Result := (Year mod 4 = 0) and ((Year mod 100 <> 0) or (Year mod 400 = 0));
Delphi-Quellcode:
Result := ((Year and 3) = 0) and ((Year mod 100 > 0) or (Year mod 400 = 0));
|
Re: Schaltjahr
Und warum ist deine schneller? Ich muss allerdings zu geben, dass sich beide nicht richtig verstehe... :gruebel:
|
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; |
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; |
Re: Schaltjahr
Zitat:
Zitat:
Delphi-Quellcode:
@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++ ... ;)
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 |
Re: Schaltjahr
Zitat:
Eine Addition = 1 Takzyklus Eine Multiplikation = 4 Taktzyklen soweit ist das noch in errinerung hab. :D |
Re: Schaltjahr
Zitat:
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 18:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz