プログラムをプログラムらしくするもの,それが制御文です。他の命令の実行をコントールすることが制御文の役割です。
制御文には条件分岐と繰り返し,それとNQCの特徴的な制御文として待機を行うステートメント(命令)があります。
5-1.条件分岐
信号が青だったら,進む。赤だったら,止まる。これが条件分岐の身近な例です。
if文
条件式が真の場合(成り立つ場合)に,{ } 内のステートメントを実行します。
if (条件式)
{
ステートメント
}
「青だったら,進む」という条件分岐を表現できます。
条件式が真の場合(成り立つ場合)と偽の場合(成り立たない場合)に,それぞれ違ったステートメントを実行します。
if (条件式)
{
ステートメント
}
else
{
ステートメント
}
「信号が青だったら,進む。それ以外(赤や黄)だったら,止まる。」という条件分岐を実現できます。
5-2.繰り返し
我々,人間の動作にも繰り返しがよく見受けられます。と言いますか,ほとんどの動作は繰り返しで成り立っています。
例えば,ざるそばを食べる場合,1.そばを箸でつまむ,2.口に運ぶ,3.噛む,4.飲み込む。これらの動作を繰り返すことで,ざるそば一人前が胃に収まるわけです。
repeat文
repeat (回数)
{
ステートメント
}
repeat文は指定した回数分,{ }ではさまれたステートメントを繰り返し実行します。
例えば,
repeat (5)
{
1.そばを箸でつまむ
2.口に運ぶ
3.噛む
4.飲み込む
}
と,ざるそばを食べる動作をプログラミングできると仮定すると,ざるそばを食べる動作を5回繰り返し,ざるにそばが,まだ残っていても動作を終了します。
次に回数ではなく,条件を指定してステートメントを繰り返す制御文を紹介します。
while文
while (条件式)
{
ステートメント
}
while文は条件式が成り立つ間,{ }ではさまれたステートメントを繰り返し実行します。
「ざるにそばが残っているうちは,そばを食べる動作を繰り返す」と制御することができるわけです。
do while文
do
{
ステートメント
}
while (条件式)
do while文はwhile文によく似ています。違いは{ }の中のステートメントを実行してから,条件式が成り立っているかどうか評価する点です。while文は先評価,do while文は後評価であるという言い方もされます。また,ざるそばで説明しますと,while文はざるにそばがあることを確認してから食べる動作を開始しますが,do while文はそばがあろうとなかろうと最低1回は食べる動作を行います。
さて,何事にも例外はつきまとうものです。while文やdo while文でざるそばを食べている途中に,つゆがなくなったらどうするか,ざるそばを食べる動作を中断せざるを得ませんね。(麺だけでも食べるという人は別ですが。)そんな時はbreak命令を使います。while文やdo while文から,条件式に指定した条件以外で脱出したい時にはbreak命令で繰り返しのループから脱出します。
次のプログラムはif文とrepeat文を使ってロボットをジグザグに動かします。ロボットは下図の軌跡を描きます。
motor4.nqc
#define MOVE_TIME 30
#define TURN_TIME 10
int houkou;
task main()
{
SetPower(OUT_A+OUT_C,OUT_HALF);
houkou = 0;
repeat(4)
{
OnFwd(OUT_A+OUT_C);
Wait(MOVE_TIME);
if (houkou == 0)
{
Rev(OUT_C);
houkou = 1;
Wait(TURN_TIME);
Fwd(OUT_C);
}
else
{
Rev(OUT_A);
houkou = 0;
Wait(TURN_TIME);
Fwd(OUT_A);
}
Wait(MOVE_TIME);
}
Off(OUT_A+OUT_C);
}
このプログラムでは変数houkouを使っています。NQCの変数はすべて整数型(Integer)で,グローバル変数ですから,タスクの外にInteger の頭3文字を取ってint houkou;と定義します。定数定義では行末にセミコロン(;)は必要ではありませんが,変数定義の場合は必要です。注意してください。
if 文でhoukouの値を判断し,0の場合は出力ポートCに接続したモーターを反転させ,1の場合ポートAのモーターを反転させています。そのたびに,houkouの値を逆(0の時は1,1の時は0)にしています。この動作をrepeat文で繰り返すことによりロボットはジグザグに移動します。
さて,見慣れない記号が出てきましたね。if (houkou == 0)の == です。 houkou = 1;の = は変数houkouに1を右辺の値を代入する代入演算子です。==は左辺と右辺の値が等しいかどうか比較する比較演算子です。等しい場合は真(ture)を,等しくない場合は偽(false)を返します。
よく使う比較演算子を表にまとめておきましょう。
式 | 意味 |
A == B | AがBに等しいか? |
A != B | AがBに等しくないか? |
A < B | AがBより小さいか? |
A <= B | AがB以下か? |
A > B | AがBより大きいか? |
A >= B | AがB以上か? |
5-3.待機
待機を行う制御文はWaitとuntilです。Waitにはティック値で時間を指定して,その時点でのロボットの動きを時間内継続します。
Wait(400);
ティック値は1/100秒です。
untilは待機を時間で行うのではなく,条件式で行います。
until(条件式);
条件式が満たされるまで,次のステップ(コード)に進まず,プログラムの実行がuntilを書いた箇所で止まっています。条件式が満たされて初めて,次のステップの実行に制御が移ります。
untilの使用例は次章「センサー」で紹介します。