Datumsüberprüfung in C

  • C/C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Datumsüberprüfung in C

    Guten Abend!

    Ich arbeite gerade an einen Programm für die Schule und komme derzeit nicht wirklich weiter! Und zwar suche ich eine Funktion die true/false zurückgibt. Die Parameter die der Funktion übergeben werden ist jediglich ein String. Dieser String ist maximal 10 Zeichen lang und sollte so aussehen "2.3.2011". Bzw. ein anderes Datum. Nun soll überprüft werden ob dieses Datum korrekt ist. D.H.: Es sollte überprüft werden ob der Tag nicht über die Maximale Grenze steigt das dieser Monat hat. Der Monat darf nur zwischen 1 && 12 sein, und das Jahr ist egal. Ich bekomme alles recht jedoch weiß ich nicht wie ich am besten überprüfen kann ob ein Schaltjahr ist und somit der Februar mehr bzw. weniger Tage hat.

    Ich hoffe ihr versteht was ich meine, und habt vllt. eine Funktion bzw. eine Idee wie ich dies am besten lösen kann!

    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Ich hab gerade geschaut, ob ich mein Beispiel aus der Schule noch habe. Wir haben da mal sowas ähnliches gemacht. Man gab
    ein Datum ein und das Programm gab den nächsten Tag zurück. (Eigentlich sinnlos ;-)). Das Beispiel hab ich zwar wieder gefunden, aber
    ich bin jetzt draufgekommen, dass das Programm keine Schaltjahre berechnet.

    Jedenfalls denke ich, dass das mit modulo geht. Über die Jahreszahl. Ich weiß jetzt zwar momentan nicht genau wie, aber einfach ein bisschen mit modulo probieren.
    Mein erster Ansatz wäre: <Jahreszahl> modulo 4 = 0 oder sowas
  • Ja mit modulo hab ich auch schon gedacht. Du hast schon recht, aber ich versuch gerade den String in 3 Zahlen zu teilen (hab es gerade geschafft, aufwendig, aber es geht). Und nun nervt es ein bisschen, die Jahreszahlen zu überprüfen. Ich werd mal mein Glück versuchen!

    P.S.: Der Monat MUSS immer der Monat sein der gerade ist. (schon geschafft, aber vllt. geht es dann bisschen leichter)
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • peini schrieb:

    Mein erster Ansatz wäre: <Jahreszahl> modulo 4 = 0 oder sowas


    Reicht nicht; die vollen Jahrhunderte, die nicht gleichzeitig auch Vielfache von 400 sind, sind keine Schaltjahre.

    D.h. in C++ sieht das ungegolft etwa so aus:

    C-Quellcode

    1. bool istSchaltjahr(int jahr)
    2. {
    3. if(jahr % 4)
    4. {
    5. return false;
    6. }
    7. if(jahr % 100)
    8. {
    9. return true;
    10. }
    11. return !(jahr % 400);
    12. };
    Alles anzeigen


    Edit: Weil sich jemand beschwerte, dass das nicht eklig genug war, hab ich dann doch mal ein wenig rumgegolft:

    C-Quellcode

    1. bool istSchaltjahr(int i)
    2. {
    3. return i%4?0:i%100?1:!(i%400);
    4. }


    Oder wenn man es direkt in die eigentliche Funktion reinbauen möchte:

    C-Quellcode

    1. if(i%4?0:i%100?1:!(i%400))
    2. {
    3. // falls es ein Schaltjahr ist
    4. }
    5. else
    6. {
    7. // fall es keins ist
    8. }
  • Die C Standard Library bietet bereits geeignete Funktionen für den Umgang mit Zeitangaben. Die Funktion mktime lässt sich zur Überprüfung einer richtigen Datumsangabe missbrauchen. Ihr übergibt man ein Objekt welches Informationen über Tag, Monat, Jahr etc. enthält und mktime gibt den entsprechenden timestamp zurück wobei sie zusätzlich das übergebene Objekt entsprechend gültiger Datumsangaben verändert. Ob das übergebene Datum also gültig war kannst du dann ganz einfach herausfinden, indem du prüfst, ob mktime das übergebene Objekt verändern musste. Hier erfährst du mehr über mktime: cplusplus.com/reference/clibrary/ctime/mktime/.

    Zum parsen des strings, welcher das Datum enthält, ist übrigens sscanf geeignet zusammen mit einem Formatstring wie "%d.%d.%d", falls das Datum im Format "TT.MM.JJJJ" vorliegt. Für Details: cplusplus.com/reference/clibrary/cstdio/sscanf/.

    Wenn du mit der Umsetzung nicht klar kommst, kannst du gerne nochmal fragen.
  • Danke, hat mir sehr geholfen, und nun klappt es auch!

    @Bl@cksp@rk: Naja mir geht es zurzeit darum, die funktionen selbst zu schreiben, um sie gut verstehen zu können! z.B.: Hab ich auch alle String-Funktionen selbst nochmal geschrieben, obwohl sie ja schon existieren! Es geht mir im wessentlichen darum zu lernen, wie etwas funktioniert und wie lernt man sowas besser, als sie selbst zu schreiben? ^^
    Diese Funktion ist der HAMMER und ich hab extra 8 if's zusammengepasstelt! :( Habs jetzt ersetzt .. Aber trotzdem danke !! xDD

    Aber Trotzdem danke, und das ein Schaltjahr nur dann ist wenn '(yy%4 == 0 && yy%100!=0)||yy%400=0' wusste ich :D
    Ich kann ja meine Funktion hier rein schreiben, die ist aber extrem lang und relativ "kompliziert" aufgebaut, also las ich es lieber :DD

    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Benutzer online 1

    1 Besucher