Anweisungen an richtiger Stelle in Schleifen positionieren.



  • Hallo zusammen,
    ich möchte ein Programm schreiben, in dem nacheinander eine Reihe von Namen und Punkten eingelesen werden und nachher soll man nach Abfrage eines Namens die zugehörige Anzahl an Punkten herausbekommen.
    Sobald ein Name zum zweiten Mal eingegeben wird, soll eine Fehlermeldung kommen.
    Mein Problem ist, dass der Name trotzdem noch in dem Vektor gespeichert wird und man am Ende dann zwei Ausgaben mit unterschiedlichen Punktzahlen bekommt.
    Ich habe schon versucht, das Speichern des Wertes in den else-Teil der if-Bedingung zu packen, aber dann wird gar kein Wert mehr gespeichert.
    Könnt ihr mir vielleicht helfen?

    #include "std_lib_inc.h"

    int main(){
    // Klasse Eintrag definieren
    class Eintrag {
    public:
    string name;
    int punkte;

        Eintrag(string n, int p) : name(n), punkte(p) {}
    };
    
    // Eingabe des Namens
    vector <Eintrag> eintraege{};
    cout<<"Bitte gib einen Namen gefolgt von einem Leerzeichen und einer Punktzahl ein. Drücke anschließend Enter.Um die Eingabe abzubrechen, gib x ein.\n";
    string input_name = "pups";
    int input_punkte = 0;
    while (true) {
        cin >> input_name;
        if (input_name == "x") { // Möglichkeit, Eingabe zu beenden
            cout << "Die Eingabe wurde beendet\n.";
            break;
        }
        cin >> input_punkte; // Eingabe der Punkte
        Eintrag neuerEintrag(input_name, input_punkte);  // Speichern der eingegebenen Werte in dem Vektor
        for (int i = 0;i < eintraege.size(); ++i) {     // Kontrollieren, ob zu dem Namen bereits ein Eintrag existiert.
            if (eintraege[i].name == input_name) {
                cout << "Zu diesem Namen existiert bereits ein Eintrag.\n";
                break;
            }
    
        }
        eintraege.push_back(neuerEintrag); //Darf nur an dieser Position stehen, sobald ich es in eine der geschweiften Klammern oder gar als else Anweisung verwende, funktioniert gar nix mehr.
    }
    
    cout<<"Bitte gib den Namen der Person ein, deren Punktzahl du erfahren möchtest: \n";   //Eingabe eines Namens
    while (true){
        string name_current = "klacks";
        cin>> name_current;
    
        //Möglichkeit, das Programm zu beenden
        if (name_current=="x") {
            cout << "Das Programm ist beendet.\n";
            break;
        }
        else {
            for (int g = 0; g < eintraege.size(); ++g){
                if (name_current == eintraege[g].name){
                    cout<<name_current<<" besitzt "<<eintraege[g].punkte<<" Punkte.\n";
                }
            }
        }
    
    
    }
    

    }



  • Schau dir mal eine std::map an (siehe https://en.cppreference.com/w/cpp/container/map)

    Benutze eine Map von Namen auf Punktzahl. Du kannst dann leicht nachschauen, ob ein Eintrag schon existiert.

    Also:

    ...
    std::map<std::string, int> eintraege;
    (einlesen)
    if (eintraege.count(input_name)) { 
       // Fehler: mich gibts schon
    } else {
       eintraege[input_name] = input_punkte;
    }
    
    // Abfrage:
    (name einlesen)
    auto it = eintraege.find(name_current);
    if (it != eintraege.end()) {
       std::cout << name_current << " hat " << *it << " Punkte.\n";
    } else {
       // nicht gefunden
    }
    
    


  • Füge zwischen Zeile 16 und 17 ein:

    bool EintragSchonDa{false};
    

    füge zwischen Zeile 19 und 20 ein:

    EintragSchonDa = true;
    

    füge zwischen Zeile 23 und 24 ein:

    if(!EintragSchonDa)
    

    Edit:
    Oder mach es wie wob vorschlägt ...



  • Mein Gott, was ist an der Markdown-Code-Tag-Syntax so schwer, dass da immer so ein Murks bei rauskommt, wie oben? Das Forum hat doch sogar einen großen Button dafür...

    Einfach

    ```cpp
    hier dein C++-Code ...
      usw.
    ```
    

    schreiben.


Anmelden zum Antworten