AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Erstellen eines Datum-überprüfers

Ein Thema von Mo53 · begonnen am 16. Mai 2021 · letzter Beitrag vom 17. Mai 2021
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#1

Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 02:32
Delphi-Version: 10.3 Rio
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.
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
491 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 04:35
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"?
Roland
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.368 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 11:03
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 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (16. Mai 2021 um 11:35 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.907 Beiträge
 
#4

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 11:30
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.744 Beiträge
 
Delphi 7 Professional
 
#5

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 11:43
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.
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
570 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 12:44
Verwende System.SysUtils.EncodeDate( ) und reagiere auf Exceptions. Da lernst du fast mehr ...
Michael Gasser
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.744 Beiträge
 
Delphi 7 Professional
 
#7

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 12:53
Frage: Geht es darum Delphi zu lernen oder darum die Grundlagen der Kalenderberechnung zu lernen?
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 13:23
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.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.907 Beiträge
 
#9

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 13:34
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.
  Mit Zitat antworten Zitat
venice2

Registriert seit: 5. Dez 2019
Ort: Köln
642 Beiträge
 
Delphi 2010 Architect
 
#10

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 13:54
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!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 06:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf