AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Erstellen eines Datum-überprüfers

Ein Thema von Mo53 · begonnen am 16. Mai 2021 · letzter Beitrag vom 17. Mai 2021
Antwort Antwort
venice2
(Gast)

n/a Beiträge
 
#1

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 19:47
Bei diesem ganzen Case true false werfe ich mal IfThen in den Raum.
Warum? Um dann diesen ganzen IFThen Kram zu haben? Wo soll da der Vorteil liegen.

tsss..
  Mit Zitat antworten Zitat
mmw
(Gast)

n/a Beiträge
 
#2

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 20:44
hallo,

zur Erinnerung

https://www.geo.de/geolino/mensch/25...der-29-februar


wurde aber schon drauf hingewiesen #5

Gruß

Geändert von mmw (16. Mai 2021 um 20:46 Uhr)
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 21:15
@KodeZwerg

Leider ist uns die Benutzung von Dingen die wir noch nicht hatten untersagt.
Ich verstehe ehrlich gesagt auch nicht warum die uns das Leben nicht leichter machen, aber ich denke die machen das um uns das zu veranschaulichen.
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 21:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Erstellen eines Datum-überprüfers

  Alt 17. Mai 2021, 00:46
a, b, c, d, e, f: integer;
Und was bedeuten diese Variablen-Namen??? Gewöhne es dir bitte ab das so zu schreiben, die Mitglieder hier würden es dir danken!

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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Erstellen eines Datum-überprüfers

  Alt 17. Mai 2021, 01:29
@KodeZwerg Vielen Dank für deinen Lösungsvorschlag, ich hab es jetzt bereits mit einer anderen Berechnungsmethode gelöst https://praxistipps.focus.de/ostern-...D%20d%2Be-7f-9.
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.

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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Erstellen eines Datum-überprüfers

  Alt 17. Mai 2021, 01:53
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 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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (17. Mai 2021 um 02:12 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.554 Beiträge
 
Delphi 7 Professional
 
#8

AW: Erstellen eines Datum-überprüfers

  Alt 17. Mai 2021, 21:54
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.
Die Formulierung ist vielleicht etwas unglücklich. Gemeint ist schlicht und einfach:
Delphi-Quellcode:
  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;
Ein Beispiel:

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 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