Die Technik, neue Methoden zu definieren und for-Schleifen zu definieren - so nützlich sie auch sind -, versetzt Karel nicht in die Lage, neue Probleme zu lösen. Jedes Mal, wenn run ein Programm run geschieht genau das Gleiche. Programme werden viel nützlicher, wenn sie auf verschiedene Eingaben unterschiedlich reagieren können.
Als Beispiel. move , Sie wollten ein Programm schreiben, um Karel move an die Wand zu bekommen. Sie möchten jedoch nicht, dass dieses Programm auf einer Welt mit einer festen Größe ausgeführt wird. Sie möchten ein einzelnes Programm schreiben, das auf jeder Welt funktionieren kann.
Versuchen Sie, die Welt zu verändern, indem Sie auf das Dropdown-Menü "Change World" über der Welt klicken. Für jede move wird Karel move bis es an eine Wand stößt. Beachten Sie, dass dieses Kunststück mit a nicht beendet werden kann for Schleife. Dazu müssten wir die Größe der Welt zum Zeitpunkt der Programmierung kennen.
In Karel, a while loop wird verwendet, um einen Code zu wiederholenso lange wieeine gegebene Bedingung gilt. Die while-Schleife hat die folgende allgemeine Form:
while( Prüfung ){
zu wiederholende Aussagen
}
Der Steuerungsablauf einer while-Schleife ist wie folgt. Wenn das Programm eine while-Schleife erreicht, beginnt es, einen Prozess dort zu wiederholen, wo er zuerst ausgeführt wurdeprüftwenn der Test erfolgreich ist und wenn jarun sder Code im Körper.
Wenn das ProgrammprüftBesteht der Test, entscheidet er, ob derPrüfungtrifft für den gegenwärtigen Zustand der Welt zu. Wenn ja, wird die Schleife den Code im Körper run . Wenn der Test fehlschlägt, ist die Schleife beendet und das Programm move .Wenn das Programmrun sIm Hauptteil der Schleife führt das Programm die Zeilen im Hauptteil nacheinander aus. Wenn das Programm am Ende der while-Schleife ankommt, springt es an den Anfang der Schleife zurück. Anschließend wird der Test erneut überprüft und die Schleife fortgesetzt, wenn der Test erfolgreich war. Das Programm verlässt die Schleife erst, wenn es zu einer Überprüfung kommt und der Test fehlschlägt.
Karel hat vielePrüfungAussagen, und wir werden sie alle im nächsten Kapitel besprechen. Im Moment werden wir eine einzelne Testanweisung verwenden: frontIsClear() Das ist wahr, wenn es keine Mauer direkt vor Karel gibt.
Lassen Sie uns unser Programm oben modifizieren, um es interessanter zu machen. Anstatt nur an eine Wand zu gehen, muss Karel eine Linie von beeper s auf jedes Quadrat setzen. Wir möchten, dass dieses Programm für eine Welt jeder Größe funktioniert:
Das sieht gut aus. Bis auf ein Problem. Auf jeder Welt platziert Karel keine beeper auf dem letzten Feld der Linie (genau hinschauen). Wenn sich Karel auf dem letzten Feld befindet, führt das Programm den Körper der Schleife nicht aus, da der Test nicht mehr besteht - Karel steht vor einer Wand. Sie könnten versucht sein, die Reihenfolge des Körpers so zu move , dass Karel move bevor Sie eine Biene platzieren. Der Code kann bearbeitet werden. Probieren Sie es aus!
Es gibt ein tieferes Problem, das keine Umlagerung des Körpers lösen kann. Für die Welt mit 7 Spalten muss Karel 7 beeper s setzen, sollte aber nur move 6 mal. Da die while-Schleife beim Bestehen eines Tests beide Zeilen ausführt, wie können Sie das Programm veranlassen, einen Befehl mehr als den anderen auszuführen?
Der Fehler in diesem Programm ist ein Beispiel für ein Programmierproblem namens a Zaunpfostenfehler . Der Name kommt von der Tatsache, dass, wenn Sie einen Zaun aus Paneelen mit einem Zaunpfosten in beiden Größen bauen möchten, die Anzahl der Zaunpfosten immer um eins größer ist als die Anzahl der Scheiben. Wie viele Zaunpfosten benötigen Sie zum Beispiel, um einen Zaun mit 10 Paneelen zu bauen? Die Antwort ist 11, wie das folgende Diagramm zeigt:
Sobald Sie es entdeckt haben, ist es recht einfach, diesen Fehler zu beheben. Bevor Karel am Ende der Welt anhält, muss das Programm nur noch ein endgültiges beeper :