Anfänger hat Probleme mit ner Schleife



  • Ich versuche ein Programm zu schreiben, dass wenn ich eine Zahl eingebe. Summiert das Programm mir von 0 bis zur Zahl alle ganzen Zahlen auf.
    Als Beispiel geb ich 5 ein summiert er mir 0+1+2+3+4+5 zusammen und spuckt mir 15 raus.
    Ich habe mir die Sache so vorgestellt.

    #include<stdio.h>
    int main(){
    
    int zahl,i,k;
    i=0;
    k=0;
    
    printf("Geben Sie eine Zahl ein:");
    scanf("%i",&zahl);
    
        while (i=zahl){
               i=i+1;
               k=k+i;
               }
    printf("Ausgabe:%i",k);
    
    }
    

    Während der Schleife soll i von 0 bis zahl immer um +1 erstellt werden und das dann zu k dazuaddiert werden. Leider funktionier die ganze Geschichte nicht und ich hab keine Ahnung warum. Ich hoffe ihr könnt mir einen Stups in die richtige Richtung geben.^^



  • Die Schleifenbedingung ist eine Zuweisung.
    --> ==



  • celer schrieb:

    Die Schleifenbedingung ist eine Zuweisung.
    --> ==

    Wobei es hier wohl eher ein i <= zahl sein sollte, da ja alle Durchläufe addiert werden sollen. bei i==zahl würde die Schleife nur dann einmal durchlaufen werden, wenn man 0 eingibt.



  • Die Entwicklung von = nach == nach <= gefällt mir nicht.
    Ich bin eher für ein i=k=zahl anstatt der kryptischen Zeile.



  • =-->==--><=--> schrieb:

    Die Entwicklung von = nach == nach <= gefällt mir nicht.

    Was ist an einer Entwicklung von Falsch nach Richtig bitteschön ungefällig?

    =-->==--><=--> schrieb:

    Ich bin eher für ein i=k=zahl anstatt der kryptischen Zeile.

    Was hat diese Zeile mit der Funktion des Programmes zu tun? 😕
    Bei Eingabe der Zahl 5 würde i und k ebenfalls den Wert 5 enthalten. Und dann?

    Edit: Ich könnte die Entwicklung noch auf ein "<" erweitern, damit das Endergebnis bei vorhandenem Code passt



  • Ergänze einfach das Zeichen '<':

    #include<stdio.h>
    int main(){
    
    int zahl,i,k;
    i=0;
    k=0;
    
    printf("Geben Sie eine Zahl ein:");
    scanf("%i",&zahl);
    
        while (i<=zahl){
               i=i+1;
               k=k+i;
               }
    printf("Ausgabe:%i",k);
    
    }
    


  • 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!
    🙂


Log in to reply