problem, wie geht man hier vor? eine recht interessante aufgabe



  • theTOASTA schrieb:

    wie in gottes namen geh ich da vor??

    Nun, zunächst überlegst Du was Input und Output von Deinem Programm ist.

    Dann versuchst Du sogenannte Anwendungsfälle (Use Cases) zu beschreiben (in Worten). Jeder Use Case beginnt mit einem Ereignis (kann auch das Verstreichen einer Zeit sein - z.B. Timer) und endet mit einem Nutzen für den Anwender.

    Z.B. Taschenrechner - Ereignis ist: Anwender tippt zwei Summanden mit '+' getrennt, als Ergebnis wird die Summe ausgegeben. Der Nutzen für den Anwender besteht darin, dass er die Summe ablesen kann.

    Dann suchst Du alle Hauptwörter in Deiner Beschreibung heraus, denn das sind potentielle Kandidaten für Klassen. Aus Deinen Use Cases sollte klar werden wie sie interagieren.
    Für jede Klasse kannst Du Beziehungen definieren (zu welcher anderen Klasse? welcher Art? welche Kardinalität (Anzahl)?) und eine Verantwortung, die die Klasse hat (siehe auch CRC). Letzteres ist nicht mit ihrer Aufgabe zu verwechseln.

    Dann muss man sich noch für einen Rahmen entscheiden; das wurde schon erwähnt, es wird wahrscheinlich eine Hauptschleife, die mit jedem Durchlauf ein Zeitintervall simuliert.

    Versuch' mal einen Use Case - oder zumindest einen Teil davon - zu beschreiben.

    Gruß
    Werner



  • Interessante Aufgabe!

    Es ist imo irgendwie verlockend die Flugzeuge jeils in einem eigenen Thread "fliegen" zu lassen; eine Schleife koennte den Benzinvorrat zyklisch dekrementieren und bei entsprechender Dringlichkeit Nachrichten("queue me", "prioritze me"...) an einen Hauptthread senden der die Warteschleife managed.

    Grüsse

    *this



  • Danke für die vielen Tips!! Bin schon viel weiter gekommen, jetz hab ich allerdings ein Problem mit den queues... wie muss ich die implementieren? habe mit templates ni so die erfahrung...
    gibts da irgendwo gute beispiele?

    kann ich überhaupt ein Objekt (z.b.Flugzeug) is eine solche queue ablegen? ja oder?



  • Die brauchst du nicht zu implementieren, die liefert die Standard-Bibliothek schon mit - die Klasse queue<> stellt eine einfache (FIFO-)Warteschlange dar, priority_queue<> eine Prioritäts-Warteschlange (immer der höchstwertige Eintrag kann als nächstes entnommen werden).



  • kann ich bei der prio festlegen nach welchem parameter des objekts die auswahl erfolgt?

    gibts irgendwo gute beispiele wo ich mir mal anschauen kann wie das genau auszusehen hat?



  • Ja, der gibst du als Template-Parameter einen Funktor, der vergleichen soll, welches von zwei Objekten "größer" ist (die Defaultvorgabe ist "größer als").



  • wie geht das genau?
    sorry, dass ich mich etwas anstelle, aber der mensch wächst mit seinen herausforderungen 😉 trotzdem braucht man manchmal hilfe...



  • du überlädst einfach den "operator<"

    also so:

    bool operator<(const Flugzeug& o1,const Flugzeug & o2)
    {
        return o1.benzinstand<o2.benzinstand;//Beispiel
    }
    

    der queue selbst brauchst du dann nichts mehr übergeben.
    Problematisch wird das nur dann, wenn du bei verschiedenen queues flugzeuge nach anderen Gesichtspunkten sortieren willst. zb Passagiere, dann brauchst du eine andere Funktion.

    das geht dann so:

    bool vergleichePassagierzahl(const Flugzeug& o1,const Flugzeug & o2)
    {
        return o1.passagierzahl<o2.passagierzahl;
    }
    
    //und die queue sieht dann so aus:
    std::priority_queue<Flugzeug,std::vector<Flugzeug>,vergleichePassagierzahl> queue;
    

    aber aufpassen: die priority_queue testet nur ein einziges mal, an welcher stelle ein Objekt gehört, ändert sich nach dem einfügen was an der reihenfolge, ist das der queue absolut egal.

    Was auch nicht geht, ist einfach die vergleichsfunktion zu wechseln. die funktion wählst du einmal, und das bleibt dann.

    hier mal die referenz der queue(auf der seite findest du auch informationen zu allen anderern containern):
    http://www.sgi.com/tech/stl/priority_queue.html



  • Der zweite Code wird nicht so ganz funktionieren - priority_queue erwartet einen Typ (also Funktor):

    //Variante 1:
    std::priority_queue<Flugzeug,std::vector<Flugzeug>,(bool*)(const Flugzeug&,const Flugzeug&)> queue(vergleichePassagierzahl);
    
    //Variante 2 (vermutlich eleganter):
    struct vergleichePassagierzahl
    {
      bool operator()(const Flugzeug& o1,const Flugzeug & o2)
      {
        return o1.passagierzahl<o2.passagierzahl;
      }
    };
    
    std::priority_queue<Flugzeug,std::vector<Flugzeug>,vergleichePassagierzahl> queue;
    


  • ok, das sollte soweit funktionieren... wie bekomm ich eine referenz auf das mit der höchsten priorität versehene objekt?


Anmelden zum Antworten