Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

himitsu 16. Mai 2021 17:11

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

Delphi-Quellcode:
if (Monat >= 1) and (Monat <= 12) then begin

Warum nicht als ELSE im Case?

Mo53 16. Mai 2021 17:30

AW: Erstellen eines Datum-überprüfers
 
Dankeschön, ich habe es nochmal korrigiert, außer das mit dem ersten If da es ja auch überprüft ob der Tag >= 1 ist, falls eine negative Zahl eingegeben wird, sollte es dann die Fehlermeldung anzeigen.

Hier nochmal die korrigierte Version:
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 (Tag <= 28) then
                  writeln(Tag, ' ist zulässig.')
                else
                  writeln(Tag, ' ist unzulässig.');
              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('Der ', Tag,'. ist 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');
                readln;
              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.

TBx 16. Mai 2021 17:54

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

Zitat von himitsu (Beitrag 1489584)
Zitat:

Delphi-Quellcode:
if (Monat >= 1) and (Monat <= 12) then begin

Warum nicht als ELSE im Case?

Hätte man machen können, dann hätte man halt die bestehende Else in ein case für 4,6,9,11 umwandeln müssen.

KodeZwerg 16. Mai 2021 17:58

AW: Erstellen eines Datum-überprüfers
 
Ist es untersagt die von Delphi bereitgestellten Units zu verwenden?
Eigentlich sollte man doch lernen nichts zu programmieren was es nicht schon gibt, also wozu das Rad neu erfinden?
himitsu hat bereits viele vorgefertigte methoden erwähnt.
Ich würde ja nach einem reinen vortest (tag >0 <32) (monat >0 <13)) (jahr >0 <=9999) das ganze in ein TDateTime umwandeln (Delphi-Referenz durchsuchenEncodeDate sollte da Wunder wirken).

Schön zu sehen wie es sich entwickelt, diese ursprünglichen if's waren echt sehr unübersichtlich, Danke an Emil fürs Taggen, das Case ist eine sehr gute alternative Verbesserung, weiter so und Willkommen in der DP!

Delphi.Narium 16. Mai 2021 18:17

AW: Erstellen eines Datum-überprüfers
 
Zum Spaß noch ein Ansatz:
Delphi-Quellcode:
var
  Tag          : Integer;
  Monat        : Integer;
  Jahr         : Integer;
  TagOK        : Boolean;
  MonatOk      : Boolean;
  JahrOk       : Boolean;
  IstSchaltjahr : Boolean;
begin
  write('Bitte den Tag eingeben ');
  readln(Tag);
  write('Bitte den Monat eingeben ');
  readln(Monat);
  write('Bitte das Jahr eingeben ');
  readln(Jahr);
  TagOk        := (Tag  >= 1) and (Tag  <=  31);
  MonatOk      := (Monat >= 1) and (Monat <=  12);
  JahrOk       := (Jahr >= 1) and (Jahr <= 3000);
  IstSchaltJahr := (Jahr mod 4 = 0) and (Jahr mod 100 <> 0) or (Jahr mod 400 = 0);
  if TagOk and MonatOk and JahrOk then
  begin
    case Monat of
      2: case IstSchaltjahr of
           true : TagOk := (Tag <= 29);
           false : TagOk := (Tag <= 28);
         end;
      1, 3, 5, 7, 8, 10, 12 : TagOk := (Tag <= 31);
      4, 6, 9, 11           : TagOk := (Tag <= 30);
    end;
  end;
  writeln('Als Datum wurde der ', Tag,'.', Monat,'.', Jahr,' eingegeben:');
  case TagOk of
    true : writeln('Der Tag ', Tag, ' ist gültig.');
    false : writeln('Der Tag ', Tag, ' ist ungültig.');
  end;
  case MonatOk of
    true : writeln('Der Monat ', Monat, ' ist gültig.');
    false : writeln('Der Monat ', Monat, ' ist ungültig.');
  end;
  case JahrOk of
    true : writeln('Das Jahr ', Jahr, ' liegt im zulässigen Bereich.');
    false : writeln('Das Jahr ', Jahr, ' liegt ausserhalb des zulässigen Bereiches.');
  end;
  case JahrOk and IstSchaltjahr of
    true : writeln('Bei dem Jahr ', Jahr,' handelt es sich um ein Schaltjahr.');
    false : writeln('Bei dem Jahr ', Jahr,' handelt es sich nicht um ein Schaltjahr.');
  end;
  readln;
end.
@KodeZwerg:

Es geht erstmal darum die Grundzüge des Programmierens und die Umsetzung einer Aufgabenstellung in entsprechende Logik zu lernen. Das dazu Delphi benutzt wird, ist nachrangig. Daher ist es momentan noch nicht hilfreich in Delphi vorhanden Funktionalitäten zu nutzen, auch wenn dies eigentlich naheliegend erscheint.

Die delphieigenen Funktionen kann man dann gerne zur Verifizierung der eigenen Ergebnisse nutzen. Dann lernt man direkt beides ;-)

venice2 16. Mai 2021 18:29

AW: Erstellen eines Datum-überprüfers
 
@Delphi.Narium. Super gemacht alles drin und die Rückgabe so wie sie sein sollte.
Kleine Einschränkung Formatierung könnte besser sein. Aber jedem das seine.

Meine wäre so! LOL.. ;)

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

uses
  System.SysUtils;

var
  Tag: Integer;
  Monat: Integer;
  Jahr: Integer;
  TagOK: Boolean;
  MonatOk: Boolean;
  JahrOk: Boolean;
  IstSchaltjahr: Boolean;

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

  TagOK := (Tag >= 1) and (Tag <= 31);
  MonatOk := (Monat >= 1) and (Monat <= 12);
  JahrOk := (Jahr >= 1) and (Jahr <= 3000);

  IstSchaltjahr := (Jahr mod 4 = 0) and (Jahr mod 100 <> 0) or
    (Jahr mod 400 = 0);

  if TagOK and MonatOk and JahrOk then
  begin
    case Monat of
      2:
        case IstSchaltjahr of
          true:
            TagOK := (Tag <= 29);
          false:
            TagOK := (Tag <= 28);
        end;
      1, 3, 5, 7, 8, 10, 12:
        TagOK := (Tag <= 31);
      4, 6, 9, 11:
        TagOK := (Tag <= 30);
    end;
  end;
  writeln('Als Datum wurde der ', Tag, '.', Monat, '.', Jahr, ' eingegeben:');

  case TagOK of
    true:
      writeln('Der Tag ', Tag, ' ist gültig.');
    false:
      writeln('Der Tag ', Tag, ' ist ungültig.');
  end;

  case MonatOk of
    true:
      writeln('Der Monat ', Monat, ' ist gültig.');
    false:
      writeln('Der Monat ', Monat, ' ist ungültig.');
  end;

  case JahrOk of
    true:
      writeln('Das Jahr ', Jahr, ' liegt im zulässigen Bereich.');
    false:
      writeln('Das Jahr ', Jahr, ' liegt ausserhalb des zulässigen Bereiches.');
  end;

  case JahrOk and IstSchaltjahr of
    true:
      writeln('Bei dem Jahr ', Jahr, ' handelt es sich um ein Schaltjahr.');
    false:
      writeln('Bei dem Jahr ', Jahr,
        ' handelt es sich nicht um ein Schaltjahr.');
  end;
  readln;

end.

DieDolly 16. Mai 2021 18:44

AW: Erstellen eines Datum-überprüfers
 
Bei diesem ganzen Case true false werfe ich mal IfThen in den Raum.

venice2 16. Mai 2021 18:47

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

Zitat von DieDolly (Beitrag 1489590)
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..

mmw 16. Mai 2021 19:44

AW: Erstellen eines Datum-überprüfers
 
hallo,

zur Erinnerung

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

wurde aber schon drauf hingewiesen #5

Gruß

Mo53 16. Mai 2021 20:15

AW: Erstellen eines Datum-überprüfers
 
@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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr.
Seite 3 von 4     123 4      

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