Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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)

Mo53 16. Mai 2021 01:32

Delphi-Version: 10.3 Rio

Erstellen eines Datum-überprüfers
 
Hallo,
Ich habe das Fach Programmstrukturen 1 an der Fachhochschule, nun müssen wir ein Programm schreiben das ein Datum überprüft, natürlich auch ob Schaltjahr ist oder nicht.
Jetzt wird bei mir alles korrekt überprüft außer das Schaltjahr, da bleibt der Compiler immer stehen wenn es kein Schaltjahr ist.
Ich habe alles probiert und nichts möchte klappen.
Wäre dankbar über jede Hilfe.


program ueb03;

{$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
if(Jahr mod 4 = 0) and(Jahr mod 100 <> 0) or(Jahr mod 400 = 0)then
if (Tag = 29) then
case Monat of
2: writeln(Tag,' ist zulässig');
end;


begin
if (Tag <= 31) then

case Monat of
1,3,5,7,8,10,12: writeln('Der ',Tag,'. ist gültig.')
end;


begin
if (Tag <= 30) then

case Monat of
4,6,9,11: writeln('Der ',Tag,'. ist gültig')
end



else
writeln(Tag,'.',Monat,'.', Jahr, ' ist unzulässig.');
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.

blawen 16. Mai 2021 03:35

AW: Erstellen eines Datum-überprüfers
 
Es wäre cool, wenn Du den Code als "Delphi-Code einfügen" (Helm-Symbol) und einrücken würdest.
Das würde die Lesbarkeit schon mal deutlich verbessern.

Bist Du sicher, dass Deine Abfragen korrekt funktionieren?
Wenn ich z.B. den 31.1.2021 eingebe, wird folgendes ausgegeben:
Zitat:

Bitte den Tag eingeben 31
Bitte den Monat eingeben 1
Bitte das Jahr eingeben 2021
Der 31. ist gültig.
31.1.2021 ist unzulässig.
Für mich ist der Code zu sehr verschachtelt und daher mMn sehr Fehleranfällig.
Statt der IF-Verschachtelung könntest Du z.B. auch mit einer Repeat-Schleife arbeiten.
Als Beispiel für die Eingabe und Überprüfung des Tags, zB:
Delphi-Quellcode:
// Überprüfung ob der Tag zwischen 1...31 liegt

var
  iTag    : Integer;
  sEingabe : String;

begin
  Repeat
    write('Bitte den Tag eingeben: ');
    readln(Eingabe);
    Tag := StrToIntDef(Eingabe, 1);
    if (Tag < 1) or (Tag > 31)
      then WriteLn('Die Eingabe ist ungültig!');
  until (Tag > 0) and (Tag <=31);
...
Was meinst Du mit "der Compiler bleibt stehen"?

himitsu 16. Mai 2021 10:03

AW: Erstellen eines Datum-überprüfers
 
Delphi-Code bitte in [DELPHI]...[/DELPHI] einschließen.

Aber selbst mit deiner eigenwilligen Einrückung, ist es schwer zu lesen.

Tipp: http://docwiki.embarcadero.com/RADSt...al_Style_Guide
https://www.delphipraxis.net/207755-...-erneuert.html



Compiler bleibt steht?
> Mit welcher Fehlermeldung?

Ich denke mal du meinst dein "Programm" und nicht den Compiler, was manchmal nichts anzeigt (weil deine Prüfungen falsch sind).



Lösung: Verwende den Debugger und schau nach, was dein Programm wirklich macht.

https://www.delphipraxis.net/41047-t...ortgeschr.html
https://de.wikibooks.org/wiki/Progra...:_Der_Debugger

https://www.youtube.com/watch?v=Oyd0ksN8cRs
http://docwiki.embarcadero.com/RADSt...k_zum_Debuggen





Tipp: statt erst
Delphi-Quellcode:
if Tag
und dann jeweils ein CASE, nimm besser erst nur ein CASE und darin dann die IF

Beim ersten Case hast das ELSE vergessen.






Und falls ihr noch irgendwann zum Optiomieren/Verkürzen kommt, dann Delphi-Referenz durchsuchenIsInLeapYear oder gar Delphi-Referenz durchsuchenDaysInMonth / Delphi-Referenz durchsuchenDaysInAMonth.

DieDolly 16. Mai 2021 10:30

AW: Erstellen eines Datum-überprüfers
 
Ist etwas OffTopic. Aber es ist traurig zu sehen, wie kaputt die Rechtschreibung und Einrückung des Codes im ersten Post ist wenn man bedenkt
Zitat:

an der Fachhochschule

Delphi.Narium 16. Mai 2021 10:43

AW: Erstellen eines Datum-überprüfers
 
Mal aus Spass ein Pascalscript (ohne Verwendung irgendwelcher Datumsfunktionen):
Delphi-Quellcode:
program Kalender;

function IfThen(b : Boolean; sOk : String; sNotOk : String) : String;
begin
  case b of
    true : Result := sOk;
    false : Result := sNotOk;
  end;
end;

function IsSchaltjahr(Jahr : Integer) : Boolean;
begin
  Result := (Jahr mod 4 = 0) and ((Jahr mod 100 <> 0) or (Jahr mod 400 = 0));
end;

function IsBetween(i : Integer; iMin : Integer; iMax : Integer): Boolean;
begin
  Result := (i >= iMin) and (i <= iMax);
end;

function IsTagOk(Tag : Integer; Monat : Integer; Jahr : Integer) : Boolean;
begin
  Result := false;
  if IsBetween(Monat,1,12) then begin
    case Monat of
      1,3,5,7,8,10,12 : Result := IsBetween(Tag,1,31);
      2               : case IsSchaltjahr(Jahr) of
                          true : Result := IsBetween(Tag,1,29);
                          false : Result := IsBetween(Tag,1,28);
                        end;
      4,6,9,10        : Result := IsBetween(Tag,1,30);
    end;
  end;
end;

var
  Jahr : Integer;
  Monat : Integer;
  Tag  : Integer;
begin
  Write('Bitte das Jahr eingeben:');
  ReadLn(Jahr);
  Write('Bitte den Monat eingeben:');
  ReadLn(Monat);
  Write('Bitte den Tag eingeben:');
  ReadLn(Tag);
  // Kalenderreform von 1582, davor gilt die Schaltjahrberechnung nicht.
  if IsBetween(Jahr,1583,3000) then begin
    WriteLn(Format('Das Jahr %d ist gültig und %s Schaltjahr.',[Jahr, IfThen(IsSchaltjahr(Jahr),'ein','kein')]));
    WriteLn(Format('Der Monat %d ist %sgültig.',[Monat, IfThen(IsBetween(Monat,1,12),'','un')]));
    WriteLn(Format('Der Tag %d ist %sgültig.',[Tag, IfThen(IsTagOk(Tag, Monat, Jahr),'','un')]));
  end else begin
    WriteLn(Format('Das Jahr %d liegt außerhalb des Gültigkeitsbereiches.',[Jahr]));
  end;
end.
@DieDolly:

Habe schon deutlich "schlimmeren" Code von promovierten Informatikern gesehen.

Wir haben seinerzeit jedenfalls nicht gelernt, wie man Code "schön" schreibt, sondern nur, wie man die für die Problemstellung erforderliche Logik richtig entwickelt und dann "irgendwie" funktionsfähig implementiert.

Und ja: Viele Implementierungsfehler lassen sich in "schöner Quelltextoptik" deutlich leichter auffinden, vor allem, wenn die optische Struktur der logischen Struktur entspricht. ;-)

Michael II 16. Mai 2021 11:44

AW: Erstellen eines Datum-überprüfers
 
Verwende System.SysUtils.EncodeDate( ) und reagiere auf Exceptions. Da lernst du fast mehr ;-)...

Delphi.Narium 16. Mai 2021 11:53

AW: Erstellen eines Datum-überprüfers
 
Frage: Geht es darum Delphi zu lernen oder darum die Grundlagen der Kalenderberechnung zu lernen?

Mo53 16. Mai 2021 12:23

AW: Erstellen eines Datum-überprüfers
 
Vielen Dank für eure Mühe,
Sorry für die schlechte Lesbarkeit, ich bin noch ein blutiger Anfänger der vor zwei Wochen bei null angefangen hat.
Schleifen sowie function haben wir noch nicht gehabt und dürfen wir somit auch noch nicht verwenden.
Ich werde es mal mit dem Debugger durchgehen vielleicht finde ich das Problem.

DieDolly 16. Mai 2021 12:34

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

und dürfen wir somit auch noch nicht verwenden.
So eine Fachhochschule, die die Schüler scheinbar systematisch auf niedrigem Niveau hält, würde ich sofort verlassen.
Wäre ich dort, würde ich alles verwenden, was ich kenne, und nicht das, was ich darf.

venice2 16. Mai 2021 12:54

AW: Erstellen eines Datum-überprüfers
 
Delphi-Quellcode:
program ueb03;
{$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
        if (Jahr mod 4 = 0) and (Jahr mod 100 <> 0) or (Jahr mod 400 = 0) then
          if (Tag = 29) then
            case Monat of
              2:
                writeln(Tag, ' ist zulässig');
            end;

        begin
          if (Tag <= 31) then

            case Monat of
              1, 3, 5, 7, 8, 10, 12:
                writeln('Der ', Tag, '. ist gültig.')
            end;

          begin
            if (Tag <= 30) then

              case Monat of
                4, 6, 9, 11:
                  writeln('Der ', Tag, '. ist gültig')
              end

            else
              writeln(Tag, '.', Monat, '.', Jahr, ' ist unzulässig.');
            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.
Habe mir erlaubt den Quelltext zu formatieren und im Delphi Tag einzubetten. (Aber nichts getestet oder daran verändert.)
@DieDolly! Helfe ihm doch einfach als über ihn herzuziehen er kann nichts für die Vorschriften die man ihm auferlegt.

Just my 2 Cent!


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 Uhr.
Seite 1 von 4  1 23     Letzte »    

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