Endlosschleifen
Wenn die Bedingung einer while-Schleife nie falsch wird, endet die Schleife nie. Das nennt man Endlosschleife, und sie gehört zu den häufigsten Fehlern bei Schleifen. Hier fehlt die Zeile zahl++:
int zahl = 1;
while (zahl <= 5) {
std::cout << zahl << std::endl;
}zahl bleibt 1, die Bedingung zahl <= 5 ist immer wahr, und das Programm gibt immer wieder 1 aus:
1
1
1
1
...Auf deinem eigenen Computer würde so ein Programm laufen, bis du es beendest. In diesen Übungen wird es nach 5 Sekunden angehalten, und du siehst die Meldung Das Programm lief zu lange und wurde angehalten. Enthält es eine Schleife, die nie endet? Wenn du sie siehst, prüfe jede Schleife: Verändert etwas in ihrem Block die Variable in der Bedingung, sodass die Bedingung irgendwann falsch wird?
Typische Ursachen:
- Nichts verändert die Variable, wie im Beispiel oben.
- Die Variable ändert sich in die falsche Richtung. Ein Countdown
while (zahl >= 1)mitzahl++stattzahl--machtzahlimmer größer, und die Bedingung bleibt wahr. - Die Änderung steht außerhalb des Blocks. Nur der Code zwischen den geschweiften Klammern wird wiederholt. Steht
zahl++unter der schließenden Klammer}, wird es erst nach der Schleife ausgeführt, und die kommt nie. Dasselbe passiert, wenn du die Klammern weglässt: Dann gehört nur die erste Anweisung nach der Bedingung zur Schleife. Deshalb solltest du sie immer schreiben, auch wenn der Block nur eine Zeile hat. - Die Bedingung verfehlt ihr Ziel. Eine Bedingung mit
!=(ungleich) ist für jede Zahl wahr außer für eine. Springt die Variable über diese eine Zahl hinweg, läuft die Schleife ewig weiter. Deshalb verwenden Zählschleifen meistens<,<=,>oder>=: Sie halten auch dann an, wenn die Variable über die Grenze hinausspringt.
So schreibst du es:
Anweisungen
- 1
Das Programm im Editor soll die ungeraden Zahlen von 1 bis 9 und dann
Fertigausgeben. Führe es aus: Die Zahlen werden immer größer, und nach 5 Sekunden wird das Programm angehalten. Finde heraus, warum die Bedingung nie falsch wird, und behebe den Fehler, sodass das Programm1,3,5,7,9undFertigausgibt, jedes in einer eigenen Zeile.