Hilfe bei Funktionsaufgabe



  • Hallo Leute!
    Ich hoffe jemand kann mir hier weiterhelfen. Ich hänge bei einer Funktion in meinem Programm. Ich hoffe die angegeben Daten reichen um sich auszukennen 🙂
    Anweisung ist folgende: bool ready() const: Retourniert true, falls der Zug fahrbereit ist, das heißt, die Gesamtlast des Zuges ist höchstens so groß (<=) wie die Maximallast, zumindest je ein Wagon mit jeder der möglichen Einrichten vorhanden ist und niemals mehr als drei Waggons hintereinander hängen, die nicht di Einrichtung Feature::Toilette anbieten.
    das ist die mögliche Einrichtung:

    enum class Feature{Bar,Restaurant,Couchette,Standard,Toilet};
    const std::vector<std::string> feature_names{"bar", "restaurant", "couchette", "standard","toilet"};
    

    folgendes habe ich dazu schon geschrieben:

    bool Train::ready() const{
      int count{0};
      for(size_t i{0}; i < Liste.size(); ++i){
        if(Liste.at(i).get_feature() != Feature::Toilet){
          ++count;
        }
        else{
          count = 0;
        }
      }
      
      if(total_load() <= maximallast || count <=3 || ... )// hier fehlt mir noch die dritte Bedingung){
        return true;
      }
      else{
        return false;
      }
    }
    

    aber ich komme einfach nicht darauf wie ich die Voraussetzung angehen soll, dass zumindest je ein Wagon mit jeder der möglichen Einrichtungen vorhanden ist.

    Vielleicht hat ja jemand eine Idee.
    Danke!
    Lg Sabrina



  • @strawberryquartz Zählen.
    Zähle, wie oft die Einrichtungen vorkommen. Wenn mindestens eine davon 0 ist, ist die Voraussetzung nicht erfüllt.



  • Ich denke deine Logik um zu testen, ob jeder vierte Wagen eine Toilette ist, funktioniert noch nicht ganz. Aktuell hast du das Problem, dass die Bedingung erst ganz am Ende überprüfst.
    Wagenreihenfolge (1 == Toilette, 0 == irgendwas anderes):
    00001
    Hier ist dein count zwischendurch auf 4, wird aber durch die Toilette am Ende wieder auf 0 zurückgesetzt. Du musst also schon in der for schleife prüfen count > 3 return false;

    Zu deinem anderen Problem, eine Möglichkeit wäre eine Variable einzuführen für jedes Featue (bool hasBar, bool hasRestaurant ...). In deiner for schleife würde ich dann eine switch reinmachen und jedes Feature abgehen und die entsprechende Variable auf true setzen. Bei Feature::Toilette noch zusätzlich den Counter erhöhen. Dann kannst du am Ende abfragen, ob alle bools true sind.

    Edit: Alternativer Weg wäre alle benötigten Features in einem Vector zu speichern und die gefunden Features rauszulöschen. Das ist ein bisschen effizienter, da der Wagen dann nur auf die Features überprüft wird, die noch nicht gefunden wurden. Außerdem kannst du die Funktion dadurch allgemeiner schreiben ... z.B. neededFeatures als Parameter übergeben (per Value, da er in dieser Funktion verändert wird) ... wenn dein Zug plötzlich auch Feature::RuheAbteil haben soll, musst du nichts an der Funktion ändern.

    std::vector<Feature> neededFeatures = {Feature::Toilette, Feature::Bar ...); 
    for(const Wagen& wagen : Liste) {
      Feature wagenFeature = wagen.get_feature();
      for(size_t i = 0; i < neededFeatures.size(); ++i) {
         if(neededFeatures[i] == wagenFeature) {
           neededFeatures.remove(i);
           break;
         }
      }
      if(neededFeatures.empty()) {
        return true;
      }
    }
    

    Du kannst hier natürlich auch zu std::find greifen, wenn das erlaubt ist.



  • @Leon0402 danke dir 🙂 hat jetzt geklappt.


Anmelden zum Antworten