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



  • huhu leute....ich schreib morgen einen Theoretischen test in Informatik über for schleifen...die aufgabe sieht z.B so aus:

    {
    for (int a=1 ; a<5 ; a++)

    for (int b=0 ; b<4 ; b++)

    wert++;

    return (wert);
    }

    (nein ich habe keine Klammern vergessen die Aufgabe ist von letztes jahr Info Klausur)

    ich hab mal n Kollege gefragt der meinte das:

    ich hoffe mal ich erzähl jetz kein mist ^^ aber ich habs ausprobiert und es kam das erwartete ergebnis raus

    die 1. forschleife wird 4 mal ausgeführt (für a 1,2,3,4)
    die 2. wird für jedes a 4 mal ausgeführt (a=1,b=0 ; a=1,b=1 ; a=1,b=2 ..... a=4,b=3)
    -> 4 * 4 = 16 -> also wird wert 16 mal um 1 erhöht -> 5 (startwert) + 16 = 21

    war das verständlich? ^^

    auf die frage:

    wäre es dann nicht (a=1;b=0; a=2;b=1 etc)

    Meinte er:

    Nein, weil die 1 Schleife die 2 Schleife 4 mal ausführt. Dabei wird jedesmal b um 1 erhöht (bis b=3).
    Dann startet die 1. Schleife ihren 2. Durchgang, a wird um 1 erhöht. jetz wird wieder 4mal die 2. schleife ausgeführt (b=0 bis b=3). Dann startet die 1. Schleife den 3. Durchgang ....
    _______________

    Was könnt ihr mir sagen....

    ? thx im vorraus und sry fals falscher thread



  • dein kollege hats völlig korrekt erklärt.



  • 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


Log in to reply