Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Erstellen eines Datum-überprüfers (https://www.delphipraxis.net/207917-erstellen-eines-datum-ueberpruefers.html)

DieDolly 16. Mai 2021 12:55

AW: Erstellen eines Datum-überprüfers
 
Es ist jedem Schüler oder Studenten selber überlassen, seinen Code so anzulegen, dass er verständlich ist.
Da interessiert es wenig, was eine Lehrperson dazu sagt.

himitsu 16. Mai 2021 12:55

AW: Erstellen eines Datum-überprüfers
 
Einige Ausgaben sind mit einem ReadLn am Ende, aber andere nicht.
Wobei, wenn alle Ausgaben es hätten, dann würde es auch reichen das hinter allem Code zu machen, also nur einmal ganz am Ende.


Vor allem ist eine halbwegs orgendliche Formatierung/Einrückung auch dafür gut, dass man den Programmablauf besser erkennen kann.
Das, was man mit dem Debugger physisch machen kann, kann man so auch mit dem Finger durchgehn,
also wo wann das Programm durchläuft, wenn man sich eine gewisse Anfangsbedingung (Tag/Monat/Jahr) überlegt hat.

Ja, der Style-Guide ist mehr ein Vorschlag und keine Pflicht, aber um erstmal überhaupt ein bischen Struktur in seinen Code zu bekommen, darf man da gern sich das Eine oder Andere abgucken.

Mo53 16. Mai 2021 13:05

AW: Erstellen eines Datum-überprüfers
 
Ich habe jetzt das nochmal überarbeitet und zusammengefasst, jetzt besteht aber das Problem das das Programm nach der Abfrage des Datums endet.
Der Debugger hat mir hierzu auch nichts mitgeteilt.

Delphi-Quellcode:
{$APPTYPE CONSOLE}
{$R+,Q+ X-}

uses
  System.SysUtils;


var
  Tag: integer;
  Monat: integer;
  Jahr: 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
                 case Monat of
                 2: if(Jahr mod 4 = 0) and (Jahr mod 100 <> 0) or (Jahr mod 400 = 0) and (Tag = 29)
                 then writeln(Tag,' ist zulässig');
                 1,3,5,7,8,10,12: if (Tag <= 31) then writeln('Der ',Tag,'. ist gültig.');
                 4,6,9,11: if (Tag <= 30) then writeln('Der ',Tag,'. ist gültig.');
                else
                writeln('ungültig')
                end;
                end


      else
      begin
      writeln('Jahr ungültig.');
      readln;
      end

     else
     begin
     writeln('Monat ungültig.');
     readln;
     end

    else
    begin
    writeln('Tag ungültig.');
    readln;
    end;



  end.

mmw 16. Mai 2021 13:06

AW: Erstellen eines Datum-überprüfers
 
vielleciht hilft dies : ungetestet

Delphi-Quellcode:
var
Tag: integer;
Monat: integer;
Jahr: integer;
anzahl_tage:Byte;

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)) and ((monat>=1) and (monat<=12)) and (jahr>1582) then begin

  if (Jahr mod 4 = 0) and (Jahr mod 100 <> 0) or (Jahr mod 400 = 0) then anzahl_tage:=29 else anzahl_tage:=28;

    case monat of
     1,3,5,7,8,10,12:if (tag>=1) and (tag<=31) then writeln('Datum Ok.') else writeln('Datum nicht Ok.');
     2:if (tag>=1) and (tag<=anzahl_tage) then writeln('Datum Ok.') else writeln('Datum nicht Ok.')
      else
       if (tag>=1) and (tag<=30) then writeln('Datum Ok.') else writeln('Datum nicht Ok.');
   end;
  end else

  writeln('Eingabe ungültig');

    readln;
end.

DieDolly 16. Mai 2021 13:12

AW: Erstellen eines Datum-überprüfers
 
Zitat:

jetzt besteht aber das Problem das das Programm nach der Abfrage des Datums endet.
Ich habe im ganzen Thread bisher nicht einen Kommentar gesehen, wo der Delphi Style Guide auch nur annähernd respektiert wird.
Respektiert man den, würde man Fehler, so denke ich, sofort finden.

Drückt im Editor mal STRG+D und benutzt begin und end etwas öfter!

Delphi.Narium 16. Mai 2021 13:25

AW: Erstellen eines Datum-überprüfers
 
Nochmal einen Abschnitt überarbeitet:
Delphi-Quellcode:
if (Jahr >= 1) and (Jahr <= 3000) then begin
  case Monat of
    2: begin
         if (Jahr mod 4 = 0) and (Jahr mod 100 <> 0) or (Jahr mod 400 = 0) and (Tag = 29) then begin
           writeln(Tag,' ist zulässig');
         end;
         // Hier fehlt wohl eine Else.
         // Was soll denn bitteschön in einem Nichtschaltjahr geschehen?
         // Und was ist mit den übrigen Tagen das Februar?
       end;
    1,3,5,7,8,10,12: begin
                       if (Tag <= 31) then begin
                         writeln('Der ',Tag,'. ist gültig.');
                       end;
                       // Else mit Hinweis auf ungültigen Tag?
                     end;
    4,6,9,11: begin
                if (Tag <= 30) then begin
                  writeln('Der ',Tag,'. ist gültig.');
                end;
                // Else mit Hinweis auf ungültigen Tag?
              end;
  else
    writeln('ungültig')
  end;
end;
@DieDolly
Der Delphi-Style-Guide ist eine herstellerinterne Richtlinie und nicht allgemeinverbindlich.

Man kann sich dran halten, muss man aber nicht.

Abgesehen davon: Wenn man sich dran hällt, heißt das noch lange nicht, dass es hier im Forum dann auch so angezeigt wird. Der Parser für die Syntaxhervorhebung innerhalb der Delphi-Tags hat da durchaus seine eigenen Ansichten. (Sieht man hier z. B. sehr gut bei den Case-Anweisungen. Im Editor sehen die vollkommen anders aus.
[edit]
Abgesehen davon, dass wohl auch Browser und dort gewählte Schriftart und -größe die Optik und Style-Guide-Konformität massiv zu beeinflussen scheinen (sowohl positiv als auch negativ, ja nach dem, was da so genutzt wird.)
[/edit])

PS: Poste doch bitte eine korrekte Lösung, die allen Deinen Anforderungen entspricht.
Dann können wir das gerne als ultimativ richtig interpretieren ;-)

Mo53 16. Mai 2021 15:58

AW: Erstellen eines Datum-überprüfers
 
@Delphi.Narium Vielen Vielen Dank für deine Hilfe, ich müsste es jetzt hinbekommen haben. Wenn ihr noch einen Fehler entdeckt könnt Ihr mich gerne darauf hinweisen.
Jetzt fehlt mir nur noch das Integrieren einer Berechnung ob an diesem Tag Ostern ist, dann kann ich es abgeben.:-D

Delphi-Quellcode:
{$APPTYPE CONSOLE}
{$R+,Q+ X-}

uses
  System.SysUtils;

var
  Tag: integer;
  Monat: integer;
  Jahr: 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

        case Monat of
          2:
            begin
              if (Jahr mod 4 = 0) and (Jahr mod 100 <> 0) or (Jahr mod 400 = 0)
              then
              begin
                if (Tag <= 29) then
                begin
                  writeln(Tag, ' ist zulässig.');
                  readln;
                end
                else
                begin
                  writeln(Tag, ' ist unzulässig.');
                  readln;
                end;
              end
              else
              begin
                if not(Jahr mod 4 = 0) and not(Jahr mod 100 <> 0) or
                  not(Jahr mod 400 = 0) then
                begin
                  if (Tag <= 29) then
                  begin
                    writeln(Tag, ' ist unzulässig.');
                    readln;
                  end;
                end;
              end;
            end;

          1, 3, 5, 7, 8, 10, 12:
            begin
              if (Tag <= 31) then
              begin
                writeln('Der ', Tag, '. ist gültig.');
                readln;

              end
              else
              begin
                writeln('ungültig');
                readln;
              end;

            end;

          4, 6, 9, 11:
            begin
              if (Tag <= 30) then
              begin
                writeln('Der ', Tag, '. ist gültig.');
                readln;
              end

              else
              begin
                writeln('ungültig');
              end;

            end;

        end

      else
      begin
        writeln('Jahr ungültig.');
        readln;
      end

    else
    begin
      writeln('Monat ungültig.');
      readln;
    end

  else
  begin
    writeln('Tag ungültig.');
    readln;
  end;

end.

Delphi.Narium 16. Mai 2021 16:08

AW: Erstellen eines Datum-überprüfers
 
Suchmaschine marsch: ostern formel
Code:
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.

himitsu 16. Mai 2021 16:19

AW: Erstellen eines Datum-überprüfers
 
Zitat:

Zitat von Mo53 (Beitrag 1489579)
Wenn ihr noch einen Fehler entdeckt könnt Ihr mich gerne darauf hinweisen.

Monat 2 und darin vom If das Else.

Und nun schau dir darin alles nochmals ganz genau an.



Wozu "nochmal" das IF für Schaltjahre?
Es wurde schon geprüft, also kann es dort nur negativ sein. (gut, denn so ist es egal, dass es kein Else gibt)

Aber rate mal, was
Delphi-Quellcode:
if (Tag <= 29) then
macht, wenn der Tag 30 oder 31 ist.



Probiere auch mal den 31 April, also was dein Programm da macht. (oder auch nicht)

Und bei den 31-tägigen Monaten. (Januar, März, ...)
Grundsätzlich wäre dort das ELSE nicht ganz falsch, aber schau mal in die ersten 3 IFs ... Bist du der Meinung, dass hier jemals der Tag größer als 31 sein kann?
(oder einfach das erste IF für den Tag weglassen, da innen eh nochmals der Tag überall geprüft wird)

TBx 16. Mai 2021 16:55

AW: Erstellen eines Datum-überprüfers
 
Ich würde die Prüfung vom Jahr über den Monat zum Tag herunter abarbeiten.
Und dem Nutzer nach Möglichkeit auch gleich verraten, was an seinem Wert falsch ist.
Beispiel:
Delphi-Quellcode:
program ueb03;

{$APPTYPE CONSOLE}
{$R+,Q+ X-}

uses
  SysUtils;

var
  Tag: integer;
  Monat: integer;
  Jahr: integer;
  MaxTage: integer;

begin
  write('Bitte den Tag eingeben ');
  readln(Tag);
  write('Bitte den Monat eingeben ');
  readln(Monat);
  write('Bitte das Jahr eingeben ');
  readln(Jahr);

  if (Jahr >= 1) and (Jahr <= 3000)then begin
    writeln ('Jahr OK');
    if (Monat >= 1) and (Monat <= 12) then begin
      writeln ('Monat OK');
      case Monat of
        1,3,5,7,8,10,12: begin
          MaxTage := 31;
        end;
        2: begin
          if (
              (Jahr mod 4 = 0) and
              (Jahr mod 100 <> 0)
             ) or
             (Jahr mod 400 = 0) then begin
               MaxTage := 29;
          end
          else
          begin
            MaxTage := 28;
          end;
        end;
        else begin
          MaxTage := 30;
        end;
      end;
      if (Tag >=1) and (Tag <= MaxTage) then begin
        writeln ('Tag OK');
        // an dieser Stelle kann man dann noch solche Dinge wie Osterprüfung etc. einbauen und den User informieren
      end
      else begin
        writeln ('Tag ungültig: Wert muss zwischen 1 und '
                   + IntToStr(MaxTage) + ' liegen!');
      end;
    end
    else begin
      writeln('Monat ungültig: Wert muss zwischen 1 und 12 liegen!');
    end;
  end
  else begin
    writeln('Jahr ungültig: Wert muss zwischen 1 und 3000 liegen');
  end;
  writeln ('Bitte ENTER drücken');
  readln;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:41 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz