Container: Bestimmete Anzahl an Vektorfeldern zusammen addieren.
-
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?
-
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, obanzahl
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;
-
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.
-
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).