Container: Bestimmete Anzahl an Vektorfeldern zusammen addieren.



  • Hallo zusammen;

    bin anfänger und habe folgendes Problem:

    int main()
    {
    	vector<int>zahlenreihe;
    	int eingabe;
    	int anzahl;
    	int summe = 0;
    	int counter = 0;
    
    	cout << "Bitte geben Sie einige Zahlen ein.\n";
    	cin >> eingabe;
    
    	cout << "Bitte geben Sie an, wieviele Zahlen Sie aufaddiern 
                    möchten\n(Beginneng von der ersten) 
                   (Mit 'STRG + Z' beenden Sie die Eingabe)\n";
    	cin >> anzahl;
    
    	while(cin >> eingabe)
    	{
    		zahlenreihe.push_back(eingabe);
    	}	
    	cout << '\n';
    
    	while(counter != anzahl)
    	{ 
    		counter++;
    		summe+=zahlenreihe[counter];
    	}
    
    	cout << "Die Summe der aufaddierten Zahlen betraegt: "<< summe << endl;
    	cout << "Die groesse des Containers ist: " << zahlenreihe.size()<<endl;
    
    	getchar();
    	return 0;
    }
    

    ich möchte eine bestimme Anzahl mit Vector-Feldern addieren, bekomme es so nicht hin. Das Ergebnis ist immer die Zahl, die ich als anzahl angebe. Habe schon vieles versucht, auch mit einer for-schleife etc.. und und und... habe es mit einem iterator versucht, aber konnte die Felder nicht addieren, nur ausgeben lassen. Hoffe jemand kann mir erklären, warum und wie ein vector diesbezüglich funktioniert.



  • Hi,

    mir ist nicht ganz klar was du ueberhaupt machen willst?
    Du willst alle Zahlen die in einem Vector sind addieren ?!

    Was meinst du mit du moechtest eine gewisse Anzahl mit Vector Feldern addieren?

    Du speicherst int Werte in deinem vector.

    Mit jedem pushback gibt es einen weiteren int Wert im Vector.

    Mich irritiert auch:

    cout << "Bitte geben Sie einige Zahlen ein.\n";
    cin >> eingabe;
    

    Du gibst da nicht einige Zahlen ein sondern nur eine. Die du dann in einem Int Wert speicherst.



  • argh, kann meinen Einrag nicht editieren.

    Normalerweise nimmst du einen Iterator um durch einen vector bzw. stl container zu iterieren.

    bsp.:

    [code="cpp"]

    vector<int>::iterator it; (<- wenn man den Wert aendern will)
    vector<int>::const_iterator const_it (<- wenn du den Inhalt nur lesen willst)

    for (it=zahlenreihe.begin(); it != zahlenreihe.end(); ++it) {
    //code hier

    }

    Wenn du die Werte haben willst musst du den Iterator mit (*it) dereferenzieren.



  • cout << "Bitte geben Sie einige Zahlen ein.\n";
    cin >> eingabe;
    

    Habe vergessen das rauszunehmen.

    cout << "Bitte geben Sie einige Zahlen ein.\n";
    while(cin >> eingabe)
        {
            zahlenreihe.push_back(eingabe);
        }
    

    So ist es eigentlich.

    Genau, ich möchte einige Int-Werte im Vector speichern und z.B., wenn ich als (cin >> anzahl) die 3 eingebe, möchte ich die Summe der ersten 3 Werte ausgeben.



  • "Warnung dieser Post wurde unter Alkoholeinfluss erstellt und wird unter Umstaenden nach Ausnuechterung korrigiert"

    Hier mal ein ungetester code schnippsel mit fixem pushback und nicht abgefangener (ich gebe mal chars statt ints ein) Eingabe.

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main() {
    
      vector<unsigned int> zahlenreihe;
    
      //zahlen in den vector pushen
    
      zahlenreihe.push_back(100);
      zahlenreihe.push_back(200);
      zahlenreihe.push_back(300);
    
      bool in_range = false;
      unsigned int eingabe;
    
      do {
      cout << "Bitte geben Sie an wieviele Elemente des Vectors addiert werden sollen"<< endl;
    
      cin >> eingabe;
      if (eingabe > zahlenreihe.size()) {
         cout << "Value ist groesser Als Anzahl Elemente im Vector erneut probieren."<< endl;
    } else {
        in_range = true;
    }
    } while(in_range == false);
    
    //mit iterator
    
    vector<int>::const_iterator it;
    unsigned int summe = 0;
    
    for (it= zahlenreihe.begin(); it != zahlenreihe.end(); ++it) {
    
         if (eingabe == 0)
             break;
    
         summe = summe + *it;
         --eingabe;
    
    }
    
    cout << "Summe: " << summe << endl;
    
    return 0;
    
    }
    

    P.S.: Du kannst, dass auch ohne die Break Eingabe machen in dem du statt iteratoren eine for schleife mit index zugriff baust, oder den "zahlenreihe.end(); Befehl mit einem zweiten Iterator austauscht der auf "eingabe" gesetzt wurde.

    Ansonsten solltest du dir mal ein paar Tutorials zu Vectoren zu gemuete fuehren.

    Semantisch benutzt man die do {}while(); wenn erstmal Code ausgefuehrt werden soll.

    Die While Schleife benutzt man, wenn es passieren kann, dass der Code erstmal ueberhaupt nicht ausgefuehrt werden soll, ansonsten hast du eine ueberfluessige Pruefung am Anfang.

    Wenn du ausschliessen willst, das ein Value negative Zahlen erhalten kann benutze "unsigned int" statt int.



  • Ich denke folgendes soll gemacht werden: Beliebig viele Zahlen einlesen und dann so viele davon ausgeben, wie der Benutzer bestimmt. Natürlich muss überprüft werden, ob dann auch so viele Zahlen eingegeben wurden!;)

    mfg



  • sorry, nicht ausgeben, addieren -.-



  • Agh, bitte meine Beiträge einfach ignorieren 🙄 👎 Sorry wegen dem gespamme



  • @ Rvui: Ist nicht das wonach ich gesucht habe, da keine werte eingegeben werden.

    @ hardware: Ja, du hasst begriffen was ich vor habe.



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


Log in to reply