![]() |
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. |
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:
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:
Was meinst Du mit "der Compiler bleibt stehen"?
// Ü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); ... |
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: ![]() ![]() 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. ![]() ![]() ![]() ![]() Tipp: statt erst
Delphi-Quellcode:
und dann jeweils ein CASE, nimm besser erst nur ein CASE und darin dann die IF
if Tag
Beim ersten Case hast das ELSE vergessen. Und falls ihr noch irgendwann zum Optiomieren/Verkürzen kommt, dann ![]() ![]() ![]() |
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:
|
AW: Erstellen eines Datum-überprüfers
Mal aus Spass ein Pascalscript (ohne Verwendung irgendwelcher Datumsfunktionen):
Delphi-Quellcode:
@DieDolly:
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. 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. ;-) |
AW: Erstellen eines Datum-überprüfers
Verwende System.SysUtils.EncodeDate( ) und reagiere auf Exceptions. Da lernst du fast mehr ;-)...
|
AW: Erstellen eines Datum-überprüfers
Frage: Geht es darum Delphi zu lernen oder darum die Grundlagen der Kalenderberechnung zu lernen?
|
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. |
AW: Erstellen eines Datum-überprüfers
Zitat:
Wäre ich dort, würde ich alles verwenden, was ich kenne, und nicht das, was ich darf. |
AW: Erstellen eines Datum-überprüfers
Delphi-Quellcode:
Habe mir erlaubt den Quelltext zu formatieren und im Delphi Tag einzubetten. (Aber nichts getestet oder daran verändert.)
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. @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 11:23 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-2025 by Thomas Breitkreuz