problem mit For schleife....welcher wert wird übergeben?!



  • Wenn ich mich nicht verlesen habe, hat dein Kumpel Recht 😉
    Wenn du verschachtelte Schleifen hast, werden die Inneren immer wieder von vorn ausgeführt.
    Ist ja auch logisch:

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

    Alles, was in dem Block ist, wird 10 mal ausgeführt. Hat man darin eine innere Schleife, z.B. for ( int j=0; j<2; j++ ) , dann wird diese Schleife auch 10 mal ausgeführt, der Block von der j-Schleife also 20 mal.

    Das hat was mit dem "Scope" einer Variable zu tun:

    for ( int i=0; i<10; i++ )
    {
        // Am Anfang der for-Schleife wird die Variable "j" erschaffen und mit 0 initialisiert.
        for ( int j=0; j<2; j++ )
        {
        }
        // Wenn die Schleife vorbei ist, ist die Variable "j" futsch und nicht mehr anwendbar - nicht mehr sichtbar.
    }
    

    edit: grml grml grml!



  • Dein Kollege hat Recht. Überlege Dir selber, wie Du die geschweiften Klammern '{}' setzen müsstest, ohne die Funktion des Programms zu verändern. Dann wird's klarer.

    Gruß
    Werner



  • dann liegts an mir weil ich es nicht kapier 😞



  • Badestrand: Was hat denn der Codefluss mit den Scopes der Schleifenvariablen zu tun?



  • Michael E. schrieb:

    Badestrand: Was hat denn der Codefluss mit den Scopes der Schleifenvariablen zu tun?

    Er fragte seinen Kollegen doch, warum es nicht so a=1; b=0; a=2; b=1 etc wäre, aber das würde ja bedeuten, dass die innere Schleifenvariable fortlaufend hochgezählt würde, ohne nach jedem äußeren Schleifendurchgang wieder "zurückgesetzt" zu werden. Und sie wird ja immer "zurückgesetzt" 🙂



  • Nö, das würd bedeuten, dass es nur eine semantische Schleife geben würde.



  • Ich hätt nicht gewusst das über so eine Noob thema (für euch bestimmt ich mein...ich mach grad 11. Klasse...ihr habt bestimmt andere Codes bzw andere sachen wo ihr hängen bleibt als so ne for schleife^^ oder 😃

    auf jedenfall danke....

    hier noch n comment von meinem Kollegen:

    Vll wird es dir klarer wenn du denn Code so schreibst (in diesem Fall verhält sich der Code genauso)

    int Berechne (int wert) 
    
    {
      for (int a=1 ; a<5 ; a++) {
        for (int b=0 ; b<4 ; b++) {
          wert++;
        }
      }
      return (wert);
    }
    

    alles was bei den schleifen in {} steht, wird bei jedem durchgang ausgeführt. D.h. dass die erste Schleife bei jedem Durchgang die 2 Schleife aufruft, welche 4 mal Wert um 1 erhöht.

    Ach damn ich dachte ich habs aber dann hab ich mich doch vertan:

    da das ergebnis ja 21 zu schein sein hab ich so gedacht:

    5+1=6 } Erster Durchlauf
    6+1=7
    7+1=8
    8+1=9

    9+1=10 } zweiter Durchlauf
    10+1=11
    11+1=12
    12+1=13

    13+1=14 } dritter Durchlauf
    14+1=15
    15+1=16
    16+1=17

    17+1=18 } Vierter Durchlauf
    18+1=19
    19+1=20
    20+1=21
    ach lol... xD
    Okay da ist mein erstes Aha erlebnis....schön das ich das nun shconmal verstanden hab



  • Ich verstehe dass nicht, weil da steht doch n "return", wird die ganze Sache dann nicht einfach beendet?

    MfG
    Stromberg



  • Hm...stimtm müsste dan icht cout<<wert<<endl; stehen z.B



  • Stromberg schrieb:

    Ich verstehe dass nicht, weil da steht doch n "return", wird die ganze Sache dann nicht einfach beendet?

    Steht doch außerhalb der Schleifen :p

    Michael E. schrieb:

    Nö, das würd bedeuten, dass es nur eine semantische Schleife geben würde.

    Hum? Kannst du mir das mal erklären?



  • ProtoX schrieb:

    da das ergebnis ja 21 zu schein sein hab ich so gedacht:

    5+1=6 } Erster Durchlauf
    6+1=7
    7+1=8
    8+9=10

    8 + 9 = 10?

    10+1=11 } zweiter Durchlauf
    11+1=12
    12+1=13
    13+1=14

    15+1=16 } Dritter durchlauf

    Auszeit. Wo ist 14 + 1 = 15 geblieben?

    aber naja....wohl doch nicht -.-

    Doch.



  • ach damn!!!

    Scheiss müdigkeit sry!!!

    Mom^^ ich korrigiere es mal und schaus mir nochmal an!! XD
    thx



  • Badestrand schrieb:

    Hum? Kannst du mir das mal erklären?

    So wie ich das sehe, hat er gemeint, dass sich die beiden Schleifen so wie eine einzige verhalten. Also
    [cpp]for(int a = 0, b = 0; a != 4 && b != 4; ++a, ++b);[cpp]



  • lol jo...thx...habs korrigiert... 🙂

    5+1=6 } Erster Durchlauf
    6+1=7
    7+1=8
    8+1=9

    9+1=10 } zweiter Durchlauf
    10+1=11
    11+1=12
    12+1=13

    13+1=14 } dritter Durchlauf
    14+1=15
    15+1=16
    16+1=17

    17+1=18 } Vierter Durchlauf
    18+1=19
    19+1=20
    20+1=21

    jetzt weiss ich schonmal wie das mit dem Zählen gemeint ist....

    das was ich da jetzt aufgeschrieben hab sind 4 Durchläufe also "a" da a<5=4
    aber wo ist "b"?



  • Erster Durchlauf a=1:
    5+1=6 // b=0
    6+1=7 // b=1
    7+1=8 // b=2
    8+1=9 // b=3

    zweiter Durchlauf a=2:
    9+1=10 // b=0
    10+1=11 // b=1
    11+1=12 // b=2
    12+1=13 // b=3

    dritter Durchlauf a=3:
    13+1=14 // b=0
    14+1=15 // b=1
    15+1=16 // b=2
    16+1=17 // b=3

    Vierter Durchlauf a=4:
    17+1=18 // b=0
    18+1=19 // b=1
    19+1=20 // b=2
    20+1=21 // b=3

    Da oben is dein b 🙂



  • http://img3.imagebanana.com/img/cdvczb6/thumb/lol....jpg

    Ehm...wenn ich das in c++ eingebe komm ich nur auf 20^^



  • wenn der wert 6 wär würd er mir 21 ausspucken oh man ich bin sowas von geliefert nachher xD dazu komm noch das ich erklären muss wie man zu einem fertigen programm kommt und wie ein programm aufgebaut ist -.-
    thx 4 help...



  • ProtoX schrieb:

    http://img3.imagebanana.com/img/cdvczb6/thumb/lol....jpg

    Ehm...wenn ich das in c++ eingebe komm ich nur auf 20^^

    verwende in dem fall besser

    cout << ++wert << endl;
    

    und mach dir klar, warum 😉



  • ja aber das wär ja dann die veränderung der aufgaben stellung 😉 von meinem Lehrer



  • die hast du ja selbst schon geändert

    der wert von wert ist am ende der schleife korrekt bei 21, du gibst mit dem cout jedoch stets den wert vor der erhöhung aus. also erscheint erst die 20, dann wird erhöht. wert hat dann 21, aber das gibst du nichtmehr aus.
    dreht man den operator also um (++wert), dann wird erst erhöht, dann ausgegeben.

    das cout sollte also, wenn überhaupt, NACH der schleife einmal ausgeführt werden, nicht jedesmal erneut.


Anmelden zum Antworten