9月9日 NQCプログラミングを始めてから、やることが無くなったかずのためにRCXCC(RCXコマンドセンター)から、RCX Joystickを起動し無限軌道車でしばらく遊んでから「NQCのお勉強」を始めた。今日は制御文を勉強する。まずは定番のif文からだ。

task main()
{
 while(true)
 {
  OnFwd(OUT_A+OUT_C);
  Wait(MOVE_TIME);
  if(Random(1) == 0)
  {
   OnRev(OUT_C);
  }
  else
  {
   OnRev(OUT_A);
  }
  Wait(TURN_TIME);
 }
}

上記のプログラムをこうしろうが打ち込んだのだが、当初「OnRev(OUT_A)」の後ろのセミコロンを忘れたのでコンパイル・エラーがでた。「おっ、コンパイルエラーが2つでたね。どこが間違っているかわかるか?」と聞くと、一拍おいてから「あっ、1つはわかった。OnRevのあとのセミコロンぬけとる。でも、もう1つがわからん。」とこうしろう。NQCはC系の言語だから、ソースコードはフリーフォ-マットで記述する。セミコロン1個の入力ミスが2つのエラーを引き起こしていた。「いやいや、そこにセミコロンさえ入れればいいんだよ。区切りがわからないから次のコードまでエラーになっているんだよ。」コンパイル・エラーがなくなったのでダウンロードして無限軌道車を動かしてみた。



 「さて、こうしろう。Randomは前回も使ったけど覚えてるか。Random(1)はどんな値を返すか、わかる?」、「えーと、0か1」、「そう、その通り。で、Randomの返す値が0と等しいかどうかをif (Random(1) = = 0)できいているんだ。0の時はモーターCを反転させて、elseつまりそれ以外の時はモーターAを反転させているんだよ。だからロボットはあっち行ったり、こっち行ったりするわけだ。」、「うん」とこうしろう。
 「比較の式はいろいろあるんだよ。= =は等しいかどうかで、他に<(未満)、<=(以下)、>(より大きい)、>=(以上)、!=(等しくない)と。それと複数の条件で比較する時は&&で条件を並べると『かつ』になる。| |で並べると『あるいは』になるんだ。」こうしろうがこんな顔(-_-;)をしたので、「いま全部覚えなくてもいいんだよ。おいおい出てくるから。」とフォローした。「さて、次のプログラムを入力してごらん。」と言ってdo while文の学習に進んだ。

int move_time, turn_time, total_time;
task main()
{
 total_time = 0;
 do
 {
  move_time = Random(100);
  turn_time = Random(100);
  OnFwd(OUT_A+OUT_C);
  Wait(move_time);
  OnRev(OUT_C);
  Wait(turn_time);
  total_time += move_time; total_time += turn_time;
 }
 while(total_time < 2000);
 Off(OUT_A+OUT_C);
}

「ねぇ、こうちゃん。while文とdo while文の違いちゃわかっけ?」と猫なで声の富山弁で尋ねると、「whileちゃ、( )の中の条件が真の時に{ }の中を実行して、do whileちゃ( )の中の条件が真の時に{ }の中を…」と答える声がだんだん小さくなっていったので、「そりゃ、一緒やないけ」と関西弁で突っ込んだ。「先判断と後判断の違いだよ。つまりこういうこと。」

while(条件式)
 {
  文
 }

は条件式を評価してから、文を実行するわけだ。条件式が最初から真でない場合は{ }の中の文は一回も実行されない。「これが先判断。それに比べてdo whileは後判断なんだよ。」

do
 {
  文
 }
while(条件式)

do whileでは条件を評価する前に、必ず{ }の中の文を1回実行する。実行してから、まだ繰り返し実行する必要があるかどうかを条件式で判断する。「わかったか?」、「わかった!」、「よーし、次回はセンサーを使うぞ。」