Einzelnen Beitrag anzeigen

Mo53

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

AW: Erstellen eines Datum-überprüfers

  Alt 17. Mai 2021, 00: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