Anfänger hat Probleme mit ner Schleife



  • danke für die tipps, aber die schleife läuft einmal zu weit. D.h wenn ich 4 ausrechne kommt statt 10 , 15 das heisst die schleife läuft bis 5.


  • Mod

    pettajam schrieb:

    danke für die tipps, aber die schleife läuft einmal zu weit. D.h wenn ich 4 ausrechne kommt statt 10 , 15 das heisst die schleife läuft bis 5.

    Na, dann musst du deine Schleifenbedingung eben anpassen. Ich mache dir mal vor, was derzeit passiert (bei dem Code von Wutz):

    Anfang: zahl=5, i=0, k=0.
    
    Erster Durchlauf: 
    Teste 0<=5. Stimmt. Durchlauf kann losgehen.
    i=0+1=1
    k=0+1=1
    
    Zweiter Durchlauf: 
    Teste 1<=5l. Stimmt. Durchlauf kann losgehen.
    i=1+1=2
    k=1+2=3
    
    Dritter Durchlauf: 
    Teste 2<=5. Stimmt. Durchlauf kann losgehen.
    i=2+1=3
    k=3+3=6
    
    Vierter Durchlauf: 
    Teste 3<=5. Stimmt. Durchlauf kann losgehen.
    i=3+1=4
    k=3+4=10
    
    Fünfter Durchlauf: 
    Teste 4<=5. Stimmt. Durchlauf kann losgehen.
    i=4+1=5
    k=10+5=15
    
    Sechster Durchlauf: 
    Teste 5<=5. Stimmt. Durchlauf kann losgehen.
    i=5+1=6
    k=15+6=21
    
    Siebter Durchlauf: 
    Teste 6<=5. Stimmt nicht. Abbruch.
    
    Endergebnis: i=6, k=21, zahl=5
    


  • SeppJ schrieb:

    Na, dann musst du deine Schleifenbedingung eben anpassen.

    Einleuchtender wäre es aber, die Anweisungsreihenfolge umzustellen. Also erst k erhöhen, dann i inkrementieren.



  • Vicious Falcon schrieb:

    Einleuchtender wäre es aber, die Anweisungsreihenfolge umzustellen. Also erst k erhöhen, dann i inkrementieren.

    Ach was. Richtig einleuchtend ist es erst, wenn die Reihenfolge keine Rolle mehr spielt.
    🙂



  • ahh danke.
    Ich hab jetzt einfach so geschrieben.

    while(i<=zahl-1)
    


  • Erleuchtend ist wenn man den Algorithmus von Gauß nimmt: s = n * (n+1) / 2

    s = (n % 2) ? (n+1)/2*n : n*2*(n+1); // wegen Überlauf
    

    (Bitte um Korrektur falls ich es doch vertauscht habe 🙂 )



  • DirkB schrieb:

    Erleuchtend ist wenn man den Algorithmus von Gauß nimmt: s = n * (n+1) / 2

    Jedenfalls. Warum? Weil da die Reihenfolge keine Rolle spielt.
    🙂



  • Bei Computern sollte man sich durchaus mal Gedanken über die Reihenfolge der Berechnungen machen.
    Bei 32-Bit unsigned Integer kommt man mit der einfachen Version bis 65535.
    Mit der angepassten bis 92681.



  • DirkB schrieb:

    Bei Computern sollte man sich durchaus mal Gedanken über die Reihenfolge der Berechnungen machen.

    Aber hast du schon jemals eine mathematische Formulierung gesehen, in der die Zeit (es sei denn explizit eingeführt) irgendeine Rolle spielt? Man kann Programmiersprachen auch näher an Mathe anlehnen. Bei vielen arithmetischen Beispielen finde ich das dann klarer.

    DirkB schrieb:

    Bei 32-Bit unsigned Integer kommt man mit der einfachen Version bis 65535.

    Ist das nicht ein bisschen wenig?

    Nachtrag:
    Aber ich weiss schon, dass man, wenn man nahe genug an der Hardware formuliert, irgendwann über die Reihenfolge nachdenken muss.



  • Als Lernaufgabe ist das Problem super. Man kann es iterativ, rekursiv und eben durch eine Formel lösen.

    Nur sollte man sich auch Gedanken über das wie machen.

    Aber hast du schon jemals eine mathematische Formulierung gesehen, in der die Zeit (es sei denn explizit eingeführt) irgendeine Rolle spielt?

    Nur bei der numerischen Lösung mit dem Computer gibt es Zeitprobleme.
    Der mathematische Formulierung ist es egal in welcher Zeit sie berechnet wird.

    Aber 'damals' (bei 8/16-Bit Computer mit einstelligen MHz) war es schon wichtig ob die Berechnung nun x Minuten oder 1 Sekunde dauerte.



  • DirkB schrieb:

    Als Lernaufgabe ist das Problem super.

    Wahrscheinlich. Lieber eine einfache Aufgabe, die man dafür aber ordentlich versteht.

    DirkB schrieb:

    Nur bei der numerischen Lösung mit dem Computer gibt es Zeitprobleme.
    Der mathematische Formulierung ist es egal in welcher Zeit sie berechnet wird.
    ...

    Ja klar, aber ich meinte "Zeit" im Sinne von "Reihenfolge, in der die Anweisungen ausgeführt werden".

    Sind es sicher nur 65535?
    🙂



  • mngbd schrieb:

    Sind es sicher nur 65535?:)

    Als Beispiel für unsigned int (32-Bit)
    `s = n * (n+1) / 2

    = (n[h]2[/h] + n) / 2`
    wenn n = 65536 = (216) ist dann ist n2 = 232
    da ein 32-Bit unsigned int aber nur bis 232-1 geht ist da schon der Überlauf. Und es kommt ja noch was dazu. Danach wird erst durch 2 geteilt.

    Bei

    s = (n % 2) ? (n+1)/2*n : n*2*(n+1); // wegen Überlauf
    

    wird erst die gerade Zahl durch 2 geteilt, dadurch hat man etwas mehr Spielraum.



  • DirkB schrieb:

    Als Beispiel für unsigned int (32-Bit)
    ...

    Achso, da ist ja noch ein Quadrat. Hab's jetzt verstanden, danke!
    🙂


Anmelden zum Antworten