Verwaltungsprogramm - Datum möglich



  • Hallo,

    ich bräuchte einmal dringend eure Hilfe. Ich habe einem Kumpel versprochen, dass ich ihm ein Verwaltungsprogramm erstelle. Das Programm ist schon sehr weit allerdings komme ich gerade nicht weiter.

    Folgendes:
    Das Programm muss Geräte verwalten können. Die Geräte werden ausgeliehen und das Programm muss prüfen ob das Gerät noch verfügbar ist und nicht bereits entliehen.
    Genau hier ist habe ich ein großes Problem.

    Beispiel:
    5 Notebooks sind vorhanden, ...
    2 Notebooks werden von 20.02.06 14.00 Uhr bis 01.03.06 16.30 Uhr entliehen,
    3 Notebooks werden von 25.02.06 20.00 Uhr bis 26.03.06 23.00 Uhr entliehen,
    ...

    so das Programm muss jetzt Prüfen wenn wieder ein Notebook entliehen wird, dass die gewünschte Anzahl für den gewünschten Zeitraum vorhanden ist. Diese Prüffunktion macht mehr große Probleme, da ich nicht weiß wie ich die Überschneidungen berücksichtigen kann.

    Die Oberfläche des Programms ist bereits komplett fertig. Sowie das Verwalten der Objekte (Neues Objekt, Objekt ändern) und das Abspeichern jeglicher trivialen Daten.

    Ich habe alles Binär in Dateien abgespeichert also keine MySQL Datenbank oder dergleichen.

    Es gibt zwei Ablagedateien.
    1. Datei hier werden alle Geräte die vorhanden sind abgespeichert:

    typedef struct
    {
      unsigned int  iNummer;   //primary key
      char cName[array_name];  //Objektname bsp notebook
      char cBezeichnung[array_bez];  //kurze beschreibung
      unsigned int iAnzahl;    //anzahl der vorhanden objekte
    }TGeraet;
    

    2. Datei werden die Reservierung abgespeichert

    typedef struct
    {
    
      unsigned short int inummer;
      unsigned short int igeraet;     //welches gerät wird entliehen
      unsigned short int ianzahl;     //wie viele von diesem Gerät
      unsigned long int istart_datum; //Zeit der reservierung
      unsigned long int iend_datum;
      unsigned int istart_zeit;       
      unsigned int iend_zeit;
      char ceinheit[array_ein];       //Zusatzinfos von wem wird entliehen usw. 
      char cbeschreibung[array_besch];
      char cname[array_name];
      bool baktiv;
    
    }TAuftrag;
    

    Wie würdet ihr die Prüfung angehen wenn eine neue Reservierung gemacht wird sodass keine Mehrfachreservierungen vorhanden sind ?***

    Problem: Startdatum und Enddatum prüfen geht nicht, da eine andere Reservierung genau zwischen dem Start/End Datum liegen kann oder einen ähnlichen Fall.

    Mein Ansatz war. Einfach eine dritte Datei anlegen in der ich dann alle Reservierungen die sich überschneiden ablege. Also abspeichere Überschneidung von start bis end. Allerdings funktioniert dieses System nicht wenn noch eine dritte überschneidung hinzukommt oder wird zu komplex für mich. Habt ihr bessere Ansätze. Ich hoffe ich habe mein Problem verständlich erklärt.

    PS: Antwort am besten heute noch da ich den rest der Woche weg bin
    PS2: Ansätze bitte an meinen Ansatz oben ANPASSEN

    Danke im Voraus für eure Hilfe.
    mfg
    prozeus



  • du solltest dein problem reduzieren, sonst macht sich keiner die arbeit, dich zu verstehen...

    du willst also intervalle vereinigen, also sowas?
    [10, 15) + [12, 17) -> [10, 17)

    geht prinzipiell so (python/pseudocode):

    intervalle = [(10,15), (12,17), (30,42), (35,38)]
    i = 0
    while i < len(intervalle)-1: # vom ersten zum vorletzten element...
        if intervalle[i][0] <= intervalle[i+1][1] and intervalle[i][1] >= intervalle[i+1][0]: # intervallueberschneidung?
            intervalle[i] = (
                min(intervalle[i][0], intervalle[i+1][0]),
                max(intervalle[i][1], intervalle[i+1][1]),
            )
            del intervalle[i+1]
        else:
            i += 1
    
    print intervalle
    

    hab ich dein problem richtig verstanden?

    Edit: kleiner Kommentar im Code



  • deinen Ansatz versteh ich nicht. Also versuch ich jetzt mal mein Problem zu reduzieren.

    Meine Idee: alle überlagerungen von Ausleihdaten in eine extra Datei.

    objekt1 von 14.10.2005 14.00 - 20.10.2005 18.00 Anzahl 1
    objekt1 von 18.10.2005 18.00 - 25.10.2005 20.00 Anzahl 1

    also schreibe alle überlagerungen in eine extra Datei (zusammenfassen aller Aufträge):
    1. 14.10.2005 14.00 - 18.10.2005 18.00 //1 Ausgeliehen
    2. 18.10.2005 18.00 - 20.10.2005 18.00 //2 Ausgeliehen
    3. 20.10.2005 18.00 - 25.10.2005 20.00 //1 Ausgeliehen

    und dieses Zusammenfassen bringe ich nicht hin, da man bedenken muss, dass das aufgreführte Beispeil nur eine von unzähligen Möglichkeiten ist. Das 2 Datum kürzer oder noch eine dritte überschneidung kommt noch hinzu.

    Wenn dann ein neues Objekt entliehen wird, kann ich einfach in der zusammengefassten Datei prüfen. Hoffentlich ist jetzt mein Problem deutlicher. Allerdings mit einem Lösungsansatz von mir. Könnt aber bereits hier schon auf dem Holzweg sein.



  • in welcher form liegen die zeitangaben vor? unix timestamps hoffentlich, die lassen sich einfacher vergleichen.

    du hast also probleme bei der algorithmierung des problems...
    nun, ich will dir nicht die arbeit abnehmen. probier mit blatt und bleibstift mit kleinen anzahlen an objekten und verleihungen rum.
    ich werd mir auch mal gedanken machen und vielleicht eine loesung posten.

    nachtrag:
    deine urspruengliche frage war ja
    Wie würdet ihr die Prüfung angehen wenn eine neue Reservierung gemacht wird sodass keine Mehrfachreservierungen vorhanden sind?
    machs so:
    der neue intervall wird mit allen vorhandenen intervallen verglichen. gibt es ueberschneidungen, wird abgelehnt.
    zwei intervalle [a1,a2] und [b1,b2] ueberschneiden sich, wenn a1 <= b2 && a2 >= b1.
    die ueberschneidung ist [max(a1,b1), min(a2,b2)]
    die vereinigung ist [min(a1,b1), max(a2,b2)]

    die vorhandenen intervalle kannst du auch so pruefen. mit ein bisschen eigeninitiative kannst du sogar herausfinden, wie oft ein gegenstand fuer einen bestimmten zeitraum ueberbucht ist.



  • genau, du hast mein Problem erkannt.
    Die Werte sind wie du in meinem ersten Post erkennen kannst als integer abgespeichert.
    int datum und int zeit

    ich habe mir schon viele Gedanken gemacht. ich progge schon 14 Tage an diesem Problem. Derzeit habe ich das Datum in ungekehrter Reihenfolge abgespeichert, sodass ich einfach vergleichen kann welches Datum größer ist.

    Also
    14.12.2005 liegt 20051214 im Speicher.
    so kann ich die Daten einfacher vergleichen.

    die großen Probleme kommen erst in der Tiefe. was ist z. B. wann noch eine 3 Überlagerung hinzukommt usw.



  • musst du wirklich wissen, wie oft etwas ueberbucht ist? ueberhaupt ueberschneidungen finden reicht doch schon, um einen eintrag abzulehnen.


Anmelden zum Antworten