もっと詳しく知る

第6章ループ中


新しいメソッドを定義し、forループを定義するというテクニックは、実際のところ有用ですが、実際にはKarelが新しい問題を解決することはできません。あなたがプログラムを実行するrun 、常に同じことが行われます。プログラムは、異なる入力に対して異なる応答をすることができる場合には、はるかに便利になります。

例として。あなたが壁にKarel moveを持っているためにプログラムを書きたかったとしましょう。しかし、あなたはこのプログラムが単に一つの世界で固定サイズで動くことを望まないのです。あなたはどんな世界でも動くことができる単一のプログラムを書きたいと思います。

世界の上にある[ワールドの変更]ドロップダウンをクリックして、ワールドを変更してみてください。それが壁にmoveまで、どんなサイズの世界でも、カレルはmoveするでしょう。この偉業はaを使って完成することはできないことに注意してください。 for ループ。それは私達がプログラミングの時に世界の大きさを知ることを必要とするでしょう。

基本的なWhileループ

カレルでは、 while ループはコード本体を繰り返すために使用されます限り与えられた条件が成り立ちます。 whileループの一般的な形式は次のとおりです。

while( テスト ){
繰り返す文
}

whileループの制御フローは以下の通りです。プログラムがwhileループにぶつかると、最初のプロセスから繰り返し処理を開始します。小切手テストに合格した場合、そして合格した場合run秒本体内のコード

プログラムが小切手テストに合格した場合は、合格かどうかを判断します。テスト世界の現在の状態に当てはまります。もしそうなら、ループはrunのコードをrunします。テストが失敗すると、ループは終了し、プログラムmoveがオンになります。

プログラムがrun秒ループの本体では、プログラムは本体の行を1つずつ実行します。プログラムがwhileループの最後に到達すると、ループの先頭に戻ります。テストを再チェックし、合格した場合はループを続けます。プログラムは、チェックが行われるまでループを終了せず、テストは失敗します。

カレルにはたくさんありますテスト次の章でそれらすべてについて説明します。今のところ、単一のテストステートメントを使用します。 frontIsClear() カレルの真向かいに壁がない場合はこれが当てはまります。

フェンスポストバグ

上記のプログラムをもっと面白くなるように修正しましょう。壁に移動するのではなく、カレルにbeeper秒の線を各正方形に1つずつ配置させます。繰り返しになりますが、このプログラムはあらゆる規模の世界で機能します。

それは素晴らしいですね。一つの問題を除いて。どの世界でもKarelはラインの最後のマスにbeeperを配置していません(よく見てください)。カレルが最後の正方形にあるとき、テストはもう合格しないので、プログラムはループの本体を実行しません - カレルは壁に面しています。あなたは、ビールを入れる前にKarel move sになるように体の順番をmoveうとしたくなるかもしれません。コードは編集可能なので、試してみてください。

体の再配置では解決できないという、より深い問題があります。 7列の世界では、Karelは7 beeper秒を置く必要がありますが、 move 6回だけでなければなりません。テストに合格すると、whileループが両方の行を実行するので、プログラムが1つのコマンドを他のコマンドよりも1回実行する方法を教えてください。

このプログラムのバグは、プログラムの問題の一例です。 フェンスポストエラー 。その名前は、どちらのサイズにもフェンスポストが1つあるパネルでできたフェンスを構築したい場合、フェンスポストの数は常にペインネルの数より1つ多いという事実に由来します。たとえば、10個のパネルでフェンスを建てるのに必要なフェンスポストはいくつありますか。次の図に示すように、答えは11です。

それを発見したら、このバグを修正するのは実はとても簡単です。カレルが世界の終わりでやめる前に、プログラムがしなければならないのは、最後のbeeperです。


次の章