Container: Bestimmete Anzahl an Vektorfeldern zusammen addieren.



  • Danke euch schon mal für euer Antworten, bin noch nicht dazu gekommen es zu testen. Bin noch bei der Arbeit. Sobald ich dazu komme, werde ich das Ergebnis mitteilen.



  • #include <iostream>
    #include <vector>
    
    int main()
    {
    	vector<unsigned int>zahlenreihe;
    	unsigned int eingabe;
    	unsigned int anzahl;
    	unsigned int summe = 0;
    
    	cout << "Bitte geben Sie einige zahlen ein: \n";
    
    	while(cin>>eingabe && eingabe)
    		zahlenreihe.push_back(eingabe);
    
    	cout << "Bitte geben Sie an wieviel Elemente des Vectors  addiert werden sollen" << endl;
    	cin >> anzahl;
    
    	for(int i =0; i != anzahl; ++i) summe += zahlenreihe[i];
    
    	cout << "Die ersten " << anzahl << " Elemente werden addiert.\n";
    	cout << "Die Summe der aufaddierten Zahlen betraegt: " <<  summe << endl;
    	cout << "Die Groesse des Containers ist: " << zahlenreihe.size() << endl;
    
    	getchar();
    	return 0;
    }
    

    So der Code sieht jetzt so aus. Nachdem ich einige Werte eingebe und die schleife verlasse bekomme ich leider immer noch den Fehler : Out of range in line 932.. der code hat aber keine 932 zeilen, ist wahrscheinlich auf die headerdahei bezogen...

    EDIT: So, wenn ich als letzte eingabe die 0 eingebe kommt die Fehlermeldung nicht mehr und das Programm macht was es soll. Nun wie kann ich vermeiden, das ich die 0 am ende eingeben muss.

    EDIT: Hab vergessen zu erwähnen das, dass Programm auch gleich beendet wird, so dass ich das Ergebnis nur kurz sehen konnte, aber es war richtig.



  • durch

    while( cin >> eingabe && eingabe )
    

    ist die 0 deine "terminierende" Eingabe. Schau mal die Seite weiter vorne (da stehen auch Lösungen für dein anderes Problem, z.B. die Variablen erst deklarieren wenn du sie brauchst und INITIALISIEREN. Dann ist die Fehlersuche viel leichter und du bekommst weniger unerwartete "out-of-range" Fehler

    fenster auf windows offen halten:

    std::cout << "\nChar eingeben, um das Fenster zu schließen\n";
    char ch;
    std::cin >> char;
    //net getestet
    

    mfg



  • Das Problem ist, wenn du Müll eingibst um das ganze zu Beenden steht der Müll noch im Buffer von cin.
    Bei cin >> anzahl wird nicht gewartet, weil cin hat noch den Müll im Speicher, auf den es operieren kann. Da der Müll aber nicht zu einer Zahl konvertierbar ist, setzt er cin auf einen Fehlerzustand und verändert anzahl nicht.
    anzahl hat daraufhin einen Wert, der zufällig gerade im Speicher stand. Der ist höchstwahrscheinlich größer als die Größe deines Containers.
    Du musst also vor cin >> anzahl den Buffer von cin löschen, dass machst du mit der Memberfunktion ignore.
    Das gleiche Problem ist auch mit getchar() am Ende (BTW: Wieso getchar? getchar ist C, verwende cin.get()). Das Enter am Ende der letzten Eingabe ist noch im Buffer und wird direkt verwendet.



  • So, das mit cin.get() geht auch nicht.
    Hab eine funktion geschrieben, die das offen hält.

    inline void fenster_offen_halten()
    {
    	cin.clear();
    	cout << "Bitte geben Sie ein Zeichen ein, um das Programm zu beenden\n";
    	char ch;
    	cin >> ch;
    	return;
    }
    

    Das mit dem cin.ignore(); hat nicht geholfen.. also wenn ich nicht die 0 am ende eingebe um die Schleife zu verlassen, kommt die Out of range Meldung. Dies funktioniert nur, wenn ich while(cin >> eingabe && eingabe) stehen habe, nicht bei while(cin >> eingabe).



  • Du musst ignore natürlich auch Parameter übergeben (s. Referenz zu C++)!
    Und den Fehlerzustand des Streams löschen.



  • HarteWare schrieb:

    vector<unsigned int>zahlenreihe;
    unsigned int eingabe = 0;
    unsigned int anzahl = 0;
    unsigned int summe = 0;
    
    cout << "Bitte geben Sie an wieviel Elemente des Vectors  addiert werden sollen" << endl;
    cin.clear();
    cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    cin >> anzahl;
    

    !!! 🙄



  • Hat leider nicht geklappt wie gesagt.

    hab jetzt mal den fehler aus dem der vector-header.datei kopiert.

    reference operator[](size_type _Pos)
    		{	// subscript mutable sequence
     #if _ITERATOR_DEBUG_LEVEL == 2
    		if (size() <= _Pos)
    			{	// report error
    			_DEBUG_ERROR("vector subscript out of range");
    			_SCL_SECURE_OUT_OF_RANGE;
    			}
    


  • @ HarteWare

    Die fehlermaldung kommt jetzt nachdem ich anzahl eingegeben habe und nicht davor.



  • zeljko.grgic schrieb:

    Hat leider nicht geklappt wie gesagt.

    hab jetzt mal den fehler aus dem der vector-header.datei kopiert.

    reference operator[](size_type _Pos)
    		{	// subscript mutable sequence
     #if _ITERATOR_DEBUG_LEVEL == 2
    		if (size() <= _Pos)
    			{	// report error
    			_DEBUG_ERROR("vector subscript out of range");
    			_SCL_SECURE_OUT_OF_RANGE;
    			}
    

    Also, so will dir keiner helfen... "Hat leider nicht geklappt" hat so viel Aussagekraft wie:

    "     "
    

    und sollte generell vermieden werden, wenn man relevante Antworten möchte. Ich wette du hast nicht die Variablen initialisiert, so wie gesagt wurde, weil du immernoch den out-of-range error mit einem garbage Wert bekommst. Ich habe gerade den zuletzt geposteten Quellcode mit den kleinen Modifikationen getestet und er funktioniert, sowohl mit 0 zum Beenden der Eingabe, als auch irgend ein Mist, z.B. "d".

    Um die Parameter für cin.ignore() nutzen zu können, brauchst du im Übrigen auch den Header

    #include <limits>
    

    mfg



  • @ HarteWare

    Sorry hast recht, der letzt Beitrag von mir war nicht hilfreich.

    Danke für deine Hilfe, es klappt jetzt wie du es gesagt hast. Egal ob 0 oder ein anders Zeichen.

    @ Nathan

    Dir auch ein Danke.
    Mit meinem jetzigen Wissenstandt, wäre ich nicht darauf gekommen den Speicher zu leeren.



  • Du solltest auf jeden Fall prüfen, ob Anzahl kleiner als die Anzahl eingegebenen Daten ist.

    int main() 
    { 
        vector<unsigned int>zahlenreihe; 
        unsigned int eingabe; 
        unsigned int anzahl; 
        unsigned int summe = 0; 
    
        cout << "Bitte geben Sie einige zahlen ein: \n"; 
    
        while(cin>>eingabe) 
            zahlenreihe.push_back(eingabe); 
    
        cout << "Bitte geben Sie an wieviel Elemente des Vectors  addiert werden sollen" << endl; 
        cin >> anzahl; 
    
        /*cout << "Bitte geben Sie einige zahlen ein: \n"; 
        while(cin>>eingabe) 
            zahlenreihe.push_back(eingabe);*/ 
    
        // Möglichkeit 1: Meldung und Abbruch
        if( Anzahl > zahlenreihe.size() )
        {
            cout << "Die gewünschte Anzahl der Summanden ist größer als die Menge der Zahlen\n";
            return -1;
        }
        // Möglichkeit 2: Anzahl anpassen
        Anzahl = min( Anzahl, zahlenreihe.size() );        
    
        for(int i =0; i != anzahl; ++i) summe += zahlenreihe[i]; 
    
        cout << "Die ersten " << anzahl << " ELemente werden addiert.\n"; 
        cout << "Die Summe der aufaddierten Zahlen betraegt: " <<  summe << endl; 
        cout << "Die Groesse des Containers ist: " << zahlenreihe.size() << endl; 
    
        getchar(); 
        return 0; 
    }
    

Anmelden zum Antworten