Schleifen

Schleifen - Iteration. Was zum Geier geht denn hier ab?

Klingt verrückt, ist es aber nicht. Schleifen sind dafür da, wenn wir etwas ziemlich oft machen wollen. zB wenn wir eine Zahl potenzieren wollen, dann müssen wir ziemlich oft multiplizieren...

  #include<iostream>
  using namespace std;

  int main()
  {
    int a;
    int b;
    int erg=1;
    cout<<"Geben sie eine Zahl ein: ";
    cin>>a;
    cout<<"Und jetzt eine andere: ";
    cin>>b;

    for(int i=0;i<b;i=i+1)
    {
      erg=erg*a;
    }

    cout<<a<<" hoch "<<b<<" ist "<<erg<<"\n";
    cin.get();
  }
Merksatz!!Ein C++ Programmierer zählt nicht von 1-10 sondern von 0 bis 9. Gewöhne dich daran, denn ein C++ Programmierer der nicht bei 0 zu zählen beginnt, der hat ein Problem.

Wir sehen hier etwas neues: for. for besteht aus 3 Teilen: for(a;b;c)

a -> hier stehen Initialisierungen. Meistens eine Laufvariable die mitzählt wie oft die Schleife schon durchgelaufen ist.

b -> hier steht die Bedingung die erfüllt werden muss, damit die Schleife weiterläuft, diese Bedingung ist dieselbe wie bei einem if()

c -> hier steht ein Statement das bei jedem Schleifendurchlauf ausgeführt wird. Meistens wird die Laufvariable erhöht.

Tip!!Meistens verwendet man i als Laufvariable. Wenn man mehrere braucht verwendet man i,j,k. Durch diese Namenskonvention erkennt man recht schnell was diese Variable macht.

Hier haben wir wieder einen Anweisungsblock. Solange die Bedingung true ist, wird alles ausgeführt was im dazugehörigen Anweisungsblock steht.

Neben for() gibt es auch noch while() und do {}while(). Die Schleifen sind etwas anders.

Bei while() gibt es kein a und c, sondern nur b. Bei do {} while() ist es exakt wie bei while(), nur dass die Bedingung immer erst NACH dem Schleifendurchlauf geprüft wird (dh die Schleife läuft mindestens einmal durch)

  #include<iostream>
  using namespace std;

  int main()
  {
    int a;
    int b;
    int erg=1;
    cout<<"Geben sie eine Zahl ein: ";
    cin>>a;
    cout<<"Und jetzt eine andere: ";
    cin>>b;

    int i=0;
    while(i<b)
    {
      i=i+1;
      erg=erg*a;
    }

    cout<<a<<" hoch "<<b<<" ist "<<erg<<"\n";
    cin.get();
  }
Tip!!Statt i=i+1; kann man auch i+=1; oder ++i; schreiben. ++ bedeutet um 1 erhöhen.

Normalerweise verwendet man for() immer dann, wenn man eine 'Zählschleife' haben will, dh, wenn man die Schleife exakt x-mal durchlaufen lassen will.

Es gibt zwei wichtige Schlüsselwörter bei Schleifen: break und continue

break bricht die Schleife einfach ab.

  #include <iostream>
  using namespace std;

  int main()
  {
    for(int i=0;i<10;++i)
    {
      cout<<"bla\n";
    }
    //ist aequivalent zu
    for(;;) //ja, man muss nich ueberall was hinschreiben
        //wenn der mittelteil (die bedingung) leer bleibt
        //dann laeuft die schleife ewig
    {
      cout<<"bla\n";
      ++i;
      if(i>=10) break;
    }
  }

In diesem Beispiel ist die untere Schleife einfach nur hässlich und kaum zu lesen. Selten kommt es vor, dass es auf diese Art besser geht als mit Variante 1. Also im Zweifelsfall immer Variante 1 nehmen!! Der Hauptgrund für break ist so etwas:

  #include <iostream>
  using namespace std;

  int main()
  {
    for(int i=0;i<10;++i)
    {
      mach_was_wichtiges;
      if(mach_was_wichtiges_hat_nicht_funktioniert)
      {
        break;
      }
    }
  }

continue ist das gegenteil zu break. Denn bei continue wird zwar der aktuelle Schleifendurchlauf abgebrochen, aber nicht die Schleife verlassen, sondern es wird nur der Rest der Durchlaufs übersprungen.

  #include <iostream>
  using namespace std;

  int main()
  {
    for(int i=0;i<10;++i)
    {
      if(etwas_ist_passiert)
        continue;

      tu_was_wichtiges;
    }
  }

Ähnlich zu break und continue ist goto. Mittels goto kann man zu bestimmten Stellen springen. Diese Stellen werden durch ein Label (Sprungmarke) markiert:

    #include <iostream>
    using namespace std;

    int main()
    {
      int i=0;

      Schleife: //dies ist ein Label
      if(i<10)
      {
        cout<<i<<'\n';
        goto Schleife;
      }
    }
    

Mittels goto Schleife; springen wir zum Label Schleife:. Diese Konstruktion wird öfters 'if Schleife' genannt - allerdings ist dieser Ausdruck falsch. Es müsste 'goto Schleife' heißen. Allerdings ist goto sehr verpöhnt - denn mit goto kann man recht einfach schwer leserliche Programme schreiben. Oft gibt es bessere Lösungen als goto - allerdings nicht immer. Dennoch sollte man sehr gut überlegen ob goto wirklich nötig ist.

Schleifen können auch verschachtelt werden:

    #include <iostream>
    using namespace std;

    int main()
    {
      for(int i=3; i<30; ++i)
      {
        bool isprim=true;
        for(int j=2; j<i; ++j)
        {
          if(i%j == 0) { isprim=false; break; }
        }
        if(isprim) cout<<i<<" ist eine Primzahl\n";
      }
    }
    

Hier werden alle Primzahlen unter 30 berechnet. Eine Primzahl definiert sich dadurch, dass sie nur durch sich selbst und 1 Teilbar ist. Wir brauchen daher 2 Schleifen: eine, in der alle Zahlen bis 30 durchgegangen werden und die Innere um die Zahlen zu testen.

Schreibe jetzt 3 Schleifen (for, while, do while). Jede Schleife soll 10mal durchlaufen und die Zahlen 1 bis 10 ausgeben!

Hier ist die Lösung

top