Summe zweier vector Container
-
Also die Übung ist in Buch Einführung in die Programmierung mit C++. Und der Text ist folgendes:
Schreiben Sie eine Funktion, die unter Verwendung zweier gegebener vector <double> -Container names price und weight einen Wert (einen „Index“) berechnet, der die Summe aller price[i]*weight[i] darstellt. Beachten Sie, dass weight.size()<=price.size() gelten muss.
-
Eine mögliche Lösung (wobei ich davon ausgehe, dass beide Vektoren gleich gross sind):
#include <numeric> #include <vector> double sumOfProducts (std::vector<double>& weight, std::vector<double>& price) { if (weight.size()==price.size()) return std::inner_product(weight.begin(),weight.end(),price.begin(),0.0); throw std::runtime_error("vector sizes mismatch"); } // ... snipsnapEine andere Möglichkeit wäre:
double sumOfProducts2 (std::vector<double>& weight, std::vector<double>& price) { if (weight.size()<=price.size()) { double sum = 0.0; for (int i = 0; i!= weight.size(); ++i) sum += weight[i]*price[i]; return sum; } throw std::runtime_error("weight-vector is greater than price-vector"); }
-
Danke für deine Hilfe.
-
Was ist mit das hier gemeint:
for (int i = 0; i!= weight.size(); ++i)Wenn das nicht gleich ist dann wird nichts gemacht?
-
*Seufz*
@inter2k3 und was hat er jetzt daraus gelernt? Könnte er jetzt die nächste Aufgabe aus dem Buch besser lösen?
@winux was ist denn deine Muttersprache?
//edit deine For-Schleife lässt sich wie folgt zerlegen (ich gehe einfach davon aus, dass du bereits while kennst):
int i=0; while (i!= weight.size()){ //tue das was in der For-Schleife zwischen den {...} steht //... ++i; }Hilft dir das weiter?
-
@otze
Meine Muttersprache ist Ungarisch. Aber Deutsch kann ich auch gut, nur wenn ich etwas nicht verstehe dann lese es drei oder viermal. Ja while kenne ich.
-
Jetzt bin weiter gekommen dank eure Hilfe. Und so ist die Aufgabe gelöst.
-
otze schrieb:
*Seufz*
@inter2k3 und was hat er jetzt daraus gelernt? Könnte er jetzt die nächste Aufgabe aus dem Buch besser lösen?
Hoffentlich, dass es für jedes Problem mehrere Lösungen gibt (auch wenn ich nur zwei präsentiert habe).
Ausserdem war offensichtlich, dass er aufgrund der beschränkten Deutschkenntnisse die Aufgabe nicht richtig verstanden hat. Meine Hoffnung war, dass dies aus dem code (vorallem dem zweiten Beispiel) hervorgeht, was gefordert war.
Dass die absoluten Grundlagenkenntnisse (z.b. for-schleife) noch nicht fundiert sind konnte ich ja nicht ahnen.
Du erklärst die Funktionsweise der For-Schleife ja auch anhand von code
-
Das mit dem schleifen kenne ich schon, aber mich hat nur eins verwirrt das ich noch sowas nicht gesehen habe. Und zwar das:
for (int i = 0; i!= weight.size(); ++i)Aber so etwas kenne ich schon:
for (int i = 0; i<= weight.size(); ++i)
-
#include <vector> #include <iostream> int main() { std::vector<double> vec; vec.push_back(10); vec.push_back(15); vec.push_back(20); std::cout << "for (int i = 0; i < vec.size(); ++i)" << std::endl; for (int i = 0; i < vec.size(); ++i) { std::cout << vec[i] << std::endl; } std::cout << "\nfor (int i = 0; i <= vec.size() - 1; ++i)" << std::endl; for (int i = 0; i <= vec.size() - 1; ++i) { std::cout << vec[i] << std::endl; } std::cout << "\nfor (int i = 0; i != vec.size(); ++i)" << std::endl; for (int i = 0; i != vec.size(); ++i) { std::cout << vec[i] << std::endl; } return 0; }Alle 3 Schleifen tun das gleiche. Es ist nur eine unterschiedliche Formulierung.
Ich würde aber zur ersten Variante raten.
for (int i = 0; i < vec.size(); ++i) { std::cout << vec[i] << std::endl; }Die zweite Variante ist unnötig kompliziert:
for (int i = 0; i <= vec.size() - 1; ++i) { std::cout << vec[i] << std::endl; }Und die dritte Variante empfinde ich als unschön. Ich vergleiche nur bei Iteratoren auf ungleich.
-
Jetzt ist alles klar, und dank eure Hilfe hab ich wieder was gelernt.
-
Winux um das nochmal zu betonen.
In C++ werden Intervalle (ranges) immer als Halboffen [begin, end) angegeben.
Das bedeutet, das begin noch dazugehört und end nicht.Deswegen sind
for (int i = 0; i<= weight.size(); ++i)und
for (int i = 0; i != weight.size(); ++i)nicht das selbe! Die Merkregel ist: bei 5 Durchläufen bei 0 anfangen und
auf i != 5 oder auf i < 5 testen. Und am besten in eigenem Code
das immer ganz genauso machen. Dann muss man nämlich nicht jedes mal überlegen.