While schleife mit Buchstaben beenden!



  • Hi,

    bin Student (1. Semester) und habe hier eine Aufgabe die ich nicht schaffe zu lösen.

    Schreiben Sie ein Programm, das eine Reihe von Zahlen einliest und in einem vector<double> Container speichert.
    Nachdem der Benutzer eine beliebige Anzahl von Zahlen eingegeben hat,
    fragt das Programm, wie viele Zahlen davon aufaddiert werden sollen.
    Lautet die Antwort n, werden die ersten n Elemente des vector Containers sowie deren Summe ausgegeben.

    Beispielsweise:
    Geben Sie einige Zahlen ein (mit 'q' beenden Sie die Eingabe):
    12.3 1.23 0.13 24 1.5 q
    Wie viele Zahlen sollen aufaddiert werden: 3
    Die Summe der 3 Elemente 12.3, 1.23, und 0.13 ist 13.66.
    Verwenden Sie Ausnahmen, um möglichst alle Fehler zu behandeln. Behandeln Sie v.a. alle möglichen Eingaben. Stellen Sie auch sicher, dass eine vernünftige Fehlermeldung für die Ausnahme ausgegeben wird, wenn mehr Zahlen addiert werden sollen als im vector vorhanden sind.
    _________________________________________________________________

    Da unser Prof. naja... nicht sehr gut erklären kann (Klartext ich raff nix!) muss ich mir halt alles selber nochmal anschauen und zusammen suchen.

    Ich habe mich schon mal dran gesetzt, Problem ist bei mir aber das ich im double kein 'q' zum beenden speichern kann...
    naja seht selbst

    //Alle Header
    #include <iostream>
    #include <vector>
    
    //Weil ich faul bin!
    using namespace std;
    
    //Was alles noch so gebraucht wird...
    vector<double> vec;
    double input {};
    
    //Ab hier gehts los!
    int main () 
    {
        //Start
        cout << "Programm start: " << endl;
        //Eingabe Befehl
        cout << "Zahlenfolge eingeben. Beenden mit 'q': " << endl;
    
        while (cin != 'q')
        {
        cin >> input;
        vec.push_back(input);
        cout << "Gespeichert, nächste Zahl..." << endl;  
        }
    
        return 0;
    }
    

    ich versuche sozusagen erstmal wenn 'q' dann soll die schleife beendet werden...

    danke schon mal 😃



  • cin != 'q' macht keinen Sinn, ist aber schon nah dran.
    Du willst wissen, ob das nächste Zeichen q ist, also musst du das auch fragen:
    while (std::cin.peek() != 'q')
    cin.peek() liefert das nächste Zeichen zurück, ohne es einzulesen. Das heißt nach der Schleife steht das 'q' noch im Stream und muss mit std::cin.get() daraus entfernt werden.
    Problematisch sind lediglich Leerzeichen, die müssen vor dem peek() übersprungen werden. Das kann std::ws machen, std::cin >> std::ws überspringt alle Leerzeichen/Newlines/etc. aus dem Stream.
    Kombiniert ergibt das:
    while ((std::cin >> std::ws).peek() != 'q')
    Das funktioniert weil std::cin >> std::ws den Stream selbst zurückliefert, auf ihm kann dann peek() aufgerufen werden.



  • Super, danke 🙂



  • So, bin jetzt am ende der Aufgabe angelangt, da stellt sich mir wieder ein Problem in den Weg.

    Also ich soll dann N zahlen vom in den Vector befindliche Zahlen addieren.
    Eigentlich sollte mich mein Programm fragen wie hoch N sein soll, aber er überspringt einfach meine Anfrage (siehe Z. 43 )

    //Alle Header
    #include <iostream>
    #include <vector>
    
    //Weil ich faul bin!
    using namespace std;
    
    //Was alles noch so gebraucht wird...
    vector<double> vec;
    double input {};
    
    //Ab hier gehts los!
    int main () 
    {
        //Start
        cout << "Programm start: " << endl;
        //Eingabe Befehl
        cout << "Zahlenfolge eingeben. Beenden mit 'q': " << endl;
    
        //while schleife, mit der Bedingung: machen, solange cin nicht 'q'
        while ((cin >> ws).peek() != 'q') //https://www.c-plusplus.net/forum/332692
        {
        cin >> input;
        if (!cin) //Eine schöne Fehlermeldung :3
        {
            cerr << "Bitte nur Zahlen (oder 'q') eingeben!" << endl;
            cerr << "Programm erfordert neustart!" << endl;
                    return -1;
        }
    
        vec.push_back(input); //Wert input an letzter Stelle des Vectors drangehängt
        cout << "Gespeichert, nächste Zahl..." << endl;  
        }
    
        //--------------------------------------------------------------------------
    
        cout << "Eingabe wurde beendet. " << endl <<
                "Wie viele Zahlen sollen aufaddiert werden?" << endl;
    
        int summe {};
        double result {};
    
        cin >> summe; //summe soll angeben wie viele  addiert werden!
    
        /*if (!cin)
        {
            cerr << "Ungueltige Eingabe!" << endl;
            cerr << "Programm erfordert neustart!" << endl;
            return -2;
        }*/
    
        int vectorSize {};
        vectorSize = vec.size();
    
        while (summe < vectorSize )
        {       
            result = result + vec.at(summe);
            ++summe;
        }
    
        cout << "Die Zahlen ergeben zusammen: " << result << endl;
    
        return 0;
    }
    


  • std::cin.sync();
    	cin >> summe; //summe soll angeben wie viele  addiert werden! 
    
    				  /*if (!cin)
    				  {
    				  cerr << "Ungueltige Eingabe!" << endl;
    				  cerr << "Programm erfordert neustart!" << endl;
    				  return -2;
    				  }*/
    

    Edit:
    Wie Nathan schon sagte, liest peek() nur die Zeichen aus dem Eingabestrom und dementsprechend verbleibt das 'q' im Eingabestrom und wird mit dem cin >> für die summe ausgelesen. Die Summe ist dann vermutlich 0, oder der ASCII-Wert von 'q' (113).

    Ps: Sorri Nathan 😮



  • WIe ich schon sagte, du musst das 'q' aus dem Stream entfernen.
    Dazu kannst du cin.get() oder cin.ignore() verwenden:

    while ((cin >> ws).peek() != 'q') //https://www.c-plusplus.net/forum/332692
    {
       ...  
    }
    cin.ignore(); // überspringe q
    

    cin.sync() ist eher nicht geeignet, das Verhalten ist nicht exakt spezifiziert und nur unter Visual Studio einem ignore() aller Zeichen entspricht.



  • cin.sync() ist eher nicht geeignet, das Verhalten ist nicht exakt spezifiziert und nur unter Visual Studio einem ignore() aller Zeichen entspricht.

    Glatt vergessen, dass das Enter nicht eingelesen wird. Dann wäre nämlich zwei cin.ignore() nötig gewesen und das sieht blöd aus 😃 .


Anmelden zum Antworten