Datumsprüfprogramm funktioniert nicht ganz korrekt



  • Hallo,

    ich habe ein Programm geschrieben, das prüft, ob ein eingegebenes Datum gültig ist. Unglücklicherweise meint das Programm, der 31.4. eines jahres sei gültig, obwohl es den gar nicht gibt. 😕
    Ich hab keine Ahnung, wo der Fehler sein soll.
    Hier ist der Code:
    http://pastebin.com/m7974adfb

    Bitte nicht über die Prüfung des Schaltjahres wundern, die haben wir so vorgegeben bekommen...

    Die Allgemeine Prüfung funktioniert, (also dass so was wie der 32.13. erkannt wird), aber die erweiterte Datumsprüfung, die erkennt, wenn man den 31.11. angibt, geht nicht.

    PS:
    Das Datum wird mit Leerzeichen getrennt eingegeben, also 30 1 2009



  • monat == (1||3||5||7||8||10||12)
    

    Das funktioniert leider nicht so, wie du es angedacht hast. Der Klammerausdruck wird ja vor dem == ausgewertertet und ist mit den Konversionsregeln int->bool immer true. Also überprüfst du da monat == true. C++ kann auch nicht irgendwie Klammern ausmultiplizieren oder so, also musst du da schreiben monat == 1 || monat == 3 || ...
    Die einzig komfortable eingebaute Lösung für dieses Problem ist in C++ das switch/case-Konstrukt.
    Du könntest alternativ auch ein Lookup-Feld mit 12 Einträgen machen, das die Monatsnummer auf die Tagesanzahl abbildet. Im Falle vom Februar ist das natürlich jahresabhängig.

    Viele Grüße,
    Michael



  • Danke für den Tipp, ich hab es mit switch-case gamacht und jetzt funktioniert es. 🙂



  • Kann mir mal jemand erklären wie diese switch-case in diesem Fall gehen soll?



  • switch(monat)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
    return true;
    
    default: return false; 
    }
    


  • Oder am flexibelsten und wahrscheinlich am schnellsten ist ein Array mit 12 Einträgen.

    #include <array>  // benötigt TR1-Unterstützung
    std::tr1::array<int, 12> TageProMonat = {31, 28, ...};
    


  • Nexus schrieb:

    Oder am flexibelsten und wahrscheinlich am schnellsten ist ein Array mit 12 Einträgen.

    #include <array>  // benötigt TR1-Unterstützung
    std::tr1::array<int, 12> TageProMonat = {31, 28, ...};
    

    Wie würde man dann überprüfen ob ein eintrag in dem array existiert? Danke.



  • tr1newb schrieb:

    Wie würde man dann überprüfen ob ein eintrag in dem array existiert? Danke.

    Gleich wie bei nativen Arrays:

    int AprilTage = TageProMonat[3];
    

    Und mit einem Enum kann man das noch vereinfachen:

    enum Monat
    {
        Januar,
        ...
        April,
        ...
    };
    
    int AprilTage = TageProMonat[April];
    

Anmelden zum Antworten