Container: Bestimmete Anzahl an Vektorfeldern zusammen addieren.



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



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


Anmelden zum Antworten