Summe zweier vector Container



  • Denke das ist die Lösung:

    if (weight.size() <= price.size()){ 
    		val = price.size() * weight.size();
    		cout << val << endl;}
    


  • Funktioniert es denn?



  • Ja es Funktioniert. Danke für deine Hilfe.

    void calc(const vector <double>& price,const vector <double>& weight){ 
    	double val;
    	val = price[0] * weight[0];
        cout << val << endl;
    	val = price[1] * weight[1];
    	cout << val << endl;
    	val = price[2] * weight[2];
    	cout << val << endl;
    	val = price [3] * weight[3];
    	cout << val << endl;
    	cout << " " << endl;
    	if (weight.size() <= price.size()){   // For the calculation
    		val = price.size() * weight.size();
    		cout << val << endl;}
    	cout << " " << endl;
        if (weight[0] <= price[0]){
    		val = price[0] * weight[0];
    		cout << val << endl;}
    	if (weight[1] <= price[1]){
    		val = price[1] * weight[1];
    		cout << val << endl;}
    	if (weight[2] <= price[2]){
    		val = price[2] * weight[2];
    		cout << val << endl;}
    	if (weight[3] <= price[3]){
    		val = price[3] * weight[3];
    		cout << val << endl;}
    }
    
    int main()
    try{
        vector <double> price;
    	vector <double> weight;
    
        price.push_back(45.56);
    	price.push_back(4.5);
    	price.push_back(66.89);
        price.push_back(0.4555);
    
    	weight.push_back(32.89);
    	weight.push_back(2.2);
    	weight.push_back(99.45);
    	weight.push_back(56.6);
    
    	calc(price,weight);
    
    	keep_window_open();
        return 0;
    }
    catch (runtime_error e) {	
    	keep_window_open("~");	
    }
    catch (...) {	
    	cout << "exiting\n";
    	keep_window_open("~");	
    }
    


  • Oh, wenn das die Lösung ist hab ich offenbar deine Aufgabenstellung falsch verstanden. Ich dachte das soll nicht nur mit genau vier und nur vier Elementen gehen...



  • Dein Problem ist offensichtlich nicht die Programmiersprache sondern die Aufgabe ansich.
    kleiner Tipp: schreib dir mal ruhig kleinschrittig in Prosa auf (oder als Stichpunktliste) was dein Programm in welcher Reihenfolge tun soll. Dann versuchst du erst im nächsten Schritt daraus einen Programmcode zu machen, indem du dich genau an deine Stichpunkte hälst.

    Wenn du das nächste mal Programmcode postest, solltest du deine Stichpunktliste ebenso mit abtippen, damit wir dir das korrigieren können.

    //edit deine zuletzt genannte Lösung ist Schrott. In deiner Aufgabe steht explizit "die Summe". Dein Programm enthält aber nicht ein einziges "+".

    Auch beachtest du nicht die von dir genannte Restriktion. Stell dir vor, price hat nur 3 Elemente. Was passiert, wenn du dann price[3] aufrufst? Und was machst du, wnen beide Vektoren 10 Elemente haben?



  • Ja so ist es, ich verstehe die Aufgaben nicht immer. Eine bessere Deutsch Kenntnisse würde nicht schaden. Aber wenn ich eine Aufgabe nicht verstehe kann ich dann den ganzen Text auch hier reinschreiben?



  • 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");
    }
    // ... snipsnap
    

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


Anmelden zum Antworten