目標
コンピュータのプログラムは、こういう時はこう、そういう時はそう、と特定の条件が成り立つときには行う処理を切り替える。これを条件分岐と言う。こでは代表的な条件分岐 if 〜 else 文・ switch 〜 case 〜 文について解説を加える。
if 〜 else 文
《Mindstorm NXC のプログラム例》
#define MOVE_TIME 500
#define TURN_TIME 360
task main(){
while(true){
OnFwd(OUT_AC, 75);
Wait(MOVE_TIME);
if (Random() >=0){
OnRev(OUT_C, 75);}
else {
OnRev(OUT_A, 75);}
Wait(TURN_TIME);
}
}
|
定数 MOVE_TIME の値を 500 に定義
定数 TURN_TIME の値を 360 に定義
メインタスクの開始
エラーがなければ繰り返す(無限ループ)
75% の速度で直進
0.5秒走行
乱数を1つ発生して、正の時は
左のモーターを逆転させる
乱数が負の時は
右のモーターを逆転させる
0.36秒回す。Tribot が旋回する。
無限ループの繰り返し範囲の後端
メインタスクの後端
|
Random()が乱数を発生する関数。順に読んでゆくと、
もし( if )、発生した乱数が 0 より大きい( >0 ) か 0 と等しい( =0 )時には、Cポートに接続しているモーターを 75% の力で逆転させる。
そうでないとき( else )にはCポートに接続しているモーターを 75% の力で逆転させる。
という感じになる。
|
if文 の書式は次のようになる。
if ( 条件式 ){
条件式が真の時に実行される処理 ;
}else{
条件式が偽の時に実行される処理 ;
}
|
サンプルとしたプログラムは、最も基本的な if 〜 else の構造だが、else 以下がなくても「条件式が偽の時には何もしない」として if文 は成立する。また、 if 〜 else を重ねる(正確に入れ子構造にする)こともできるが、この場合は次に紹介する switch 〜 case 〜 を用いる方がわかりやすい。
switch 〜 case 〜 文
《Arduino Sketch のプログラム例》
void setup()
{
for ( int i = 6 ; i <=13 ; i++ ){
pinMode( i , OUTPUT);
}
}
void loop()
{
int Number = random(4);
switch ( Number ){
case 0 : Show0() ;
break ;
case 1 : Show1() ;
break ;
case 2 : Show2() ;
break ;
case 3 : Show3() ;
break ;
}
delay(100);
}
void Show0()
{
int LEDCount = 6 ;
int LED_Pin[] = { 6, 7, 8, 10, 11, 12 };
for ( int i = 0 ; i < LEDCount ; i++ ){
digitalWrite( LED_Pin[i], HIGH );
}
delay(1000);
for ( int i = 0 ; i < LEDCount ; i++ ){
digitalWrite( LED_Pin[i], LOW );
}
}
・・・以下 show1(), show2(), show3() を定義する。
|
setup関数の定義
関数の定義開始
i の値を 6 から始めて 13 まで 1 ずつ増やしながら繰り返す
i 番目のピンを「出力」に定義する。
for ループの終端
setup関数の終端
メインループの定義
関数の定義開始
整数型変数 Number を定義し、0 以上 4 未満の乱数を発生してこれに代入する。
Number の値に従って以下の処理を行う。
Number が 0 の場合は、Show0()関数を呼び出す。
switch 文の処理から強制的に抜ける。
Number が 1 の場合は、Show1()関数を呼び出す。
switch 文の処理から強制的に抜ける。
Number が 2 の場合は、Show2()関数を呼び出す。
switch 文の処理から強制的に抜ける。
Number が 3 の場合は、Show3()関数を呼び出す。
switch 文の処理から強制的に抜ける。
switch文の終端
0.1 秒そのままにする。
無限ループの終端
show0()関数を以下のように定義する。
定義範囲の開始
整数型変数 LEDCount を定義し、6 を代入する。
整数型配列 LED_Pin[] を定義し、順に 6, 7, 8, 10, 11, 12 を代入する。
整数型カウンタ変数 i を、0 から始め、1ずつ増やしながら、6 より小さいうちループを回す。
LED_Pin[i] のポートを HIGH にする。(LEDが点灯する)
ループの範囲はここまで。
1秒間そのままにする。
整数型カウンタ変数 i を、0 から始め、1ずつ増やしながら、6 より小さいうちループを回す。
LED_Pin[i] のポートを LOW にする。(LEDが消灯する)
ループの範囲はここまで。
関数 show0() の定義範囲はここまで。
|
Arduino Sketch の場合の乱数 random( n ) は、0 以上 n 未満の整数を発生する。
|
Number のところには整数値が入りさえすればよいので、上の例の場合は 乱数 で分類したが、外部からの入力値や関数による計算値を利用してもよい。
switch 〜 case 〜 文の書式は次のようになる。
switch ( 変数 ){
case n1 :
実行される処理 ;
・・・・・・・
break ;
case n2 :
実行される処理 ;
・・・・・・・
break ;
・・・・・・・
}
|
特に break を書き忘れると次の case行 に入っていくことに注意する。
まとめ
if 〜 else 〜 文は条件分岐の最も基礎となる制御文だが、複雑な処理をきれいに制御するためには switch 〜 case 〜 文の方が使いやすい。いずれにしても十分に使い込むことが大切だ。
|