条件分岐

トップC言語との相違点その前に定数と変数くりかえし>条件分岐

 目標

 コンピュータのプログラムは、こういう時はこう、そういう時はそう、と特定の条件が成り立つときには行う処理を切り替える。これを条件分岐と言う。こでは代表的な条件分岐 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 〜 文の方が使いやすい。いずれにしても十分に使い込むことが大切だ。

トップC言語との相違点その前に定数と変数くりかえし>条件分岐

 リンク集

  1. Arduino Wiki
  2.  Arduinoに関する情報源。「武蔵野電波」というチームの手による。Sketchの日本語リファレンス(言語マニュアル)やチュートリアル(入門テキスト)などのコンテンツを持つ。地味だが資料価値は高い。

  3. Sige-Lab
  4.  上杉個人の仕事まとめサイト。Daniele Benedettelliによる NXC のチュートリアル Programming LEGO NXT Robots using NXC (英文)を翻訳して加筆したテキストを公開している。翻訳は完了していないが、センサーの利用までなら困ることはない。