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 2 von 4     12 34   
DieDolly

Registriert seit: 22. Jun 2018
1.913 Beiträge
 
#11

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 13:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 13:55
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.
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 14:01 Uhr)
  Mit Zitat antworten Zitat
Mo53

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

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 14:05
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.
  Mit Zitat antworten Zitat
mmw

Registriert seit: 10. Sep 2019
Ort: OWL
191 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: Erstellen eines Datum-überprüfers

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

Registriert seit: 22. Jun 2018
1.913 Beiträge
 
#15

AW: Erstellen eines Datum-überprüfers

  Alt 16. Mai 2021, 14:12
Zitat:
jetzt besteht aber das Problem das das Programm nach der Abfrage des Datums endet.
Ich habe im ganzen Thread bisher nicht einen Kommentar gesehen, wo der Delphi Style Guide auch nur annähernd respektiert wird.
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!
  Mit Zitat antworten Zitat
Delphi.Narium

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

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
 
#17

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
1.855 Beiträge
 
Delphi 7 Professional
 
#18

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
38.603 Beiträge
 
Delphi 10.4 Sydney
 
#19

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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
TBx
(Moderator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.791 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#20

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.
Gruß Thomas
- Moderator Delphi-Praxis -
- Admin Delphi-Treff
- Embarcadero MVP
  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 08:08 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