AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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 2  1 2      
Delphi.Narium

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

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 14:25
Nochmal einen Abschnitt überarbeitet:
Delphi-Quellcode:
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;
@DieDolly
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

Geändert von Delphi.Narium (16. Mai 2021 um 16:58 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat
Mo53

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

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 16:58
@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.

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.
  Mit Zitat antworten Zitat
Delphi.Narium

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

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 17:08
Suchmaschine marsch: ostern formel
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#4

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 17:19
Wenn ihr noch einen Fehler entdeckt könnt Ihr mich gerne darauf hinweisen.
Monat 2 und darin vom If das Else.

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 if (Tag <= 29) then macht, wenn der Tag 30 oder 31 ist.



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)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.899 Beiträge
 
Delphi 12 Athens
 
#5

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 17:55
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.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.326 Beiträge
 
Delphi 12 Athens
 
#6

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 18:11
Zitat:
if (Monat >= 1) and (Monat <= 12) then begin
Warum nicht als ELSE im Case?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.899 Beiträge
 
Delphi 12 Athens
 
#7

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 18:54
Zitat:
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.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  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, 18:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 18:58
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!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
692 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Erstellen eines Datum-überprüfers

  Alt 17. Mai 2021, 08:31
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?
Für die einen oder anderen ist es wohl schon ein bisschen länger her programmieren gelernt zu haben.
Wer es sich selber beigebracht hat, ging eh quer durch.
Aber wer es in Schule oder Studium gelernt hat kennt das, Stück für Stück, immer ein bisschen was neues.

Und genau darum geht es hier. IF THEN ELSE Stuktur und Verschachtelung.
Wer mehr machen will, oder es anders machen will der kann das Privat sicher gerne machen.
Aber wenn der Test mit diesen Einschränkungen kommt dann sind die halt so. Grundlagen. Grundlagen. Grundlagen.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 +1. Es ist jetzt 05:41 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 by Thomas Breitkreuz