Warum funktioniert diese for-Schleife nicht?


  • Mod

    bandchef schrieb:

    Ich müsste ja da quasi jetzt noch eine for schleife reinbauen die mir die summen mit zählt, oder? aber irgendwie blick ichs nicht

    Nein, ich meine etwas anderes. Was soll x bei dir sein? Doch die Summe, oder? Aber du addierst nichts zu x, du weist immer nur den nächsten Wert zu.



  • Fall1: i=1 -> x=5
    Fall2: i=2 -> x=7
    usw...

    Aber wie realisiere ich jetzt die aufsummation?


  • Mod

    Lass dich mal davon inspirieren wie du zu i bei jedem Schleifendurchgang 1 hinzuaddierst.



  • So, mein Code sieht so aus:

    #include<iostream>
    using namespace std;
    
    int main(){
    
        int n, i, j, f, x;
    
        cout << "n eingeben: n=";
        cin >> n;
        f=0;
        for(i=0; i <= n; i=i+1)
        {
         x = 2*i+3;
         f = (x + x)/2;
        }
    
        cout << "Ergebnis der Summe fuer " << n << " Addition(en): f=" << f << endl;
    
        system("pause");
        return 0; 
    }
    

    Ich muss aber gestehen, ich bin irgendwie nur durch Zufall draufgekommen. Hast du das so gedacht?



  • Du brauchst keine neue Variable dafür.
    Für i=i+1 benötigst du ja auch keine zweite.



  • Btw.:
    Deklariere nicht alle Variablen am Anfang, sondern erst dann, wenn du sie braucht und initialisiere die dann direkt. Mit uninitialisierten Variablen können einem ganz schön miese Sachen passieren.
    Und das desgin eine for-Schleife sieht so nicht nur besser aus:

    for (int i = 0; i < x; ++i) {
      //.....
    }
    


  • 1. Das Programm tut noch nicht das, was es tun soll (Summe der 2i+3, i ≤ n).
    2. (x + x) / 2 = 2 * x / 2 = x.



  • for(i=0; i <= n; i=i+1)
        {
         x += 2*i+3;
        }
    


  • Ich muss aber gestehen, ich bin irgendwie nur durch Zufall draufgekommen. Hast du das so gedacht?

    Worauf bist du gekommen? Das Programm macht immer noch das Selbe, nur noch etwas umständlicher.
    f=(x+x/2) ist äquivalent zu f=x, enthält also immer noch nur das lezte Ergebnis.

    Ich hoffe die Hausaufgabenmoderation findet nicht, dass ich zu viel verrate:
    Statt 'x=...' schreib doch einfach 'x+=...', nicht zu vergessen, dass du dann zu Begnn x auf 0 setzen musst.

    EDIT: Oha, 2. Seite übersehen, da stehts ja schon 🙂



  • Also noch mal komplett:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int x = 0;
        for(int i = 1; i <= 5 /* oder eben n */; i++)
        {
            x += ((2 * i) + 3);
        }
        cout << x << "\n";
        return 0;
    }
    


  • Incocnito schrieb:

    Also noch mal komplett:

    Wobei du eine Sache geändert hast ("++i" in "i++"). Grundsätzlich würde ich mir die Variante angewöhnen, die im Zweifel die Vorteilhaftere ist (Der Mensch ist ein Gewohnheitstier).

    Hier mag es keinen Unterschied machen, aber falls i mal kein int-Wert, sondern ein komplexeres Objekt (z.B. eine Klasse ist), wäre ++i im Zweifel immer die bessere Wahl (eine temporäre Variable weniger).



  • Oh stimmt, du hast recht. Hmm noch ist es ja nicht zu spät sich umzugewöhnen, werd ich mal also merken, danke.



  • Wenn ich nun die Summe von 2*i+3 berechnen möchte für n=5 komme ich auf 45. Wenn ich es aber dem Programm berechnen lasse komme ich auf 48 😞

    Dieses x += ((2*i)+3) entspricht ja eigentlich ja dem hier: x = x + ((2*i)+3) Oder?

    Mein Code:

    #include<iostream>
    using namespace std;
    
    int main(){
    
        int n, x=0;
    
        cout << "n eingeben: n=";
        cin >> n;
    
        for(int i=0; i <= n; ++i)
        {
         x += ((2*i)+3);
    
        }
    
        cout << "Ergebnis der Summe fuer " << n << " Addition(en): f=" << x << endl;
    
        system("pause");
        return 0; 
    }
    

    Warum kommt da 48 raus?



  • Fehler selbst gefunde: i=0 war falsch...


Anmelden zum Antworten