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
Mo53

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

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
 
#2

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
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