geschachtelte schleifen



  • Ich versuche mir gerade C (als erste Programmiersprache) beizubringen.
    Leider hänge ich ab und an.
    Zur Zeit verstehe ich die geschachtelten schleifen nicht.
    Warum geht es hier von 1 bis 110?
    Was macht Zahl++?

    #include <stdio.h>
    
    int main()
    {
       int i, j, Zahl=1;
       for (i = 1; i <= 11; i++)
       {
          for (j = 1; j <= 10; j++)
            printf ("%4i", Zahl++);
          printf ("\n");
       }
       return 0;
    }
    

    Das Beispiel ist aus http://de.wikibooks.org/wiki/C-Programmierung:_Kontrollstrukturen#For-Schleife.



  • as_nul schrieb:

    Warum geht es hier von 1 bis 110?

    weil 11*10 = 110 😉

    Was macht Zahl++?

    zuerst wird der printf function der wert von zahl übergeben und anschließend um eins erhöht das ist das gleiche wie

    printf("%d",Zahl);
    Zahl=Zahl+1;
    nur eben kürzer
    printf("%d",Zahl++);
    

    lg lolo



  • sry

    printf("%d",Zahl);
    Zahl=Zahl+1;
    

    nur eben kürzer

    printf("%d",Zahl++);
    


  • Zahl++ erhöht Zahl um 1. Also eine Abkürzung für Zahl = Zahl + 1.
    Die äußere Schleife wird 11 mal ausgeführt.

    for (i = 1; i<=11; i++){
        ...
    }
    

    Die innere Schleife wird 10 mal ausgeführt.
    Da das printf("%4i", Zahl++) in der inneren und äußeren Schleife liegt wird es 10 * 11 mal ausgeführt.
    Das printf ("\n") wird nur 11 mal ausgeführt weil es nur in der äußeren Schleife liegt.

    Mit einer ordentlichen Einrückung und ein paar Kommentaren sieht man das auch leichter.

    #include <stdio.h>
    
    int main(){
        int i, j, Zahl=1; //i ist die Zeile, j ist die Zahlennummer in jeder Zeile
        for (i = 1; i <= 11; i++){ //wir gehen durch die Zeilen und machen in jeder Zeile folgendes;
            for (j = 1; j <= 10; j++) printf ("%4i", Zahl++); //wir geben 10 mal Zahl aus und erhöhen Zahl um 1
            printf ("\n"); //nach der Zeile kommt ein newline Zeichen, quasi ein Enter
        }
        return 0;
    }
    


  • nwp2 schrieb:

    Mit einer ordentlichen Einrückung und ein paar Kommentaren sieht man das auch leichter.

    damit meinst aber nicht den blocksatz von dir oder? 😃



  • noobLolo schrieb:

    nwp2 schrieb:

    Mit einer ordentlichen Einrückung und ein paar Kommentaren sieht man das auch leichter.

    damit meinst aber nicht den blocksatz von dir oder?

    die {'s in der gleichen zeile wie der beginn der anweisung kann er auch nicht meinen *fg*
    🙂



  • Ich wollte erst noch schreiben dass die Meinungen über ordentlichen Stil auseinandergehen. Hätte ich mal machen sollen. Jedenfalls, Anweisungen die in derselben "Schleifentiefe" stehen sollten gleich eingerückt sein. Was mit Blocksatz gemeint ist weiß ich nicht.
    Übrigens kann man sowas auch vom Rechner machen lassen, AStyle kann sowas, Code::Blocks hat es als Plugin drin.



  • nwp2 schrieb:

    Was mit Blocksatz gemeint ist weiß ich nicht.

    ich hab nix gegen deinen stil nur gegen diese mit kommentaren zu gestopften zeilen die sich lesen wie buch seiten.
    um es dir mal ohne farbe zu zeigen hab ichs mal in [code] gepackt stell dir vor ich hätt keine...

    blocksatz

    #include <stdio.h>
    
    int main(){
        int i, j, Zahl=1; //i ist die Zeile, j ist die Zahlennummer in jeder Zeile
        for (i = 1; i <= 11; i++){ //wir gehen durch die Zeilen und machen in jeder 
            for (j = 1; j <= 10; j++) printf ("%4i", Zahl++); //wir geben 10 mal 
            printf ("\n"); //nach der Zeile kommt ein newline Zeichen, quasi ein Enter
        }
        return 0;
    }
    

    kein blocksatz

    #include <stdio.h>
    
    int main(){
        int i, j, Zahl=1;
        for (i = 1; i <= 11; i++){
            for (j = 1; j <= 10; j++) printf ("%4i", Zahl++);
            printf ("\n");
        }
        return 0;
    }
    

    🙂



  • nwp2 schrieb:

    Ich wollte erst noch schreiben dass die Meinungen über ordentlichen Stil auseinandergehen. Hätte ich mal machen sollen. Jedenfalls, Anweisungen die in derselben "Schleifentiefe" stehen sollten gleich eingerückt sein. Was mit Blocksatz gemeint ist weiß ich nicht.
    Übrigens kann man sowas auch vom Rechner machen lassen, AStyle kann sowas, Code::Blocks hat es als Plugin drin.

    Du tust immer so, als wärst du der Größte, aber vielleicht solltest du mehr Energie dafür aufwenden es zu sein? Das gelingt dir nämlich in keinster Weise!

    Die Einrückung vom OP ist absolut in Ordnung und lesbar. Solltest du das nicht so sehen, dann hast du einfach noch weniger Ahnung, als ohnehin schon bekannt. Der Einzig schlecht eingerückte Code ist deiner!



  • btw. glaubst du das jemand der nicht weiß dass

    printf ("\n");
    

    ne neue zeile ausgibt den code dadurch versteht?

    //nach der Zeile kommt ein newline Zeichen, quasi ein Enter
    

    😉



  • Ja, wenn jemand C als erste Sprache lernt und Beispiele aus Wikipedia kopiert und versucht ihn zu verstehen und fragt wie eine for-Schleife funktioniert, dann denke ich dass die Möglichkeit besteht, dass man mit printf("\n") nichts anfangen kann. Ein "Enter" ist etwas, was auch meine Oma versteht, weil es auf der Tastatur steht. Und wenn nicht fragt man halt nochmal nach.
    Aber es war natürlich ins Blaue geraten, vielleicht weiß er das ja schon, vielleicht ist er nichtmal ein er, war auch nur geraten. Wenn die Zeile umsonst war schadet sie nichts, wenn sie hilft hilft sie viel, dachte ich jedenfalls in meinem Leichtsinn.

    Aber gut, ich bin auch lernfähig, vielleicht sollte ich den Code nicht mit Kommentaren pflastern und stattdessen neue Zeilen nehmen oder so, war mir bisher nicht bewusst dass jemand damit ein Problem hat.

    Wenn ihr mich alle so schrecklich findet gehe ich auch wieder, will mich ja nicht übermäßig aufdrängen.



  • nwp2 schrieb:

    Wenn ihr mich alle so schrecklich findet gehe ich auch wieder, will mich ja nicht übermäßig aufdrängen.

    Ich habe nichts gegen dich, aber deine Art Dinge auszudrücken kommt zumindest bei mir meistens nicht sonderlich gut an.



  • nwp2 schrieb:

    Wenn die Zeile umsonst war schadet sie nichts

    falsch, denn es macht den text unleserlich und kostet dich zeit...

    nwp2 schrieb:

    Wenn ihr mich alle so schrecklich findet gehe ich auch wieder, will mich ja nicht übermäßig aufdrängen.

    mach dir nicht die action mit 10.000 kommentaren wenns jemand nicht checkt dann sagt er es dir schon 🙂



  • Was ein newline ist und dass Zahl++ eines dazu bedeutet ist mir schon klar.

    Aber warum wurde das mit Zahl++ gelöst.
    Ich verstehe die Logik hinter dem Code-Beispiel eben nicht.
    Was wird hier wie Mal gerechnet?

    #include <stdio.h>
    
    int main()
    {
       int i, j, k;
       for (i = 1; i <= 11; i++) {    
          {
          for (j = 1; j <= 10; j++)  
            {
            printf ("%4i", i * j);
            }
          }
       printf ("\n");
       }
       return 0;
    }
    

    So verstehe ich es schon etwas besser. (Die Klammern sind für das bessere Verständnis für mich)

    for (i = 1; i <= 11; i++)
    

    Bedeutet doch, gebe i 1, zähle bis 11 und zähle eins zu i hinzu solange i unter oder gleich 11 ist.
    Was macht der Computer dann intern?
    Schreibt er 1, 2, 3, 4, 5, 6, 7, 8, 9, 10?

    Die innere schleife macht dann was?

    for (j = 1; j <= 10; j++)
    

    Definiere j mit 1, zähle bis unter 10 und addiere jeweils eins zu j.

    printf ("%4i", i * j);
    

    Drucke i * j ...

    Rechnet der dann so:

    1 (1 * 1) (2 * 1)
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11 (1 * 11) (...) (10 * 11)
    Innere schleife * äußerer schleife

    Tut mir leid wenn das eigentlich logisch wäre, ich verstehe es nur nicht.



  • #include <stdio.h>
    
    int main()
    {
      int i, j, k;
      for (i = 1; i <= 11; i++)
        {
          for (j = 1; j <= 10; j++)  
            {
              printf ("%4i", i * j);
            }
          printf ("\n");
        }
      return 0;
    }
    

    denke jetzt haben wir bald alle stile durch

    for(i = 1; i <= 11; i++)
    
    1.             setze i = 1 
    2. wenn ja .-  teste ob i kleiner gleich 11 <----. wenn nein -.
    3.         '-> führe den schleifen körper aus    |            |
    4.             erhöhe i um eins                  |            |
    5.             gehe zu schritt 2 ----------------'            |
    6.             loop ende <------------------------------------'
    

    hoffe das ist jetzt nicht zu verwirrend


Anmelden zum Antworten