Container: Bestimmete Anzahl an Vektorfeldern zusammen addieren.



  • int main()
    {
    	vector< unsigned int>zahlenreihe;
    	unsigned int eingabe;
    	unsigned int anzahl;
    	unsigned int summe = 0;
    
    	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);
    
    	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, habe es jetzt so hinbekommen... kann mir einer vll. sagen, wie ich es schreiben müsste, wenn ich erst die Zahlen eingebe und danach (cin >> anzahl)?



  • Hallo,

    in deinem Original-Code

    while(counter != anzahl)
    {
        counter++;
        summe+=zahlenreihe[counter];
    }
    

    vertausche mal die beiden Zeilen innerhalb des Blocks.

    P.S: Mit Standardmitteln geht auch einfach

    int summe = std::accumulate(zahlenreihe.begin(), zahlenreihe.begin() + anzahl, 0); // dazu #include <numeric> benutzen
    

    (sofern anzahl <= zahlenreihe.size() ist - also vorher überprüfen!)



  • 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);*/
    
    	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;
    }
    

    Wenn ich es so versuche, bekomme ich einen out of range error, kann es sein, das es an MS vs c++ 2010 liegt?


  • Mod

    Wenn ich es so versuche, bekomme ich einen out of range error, kann es sein, das es an MS vs c++ 2010 liegt?

    Nein, sicher nicht. Schau dir noch mal deinen Code und den eingegebenen Wert für anzahl an.

    Um alle Elemente einer Range aufzuaddieren kannst du auch viel einfacher std::accumulate verwenden.

    int summe = std::accumulate( zahlenreihe.begin(), zahlenreihe.begin() + anzahl, 0 );
    

    (ungetestet)
    Natürlich solltest du noch überprüfen, ob anzahl kleiner/gleich der Größe des Containers ist.



  • 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;
    

  • Mod

    Besser: Schleife zu

    while( cin >> eingabe && eingabe )
    

    ändern



  • Was bringt das? (Interessenfrage, keine Kritik)

    mfg



  • HarteWare schrieb:

    Was bringt das? (Interessenfrage, keine Kritik)

    mfg

    Es wird keine 0 im Vector abgespeichert, da sie beim Addieren eh nichts verändert.



  • achso, bei Integern 0 entspricht false und alles andere true, ja?



  • HarteWare schrieb:

    achso, bei Integern 0 entspricht false und alles andere true, ja?

    Ja.
    Und die Eingabe der 0 beendet übrigens auch die Schleife.


  • Mod

    Nathan schrieb:

    Und die Eingabe der 0 beendet übrigens auch die Schleife.

    Das ist der Grund, ja. So muss man nicht irgendeinen Müll eingeben, um sie abzubrechen, und der Programmierer muss das auch nicht so behandeln.



  • 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.


Anmelden zum Antworten