Schleife - flutter-tutorial-de/dart-basics-tutorial GitHub Wiki

Table of Contents

Ausführungsumgebung

Am einfachsten kannst du die Beispiele in https://dartpad.dev ausführen:

Programm im Tutorial markieren und kopieren (Strg-C), im DartPad einfügen (Strg-V) und auf Run klicken.

Aufgabe

Berechne die Summe der ganzen Zahlen von 1 bis 10.

Der erste Ansatz:

void main() {
  print(1+2+3+4+5+6+7+8+9+10);
}
Das funktioniert prinzipiell, ist aber sehr langweilig, hier alle Zahlen bis 10 aufzuzählen und wird zur Herkulesaufgabe, wenn die Zahlen von 1 bis 1000 addiert werden sollen.

Das geht mit einer sogenannten Zählschleife viel eleganter:

Die gezählte Schleife (for-Schleife)

Syntax

for ( inititialisierung ; bedingung ; fortschaltung ) schleifen-block

  • Die Initialisierung wird genau einmal ausgeführt.
  • Dann wird die Bedingung geprüft
  • Trifft die Bedingung zu, wird der Schleifenblock abgearbeitet und die Bedingung wird erneut geprüft.
  • Trifft die Bedingung nicht zu, wird der Schleifenblock nicht ausgeführt, die nächste Anweisung nach dem Schleifenblock wird abgearbeitet.

Musterlösung

void main() {
  var sum = 0;
  for (var count=1; count <= 10; count++){
    sum += count;
  }
  print("Summe: $sum");
}

Einschub: Hier kommt ein Vergleich von Werten vor: count <= 10. Das '<=' bedeutet kleiner oder gleich. Ausführlich behandelt in Formel.

  • var sum = 0: Die Summe bekommt den Wert 0.
  • Abarbeitung der for-Schleife:
    • Es wird die Initialisierung einmalig ausgeführt: var count=1;
    • Dann wird die Bedingung geprüft: count hat den Wert 1, die Bedingung count <= 10 ist also erfüllt.
    • Daher wird der Schleifenkörper ausgeführt: sum erhöht sich um count: sum += count
    • Anschließend wird die Fortschaltung erledigt: count wird um 1 erhöht: count++
    • Prüfung der Bedingung: count hat den Wert 2, die Bedingung count <= 10 ist also erfüllt.
    • Wieder Ausführung des Schleifenrumpfes und der Fortschaltung
    • und so weiter, bis count in der Fortschaltung den Wert 11 erreicht:
    • Jetzt ist die Bedingung nicht mehr erfüllt, die Schleife wird abgebrochen.
    • Es wird die Anweisung nach dem Schleifenkörper ausgeführt.
Wir schauen uns das noch einmal genauer an:
void main() {
  var sum = 0;
  for (var count=1; count <= 10; count++){
    print("vorher: sum: $sum count: $count");
    sum += count;
    print("nachher: sum: $sum");
  }
  print("Summe: $sum");
}
  • Man sieht, wie sich der Wert von count in jedem Schleifendurchlauf um 1 erhöht (wegen der Fortschaltung), und die Summe um diesen erhöhten Wert (wegen des Schleifenrumpfes).
Und hier nochmal mit geänderter Bedingung, damit die ersten 100 ganzen positiven Zahlen summiert werden:
void main() {
  var sum = 0;
  for (var count=1; count <= 100; count++){
    sum += count;
  }
  print("Summe: $sum");
}

Die abweisende Schleife (while-Schleife)

Syntax

while ( bedingung ) schleifen-block

  • Die Bedingung wird geprüft.
  • Ist die Bedingung erfüllt, wird der Schleifenblock ausgeführt
  • Die Bedingung wird geprüft.
  • Ist die Bedingung erfüllt, wird der Schleifenblock ausgeführt
  • und so weiter
  • Ist die Bedingung nicht erfüllt, endet die Schleife, die Anweisung nach dem Schleifenblock wird ausgeführt.

Aufgabe

Bestimme, wie viel der ersten positiven Zahlen summiert werden müssen, damit die Summe kleiner 100 ist.

Musterlösung

void main() {
  var sum = 0;
  var count = 1;
  while(sum < 100){
    sum += count;
    count++;
  }
  print("Summe: $sum zähler: $count");
}
  • sum bekommt den Wert 0, count den Wert 1.
  • Bedingung ist erfüllt, da sum (mit Wert 0) kleiner als 100
  • Der Rumpf wird ausgeführt, sum bekommt den Wert 1, count den Wert 2
  • Bedingung ist erfüllt, da sum (mit Wert 1) kleiner als 100 ist
  • Wieder Ausführen des Rumpfes, sum bekommt den Wert 3, count den Wert 3
  • und so weiter, bis sum den Wert 105 bekommt: dann ist die Bedingung sum < 100 nicht mehr erfüllt, die Schleife bricht ab.
  • Die Anweisung nach der Schleife wird ausgeführt: print("Summe: $sum zähler: $count");

Aufgaben

  • Wie oft muss man einen Wert - beginnend mit 1 - verdoppeln, bis der Wert 1000 übersteigt.
  • Wie viel Jahre braucht man mit einem Zinssatz von 3%, bis das Kapital sich verdoppelt, wenn der Zins jährlich dem Kapital zugeschlagen wird
Tipp: Zinsformel: kapital = (1 + zinssatz/100.0) * kapital

Die nicht abweisende Schleife (do-while-Schleife)

Ziemlich ähnlich zur while-Schleife gibt es die do-while-Schleife: Der Unterschied ist, dass die Prüfung nach dem Schleifenrumpf stattfindet. Der Schleifenrump findet also mindestens einmal statt.

Syntax

do schleifen-block while ( bedingung ) ;

  • Der Schleifenblock wird ausgeführt.
  • Die Bedingung wird geprüft.
  • Ist die Bedingung erfüllt, wird der Schleifenblock ausgeführt
  • Die Bedingung wird geprüft.
  • Ist die Bedingung erfüllt, wird der Schleifenblock ausgeführt
  • und so weiter
  • Ist die Bedingung nicht erfüllt, endet die Schleife: die Anweisung nach der do-while-Schleife wird ausgeführt.

Musterlösung

void main() {
  var sum = 0;
  var count = 1;
  do {
    sum += count;
    count++;
  } while (sum < 100);
  print("Summe: $sum zähler: $count");
}
Es gilt die obige Erklärung der while-Schleife, nur dass die Bedingung erst nach dem Schleifenblocks geprüft wird.

Hinweis: Es gibt noch eine weitere for-Schleife, die mit Containerinhalten funktioniert. Diese wird später besprochen.

Spezielle Anweisungen für Schleifen: break und continue

Innerhalb einer Schleife (genauer: im Anweisungsblock einer Schleife) gibt es zusätzliche Anweisungen:

continue

Wird im Programmablauf die Anweisung continue gefunden, wird sofort zur Prüfung der Bedingung "gesprungen", also alle Anweisungen im Schleifenblock danach werden ignoriert. In der gezählten Schleife wird vorher die Fortschaltung ausgeführt.

Beispiele finden sich in anderen Kapiteln, da mit unserem derzeitigen Wissensstand nichts sinnvolles möglich ist.

break

Wird im Programmablauf die Anweisung break gefunden, wird die Schleife sofort abgebrochen: keine Schleifenprüfung mehr. In der gezählten Schleife wird auch keine Fortschaltung getätigt.

Unser derzeitiger Wissensstand reicht noch nicht für ein sinnvolles Beispiel, folgt später.


Weiter geht es mit Kapitel Bedingte Anweisung (if und switch).

⚠️ **GitHub.com Fallback** ⚠️