![]() |
AW: Erstellen eines Datum-überprüfers
Leute zum Thema der Osternüberprüfung verstehe ich die letzte Gleichung nicht, da beide Seiten der Gleichung ja nicht immer das gleiche ergeben.
Die Osterformel: So berechnen Sie das Datum a = Jahr mod 4 b = Jahr mod 7 c = Jahr mod 19 d = (19c + 24) mod 30 e = (2a + 4b + 6d + 5) mod 7 f = (c + 11d + 22e) / 451 Der Ostersonntag wird daraus wie folgt errechnet: 22 + d + e - 7f Ist dieses Ergebnis größer als 31, so liegt Ostern im April. Dann muss folgende Formel für die Berechnung des Ostersonntag angewandt werden: 22 + d + e - 7f - 31 = d + e - 7f - 9. Ich habe versucht das mal zum Verständnis in ein Quelltext zu übersetzen, da habe ich für beide Seiten der Gleichung jeweils eine Variable deklariert um zu schauen ob immer dasselbe rauskommt.
Delphi-Quellcode:
var
a, b, c, d, e, f: integer; Jahr: integer; Ostersonntag: integer; OsternApril: integer; Ostern2: integer; begin writeln('Jahr eingeben'); readln(Jahr); a := Jahr mod 4; b := Jahr mod 7; c := Jahr mod 19; d := (19 * c + 24) mod 30; e := (2 * a + 4 * b + 6 * d + 5) mod 7; f := (c + 11 * d + 22 * e) div 451; Ostersonntag := 22 + d + e - 7 * f; if (Ostersonntag > 31) then OsternApril := 22 + d + e - 7 * f - 31; Ostern2 := d + e - 7 * f - 9; writeln(OsternApril); writeln(Ostern2); readln; end. |
AW: Erstellen eines Datum-überprüfers
Zitat:
Da es anscheinend auch noch nicht gestattet ist eigene Methoden zu entwerfen, hier als Fließtext Programm:
Delphi-Quellcode:
program Project33;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var iJahr, iMonat, iTag, iVollmond, iVollmonde, iSonntag, iMetonischerZyklus, iJahrhundert, iSchaltjahre, iMondPhase: Integer; begin try Write('Jahr zur Berechnung des Ostersonntags eingeben: '); Readln(iJahr); iMetonischerZyklus := (iJahr mod 19) + 1; iJahrhundert := (iJahr div 100) + 1; iSchaltjahre := (3 * iJahrhundert) div 4 - 12; iMondPhase := (8 * iJahrhundert + 5) div 25 - 5; iSonntag := (5 * iJahr) div 4 - iSchaltjahre - 10; // überlaufschutz iVollmonde := (11 * iMetonischerZyklus + 20 + iMondPhase - iSchaltjahre) mod 30; if iVollmonde < 0 then iVollmonde := iVollmonde + 30; if ((iVollmonde = 25) and (iMetonischerZyklus > 11)) or (iVollmonde = 24) then iVollmonde := iVollmonde + 1; iVollmond := 44 - iVollmonde; if iVollmond < 21 then iVollmond := iVollmond + 30; iVollmond := iVollmond + 7 - ((iSonntag + iVollmond) mod 7); if iVollmond > 31 then begin iMonat := 4; iTag := iVollmond - 31; end else begin iMonat := 3; iTag := iVollmond; end; Writeln('Ostersonntag war/ist am ' + IntToStr(iTag) + '.' + IntToStr(iMonat) + '.' + IntToStr(iJahr)); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: Erstellen eines Datum-überprüfers
@KodeZwerg Vielen Dank für deinen Lösungsvorschlag, ich hab es jetzt bereits mit einer anderen Berechnungsmethode gelöst
![]() da die eine Berechnungsmethode wenn Ostern auf März fällt ein falsches Datum ausgegeben hat. Hier mein fertiges Programm mit Osterberechnung, freue mich über jeden Verbesserungsvorschlag:-D.
Delphi-Quellcode:
{$APPTYPE CONSOLE}
{$R+,Q+ X-} uses System.SysUtils; var Tag: integer; Monat: integer; Jahr: integer; Schaltjahr: byte; Gültig: byte; SäkZahl: integer; SäkMondSch: integer; SäkSonnenSch: integer; Mondparameter: integer; KeimVollFrüh: integer; Korrektur: integer; Ostergrenze: integer; ErsterSonnMärz: integer; Osterentfernung: integer; OsternMärz: integer; begin write('Bitte den Tag eingeben '); readln(Tag); write('Bitte den Monat eingeben '); readln(Monat); write('Bitte das Jahr eingeben '); readln(Jahr); if (Tag >= 1) and (Tag <= 31) then if (Monat >= 1) and (Monat <= 12) then if (Jahr >= 1) and (Jahr <= 3000) then begin //Berechnung ob Schaltjahr gültig. if (Jahr mod 4 = 0) and (Jahr mod 100 <> 0) or (Jahr mod 400 = 0) then Schaltjahr := 1 else Schaltjahr := 0; case Monat of // Berechnung ob Datum gültig ist. 1, 3, 5, 7, 8, 10, 12: begin if (Tag < 32) then Gültig := 1 else Gültig := 0 end; 4, 6, 9, 11: begin if (Tag < 31) then Gültig := 1 else Gültig := 0 end; 2: begin if ((Tag < 29 + byte(Schaltjahr > 0))) then Gültig := 1 else Gültig := 0 end; end; if Gültig = 1 then begin //Berechnung ob Datum an Ostern liegt. SäkZahl := Jahr div 100; SäkMondSch := 15 + (3 * SäkZahl + 3) div 4 - (8 * SäkZahl + 13) div 25; SäkSonnenSch := 2 - (3 * SäkZahl + 3) div 4; Mondparameter := Jahr mod 19; KeimVollFrüh := (19 * Mondparameter + SäkMondSch) mod 30; Korrektur := (KeimVollFrüh + Mondparameter div 11) div 29; Ostergrenze := 21 + KeimVollFrüh - Korrektur; ErsterSonnMärz := 7 - (Jahr + Jahr div 4 + SäkSonnenSch) mod 7; Osterentfernung := 7 - (Ostergrenze - ErsterSonnMärz) mod 7; OsternMärz := Ostergrenze + Osterentfernung; //Prüfung um welchen Osterntag es sich handelt. if ((Tag = OsternMärz) and (Monat = 3)) or (((Tag = (OsternMärz - 31)) and (Monat = 4))) then writeln(Tag,'.', Monat,'.', Jahr, ' ist gültig und ist Ostersonntag.') else if ((Tag = (OsternMärz - 2)) and (Monat = 3)) or (((Tag = (OsternMärz - 33)) and (Monat = 4))) then writeln(Tag,'.', Monat, '.', Jahr, ' ist gültig und ist Karfreitag.') else if ((Tag = (OsternMärz + 1)) and (Monat = 3)) or (((Tag = (OsternMärz - 30)) and (Monat = 4))) then writeln(Tag, '.', Monat, '.', Jahr, ' ist gültig und ist Ostermontag.') else writeln(Tag,'.',Monat,'.',Jahr, ' ist gültig und liegt nicht an Ostern.') end else writeln('Den ', Tag, '. gibt es in diesem Monat nicht!'); readln; end else begin writeln('Ungültiges Jahr!'); readln; end else begin writeln('Ungültiger Monat!'); readln; end else begin writeln('Ungültiger Tag!'); readln; end; end. |
AW: Erstellen eines Datum-überprüfers
Hättest Du ein paar Jahreszahlen als Beispiel wo es Probleme gibt? Danke!
(entweder ich bin zu müde oder im von Dir verlinkten Artikel steht nichts darüber...) //edit Ich habe Deinen Code nicht getestet aber einen Vorschlag, diese 3 If's als eins zusammenführen
Delphi-Quellcode:
if (((Tag > 0) and (Tag < 32)) and ((Monat > 0) and (Monat < 13)) and ((Jahr > 0) and (Jahr < 9999))) then
Ach nein, Du wertest diese If's einzeln aus. |
AW: Erstellen eines Datum-überprüfers
Zitat:
Wer es sich selber beigebracht hat, ging eh quer durch. Aber wer es in Schule oder Studium gelernt hat kennt das, Stück für Stück, immer ein bisschen was neues. Und genau darum geht es hier.
Delphi-Quellcode:
Stuktur und Verschachtelung.
IF THEN ELSE
Wer mehr machen will, oder es anders machen will der kann das Privat sicher gerne machen. Aber wenn der Test mit diesen Einschränkungen kommt dann sind die halt so. Grundlagen. Grundlagen. Grundlagen. |
AW: Erstellen eines Datum-überprüfers
Zitat:
Hatte bereits ein entsprechendes Beispiel gepostet und es aufgrund des Hinweises geändert. Zitat:
Was ist bei If then else zu beachten. Welche Fallstricke gibt es bei der Nutzung von AND und OR, wann müssen dort Klammern gesetzt werden, wann nicht (Grundzüge der booleschen Algebra). Das Schaltjahr ist halt ein schöner Aufhänger für sowas, weil man die Richtigkeit der Ergebnisse ohne jegliche Hilfsmittel prüfen kann. Man muss wissen: Jahr durch 4, wenn nicht durch hundert, ausser durch 400. Zitat:
Wenn es morgen heißt: Schön, Ihre Lösung gefällt mir. Nächste Aufgabe: Bitte das Gleiche in C++, Java, Python, Basic, was weiß der Geier ... Was hilft es mir da, wenn in Unit xyz von Delphi schon was fertiges drinne ist? Wenn man die Grundlagen der Programmierung im Studium gelernt hat, unabhängig von irgendeiner Programmiersprache, hat man nach dem Studium eine reellle Chance mit der Programmiersprache zu arbeiten, die beim zukünftigen Arbeitgeber zum Einsatz kommt. Wenn ich virtuos mit Delphi und seinen Units und alle den vielen Feinheiten und Besonderheiten, die wir (mehr oder weniger) alle daran so schätzen, umgehen kann, hilft das herzlich wenig, wenn nachher was völlig anderes zum Einsatz kommt. Aber die Grundlagen, die nach dem Studium sitzen sollten, helfen immer weiter, sie sind überall gleich. |
AW: Erstellen eines Datum-überprüfers
hallo,
'Hättest Du ein paar Jahreszahlen als Beispiel wo es Probleme gibt? Danke!' ich nehme mal an, das ich gemeint war. Laut dem code aus #22 340,360,380,400 usw. Ich wollte nur wie in #5 auf die Kalenderreform von 1582 hinweisen Gruß |
AW: Erstellen eines Datum-überprüfers
Zitat:
|
AW: Erstellen eines Datum-überprüfers
Zitat:
Delphi-Quellcode:
Ein Beispiel:
OsterMonat := 3; // -> März
OsterSonntag := 22 + d + e - 7f; if OsterSonntag > 31 then begin OsterMonat := OsterMonat + 1; // -> April // oder OsterMonat := 4; // aus 22 + d + e - 7f wird 22 + d + e - 7f - 31, da 22 - 31 = -9 wird daraus d + e - 7f - 9 OsterSonntag := OsterSonntag - 31; end; Sei 22 + d + e - 7f = 35, so fiele der Ostersonntag auf den 35. März. Den gibt es nicht. Rechnen wird nun mit 22 + d + e - 7f - 31: Wenn wir das etwas umstellen, wird daraus: d + e - 7f + 22 - 31 Nun rechnen wir noch aus, was 22 - 31 ergibt: -9 und tragen dies in die Formel ein. Damit erhalten wir: d + e - 7f - 9. Prinzipiell gilt also: Ist das Ergebnis von 22 + d + e - 7f größer als 31, so rechnen wir auf den Monat eins drauf -> März + 1 = April und ziehen vom 35. März die 31 Tage des März ab. Damit erhalten wir für den Ostersonntag den 4. April. Im Programm brauchen wird die Formel d + e - 7f - 9 schlicht und einfach nicht. Sie ist bestenfalls irreführende Redundanz ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 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-2025 by Thomas Breitkreuz