schnitttage von zwei datums



  • user789954411 schrieb:

    danke für die Antwort...

    Ich muss auch wissen, wie sie sich überschneiden. Das Resultat muss ein von und ein bis sein (z.B zeitraum 1: 24.8.12 - 01.09.12 zeitraum2: 24.8.12 - 31.8.12 ergebnis von= 24.8.12 bis=31.8.12)

    Oh, ich dachte nur die Anzahl sei interessant.
    Die Grenzen finden, sogar in Datumsschreibweise, würde ich so angehen, daß ich das Grenzenproblem erstmal für zwei int-Intervalle löse.
    Geschätze ifs: 3 bis 6
    Und dann mir eine Funktion baue, die zwei Datums vergleichen kann.
    Geschätze ifs: 5
    Und dann die ints durch Datums ersetzt.



  • ok, danke

    könntest du das kurz anhand eines beispiels zeigen, bitte?



  • user789954411 schrieb:

    könntest du das kurz anhand eines beispiels zeigen, bitte?

    Nein, diese spannende Übungsaufgabe möchte ich Dir nicht abnehmen.



  • [quote="volkard"][quote="user789954411"]
    Die Grenzen finden, sogar in Datumsschreibweise, würde ich so angehen, daß ich das Grenzenproblem erstmal für zwei int-Intervalle löse.

    das mit den 2 int-intervallen verstehe ich nicht



  • user789954411 schrieb:

    das mit den 2 int-intervallen verstehe ich nicht

    Erstmal ein Übungsprogramm machen, um besser in die Materie zu kommen.

    Eingabe:
    Start des ersten Bereichs: 15
    Ende des ersten Bereichs: 70
    Start des zweiten Bereichs: 30
    Ende des zweiten Bereichs: 90

    Ausgabe:
    Die Schnittmenge ist der Bereich von 30 bis 70.

    Und wenn das klappt, haste schon viel bessere Karten, um das Gesamtproblem zu schaffen.



  • Ich nehm einfach die 2 zeitspannen her ordne die 4 datums
    aufsteigend--> die mittleren 2 sind dann mein von und mein bis.

    dann ist das problem eh gelöst...oder?



  • user789954411 schrieb:

    Ich nehm einfach die 2 zeitspannen her ordne die 4 datums
    aufsteigend--> die mittleren 2 sind dann mein von und mein bis.

    dann ist das problem eh gelöst...oder?

    Zeitspanne1: 01.01.2011 - 01.02.2011
    Zeitspanne2: 01.03.2011 - 01.04.2011

    Ergebnis: 01.02.2011 - 01.03.2011

    Somit funtkioniert es nicht.



  • Du kannst die von time_period vorgeschlagenen boost-Funktionen (bool contains(time_period)) nutzen oder das selber machen. Am einfachsten wäre wahrscheinlich Folgendes (mit einer if-Abfrage):

    ...
    struct Period
    {
        time_t d1;  //Datum als Sekunden/Min/Tage/etc. ab einem bestimmten Zeitpunkt
        time_t d2;
    } p1, p2; 
    
    ...
    
    Period intersect_days (const Period& p1, const Period& p1)
    {
        Period intersect_per;
        if (p1.d2 < p2.d1 || p1.d2 > p2.d1)  //no intersection
        {
            intersect_per.d1 = 0;
            intersect_per.d2 = 0;
        }
    
        intersect_per.d1 = max(p1.d1, p2.d1);
        intersect_per.d2 = min(p1.d2, p2.d2);
    
        return intersect_per;
    }
    

    Anschließend beide time_t in ein Datumformat umwandeln. Wenn die Tage indetisch sind, dann musst du entscheiden, was du machen willst.



  • [Rewind] schrieb:

    Du kannst die von time_period vorgeschlagenen boost-Funktionen (bool contains(time_period)) nutzen oder das selber machen. Am einfachsten wäre wahrscheinlich Folgendes (mit einer if-Abfrage):

    ...
    struct Period
    {
        time_t d1;  //Datum als Sekunden/Min/Tage/etc. ab einem bestimmten Zeitpunkt
        time_t d2;
    } p1, p2; 
    
    ...
    
    Period intersect_days (const Period& p1, const Period& p1)
    {
        Period intersect_per;
        if (p1.d2 < p2.d1 || p1.d2 > p2.d1)  //no intersection
        {
            intersect_per.d1 = 0;
            intersect_per.d2 = 0;
        }
    
        intersect_per.d1 = max(p1.d1, p2.d1);
        intersect_per.d2 = min(p1.d2, p2.d2);
    
        return intersect_per;
    }
    

    Anschließend beide time_t in ein Datumformat umwandeln. Wenn die Tage indetisch sind, dann musst du entscheiden, was du machen willst.

    Diese Richtung würde ich nicht verfolgen.



  • Warum denn nicht?



  • Du baus die Klasse nur zu dem Zweck, zwei(!) Zeilen in eine Funktion auszulagern. Macht aber in der Funktion Unfug, das if da gehört da gar nicht hin.
    Und es ist nicht nötig, nach time_t und zurück zu wandeln, weil die Anzahl der dazwischenliegenden Tage nicht gebraucht wird. Die durch dieses if festgestelle Information müßte dann in der main() wieder extrahiert werden.

    Dann schlägst Du globale Variablen vor.

    Das Programm bleibt hingegen winzig, wenn man es in der main läßt. Das wäre jetzt angemessener, da user789954411 anscheinend Anfänger ist. Die Aufgabe ist so schon schwer genug. Ihm jetzt noch ein wenog OOP reinzudrücken, ergibt für mich keinen Sinn. Allenfalls eine struct Datum{int tag;int monat;int jahr;}, die würde sich viel eher anbieten. Aber erstmal geht es auch mit viermal 3 ints.



  • volkard schrieb:

    Du baus die Klasse nur zu dem Zweck, zwei(!) Zeilen in eine Funktion auszulagern. Macht aber in der Funktion Unfug, das if da gehört da gar nicht hin.

    Sei bitte nicht immer so abwertend. Ich habe die Struktur erstellt, um die Daten semantisch zu gruppieren. Ist das so schlimm?

    volkard schrieb:

    Und es ist nicht nötig, nach time_t und zurück zu wandeln, weil die Anzahl der dazwischenliegenden Tage nicht gebraucht wird. Die durch dieses if festgestelle Information müßte dann in der main() wieder extrahiert werden.

    Damit ist die Option gegeben, das zu machen. Was auch nur eine Idee.

    volkard schrieb:

    Dann schlägst Du globale Variablen vor.

    Tu ich nicht. Ich habe absichtlich vor und nach dem struct "..." geschrieben und hätte es global gar nicht deklariert. Ich habe nur die main() nicht geschrieben.

    volkard schrieb:

    Das Programm bleibt hingegen winzig, wenn man es in der main läßt. Das wäre jetzt angemessener, da user789954411 anscheinend Anfänger ist.

    Worauf willst du hinaus? Dass er so ein Anfänger ist, dass er Funktionen nicht kennt? Wenn der Code wächst, finde ich es schöner, so etwas als Funktion zu haben.

    volkard schrieb:

    Die Aufgabe ist so schon schwer genug. Ihm jetzt noch ein wenog OOP reinzudrücken, ergibt für mich keinen Sinn. Allenfalls eine struct Datum{int tag;int monat;int jahr;}, die würde sich viel eher anbieten. Aber erstmal geht es auch mit viermal 3 ints.

    Was OOP angeht, musst du zugeben, dass es auf das Minimum reduziert ist. Das kann man weglassen, sehe aber keinen Grund dafür, weil die Wertrückgabe übersichtlicher ist. Der struct-Overhead ist in dem Fall vernachlässigbar, wenn man das als Funktion haben möchte (ich wollte es in dem Fall).

    Mein Gott, bist du immer so oder sehen das Andere auch so? Das war doch eine Idee und dafür werde ich gleich öffentlich hingerichtet. Wirklich sehr nett.



  • Ich werde Dich nicht mit Worthülsen wie "Im Prinzip richtig, aber..." oder "Eine sehr schöne Lösung, leider für eine andere Aufgabe..." versorgen. Wenn ich es für ungut halte, sage ich das einfach.

    [Rewind] schrieb:

    Das war doch eine Idee und dafür werde ich gleich öffentlich hingerichtet. Wirklich sehr nett.

    Du hattest mit

    [Rewind] schrieb:

    Warum denn nicht?

    doch nachgefragt, warum ich Deinen Ansatz für ungut halte. Ich wäre sonst nicht weiter drauf eingegangen. Da Du meine Argumente nicht verstehst und auch nicht hören willst, verzichte ich darauf, auf Deine weiter einzugehen.


Anmelden zum Antworten