if Logik



  • Hallo!
    Bin leider mit meinen logischen Fähigkeiten am Ende.
    Ich habe Daten, den Tag, den Monat und das Jahr mehrerer Aufzeichnungen
    und brauche eine if-Bedingung die einen Zeitraum begrenzt.

    Ich habe zum Beispiel folgende Datenliste

    08.02.03
    04.03.03
    10.03.03
    13.03.03
    18.03.03
    12.04.03
    15.04.03

    und möchte nun nur die Einträge im Zeitraum 12.03.03 - 03.04.03 haben
    also 13.03.03 und 18.03.03

    eingefallen ist mir nur

    if(Tag >= TagStart && Tag <= TagEnde
    && Monat >= MonatStart && Monat <= MonatEnde
    && Jahr >= JahrStart && Jahr <= JahrEnde)

    was aber zum Scheitern verurteilt ist, da wenn man einen größeren Zeitraum meinetwegen über 3 Monate abdecken will, der Tag des 2 Monats sehr wohl kleiner sein darf als TagStart, gleichermassen verhält sich dies mit Monaten wenn man einen Zeitraum über mehrere Jahre darstellen will.



  • Von möglichen Tippfehlern abgesehen geht das so:

    typedef struct _DATUM
    {
        int jahr;
        int monat;
        int tag;
    } DATUM;
    
    //VglDatum() : Vergleicht zwei Datumsangaben
    //int        : Negativ ==> Datum2 kommt vor Datum1;
    //             Positiv ==> Datum2 kommt nach Datum1;
    //             0 ==> Datum1 und Datum2 stimmen ueberein
    //d1         : Datum1
    //d2         : Datum2
    int VglDatum(DATUM* d1, DATUM* d2)
    {
        if(d1->jahr < d2->jahr)
            return 1;
        if(d1->jahr > d2->jahr)
            return -1;
        if(d1->monat < d2->monat)
            return 1;
        if(d1->monat > d2->monat)
            return -1;
        if(d1->tag < d2->tag)
            return 1;
        if(d1->tag > d2->tag)
            return -1;
        return 0;
    }
    
    //Hauptprogramm
    static DATUM start = { 2003, 3, 12 };
    static DATUM ende = { 2003, 4, 3 };
    DATUM* d = datumArray;
    for(i = 0; i < anzahl; ++i, ++d)
    {
        if((VglDatum(&start, d) >= 0) && (VglDatum(&ende, d) <= 0))
            DatumUebernehmen(d);
        else
            DatumIgnorieren(d);
    }
    


  • Vielen Dank für deine Hilfe. Dein Beitrag hat wesentlich zur Lösung des
    Problems beigetragen auch wenn ichs letztendlich etwas anders gemacht habe.
    Jetzt funktioniert es. Nochmals Danke.


Anmelden zum Antworten