制御文法を使う(分岐)条件により流れを変える(Arduino)

スケッチした内容は記述順に、
(プロフラミング記述された順に)
何も制御しない場合は、
上から下へ左から右へと順に実行されます。

しかし、
処理によっては、
条件により処理を変えたい場合があります。

分岐処理
分岐処理

例えば、
テストの点数を判断して、
60点以上なら”合格”、
60点未満なら”不合格と”表示したい。

このような場合、
Serial.println( "合格" );
Serial.println( "不合格" );
と記述(プログラミング)してしまえば。
シリアルモニタには、
合格
不合格
と表示され、
どちらかだけを表示することはできません。

こんな時、この分岐(条件判断)を利用します。
int score = 70;
判断する材料として、この整数型変数scoreに
点数が入っているとします。
判断の基準は、
整数型変数scoreが60以上の時:合格
整数型変数scoreが60未満の時:不合格
とします。
これをアルゴリズム風に書くと、

分岐処理1
分岐処理1

な感じでしょうか。

この分岐には、if( )文を使います。
書式ですが、
if ( 条件式 ) {
 条件式が成り立つとき実行したい文群
}
が基本文法です。
条件式では、2つの値の比較を演算子を使って行います。
条件式で使われる演算子を比較演算子といい、

左辺 比較演算子 右辺成り立つ(true)と判定されるとき 
==左辺右辺が等しい
!=左辺右辺が等しくない
<左辺より右辺が大きい (右辺より左辺が小さい)
>左辺より右辺が小さい (右辺より左辺が大きい) 
<= 右辺が左辺以上 (右辺が左辺以下) 
>=右辺が左辺以下 (右辺が左辺以上) 
比較演算子一覧

などがあります。

条件式が成り立つときを、
真、true、などといい、
条件式が成り立たないときを、
偽、false、などといいます。

条件式が成り立つとき、成り立たないときの
両者を利用するときは、
if ( 条件式 ) {
 条件式が成り立つとき実行したい文群
} else {
 条件式が成り立たないとき実行したい文群
}
と記述します。

if( )文
if( )文

また、この図のような条件判断を行いたい場合は、
if ( 条件式 ) {
 条件式が成り立つとき実行したい文群
} else if ( 条件式 ) {
 条件式が成り立たないとき実行したい文群
} else {
 条件式が成り立たないとき実行したい文群
}
のように、else if( )のような、絞り込み的な記述もできます。

else if( )文
else if( )文

では、実際にプログラムしてみると、

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);   // シリアルポートを初期化(9600 bpsで通信)
   // 変数宣言と初期化
   int score = 70;
   // 変数scoreによる処理の分岐
   if ( score >= 60 ) {
     Serial.println( "合格" ); 
   } else {
     Serial.println( "不合格" );
   }
}
void loop() {
   // put your main code here, to run repeatedly:
}

となります。

if( )文使用例1
if( )文使用例1
if( )文実行例1
if( )文実行例1

また、このように、

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);   // シリアルポートを初期化(9600 bpsで通信)
   // 変数宣言と初期化
   int score = 70;
   if ( score >= 60 ) {
     Serial.println( "合格" ); 
   } 
   if ( score < 60 ) {
     Serial.println( "不合格" ); 
   } 
}
void loop() {
   // put your main code here, to run repeatedly:
}
if( )文使用例2
if( )文使用例2
if( )文実行例2
if( )文実行例2

などのif文を2度利用して記述することもできる。
この記述は2回変数scoreを評価することになるので、
記述を間違えやすく、合格点数を変更する場合なども、
修正箇所が多くなります。
が、間違いではないので、分かりやすいならこれもOK!
・・・自分が分かりやすいことが大切です。

また、論理演算子を合わせて使い、
温度が20以下でかつ、湿度が50%以上かなどの判断記述もでき、
if ( 温度 <= 20 && 湿度 >= 50 ) { }
と記述できます。
※これは、説明的記述です。(変数名は半角文字です)

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);   // シリアルポートを初期化(9600 bpsで通信)
   // 変数宣言と初期化
   int temperature = 22;
   int humidity = 54;
   // if()文に論理演算子を含めた判断分岐
   if(temperature < 28 && humidity < 61 ) {
       Serial.println( "温度・湿度をも適正です" );
   } else if(temperature < 28 || humidity < 60 ) {
       Serial.println( "温度・湿度のいずれかがが不適です" );
   } else {
       Serial.println( "温度・湿度とも不適です" );
   }
}
void loop() {
   // put your main code here, to run repeatedly:
}
論理演算子の実行例
論理演算子の実行例

論理(ブール)演算子には、

記号説明
&&かつ (論理積
||または (論理和)
!ではない (否定)
論理演算子一覧

などがあります。

分岐の制御文にはもう一つあります。
それは、switch case( )文とよばれるもので、
※単にswitch( )文とよぶことが多いような?

switch case( )文1
switch case( )文1

ようなものです。
1つの値を定量的に判断して分岐するものです。
変数aの値が、
1ならば、”A”と
2ならば、”B”と
3ならば、”C”と表示させたい場合、

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);   // シリアルポートを初期化(9600 bpsで通信)
   // 変数宣言
   int a = 2;
   // switch文による分岐
   switch ( a ) {
     case 1:  // 1のとき
       Serial.println( "A" );
       break;
     case 2: // 2のとき
       Serial.println( "B" );
       break;
     case 3: // 3のとき
       Serial.println( "C" );
       break;
     default:  // defaultは省略省略できます
       Serial.println( "1、2、3以外の数値" );
   }
 }
 void loop() {
   // put your main code here, to run repeatedly:
 }
switch case( )文の実行例
switch case( )文の実行例

break文は、ここで、switch文のブロック{ }から抜ける
という指示で、このbreak文を書かないと、そのまま、
次のcase文内の内容が実行されます。
利用方法によっては、わざとbreak文を書かず、継続的に
次々と実行するような記述を(仕組みと)する場合もあります。

注意点は、定量的な比較なので、
等しい( == )という判断比較のみでの使用です。