![]() |
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. |
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. |
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. |
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. |
AW: Erstellen eines Datum-überprüfers
Zitat:
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! |
AW: Erstellen eines Datum-überprüfers
Nochmal einen Abschnitt überarbeitet:
Delphi-Quellcode:
@DieDolly
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; 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 ;-) |
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. |
AW: Erstellen eines Datum-überprüfers
Suchmaschine marsch:
![]()
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. |
AW: Erstellen eines Datum-überprüfers
Zitat:
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:
macht, wenn der Tag 30 oder 31 ist.
if (Tag <= 29) then
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) |
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 14:44 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