制御文法を使う(分岐)条件により流れを変える(Arduino)
スケッチした内容は記述順に、
(プロフラミング記述された順に)
何も制御しない場合は、
上から下へ左から右へと順に実行されます。
しかし、
処理によっては、
条件により処理を変えたい場合があります。
例えば、
テストの点数を判断して、
60点以上なら”合格”、
60点未満なら”不合格と”表示したい。
このような場合、
Serial.println( "合格" );
Serial.println( "不合格" );
と記述(プログラミング)してしまえば。
シリアルモニタには、
合格
不合格
と表示され、
どちらかだけを表示することはできません。
こんな時、この分岐(条件判断)を利用します。
int score = 70;
判断する材料として、この整数型変数scoreに
点数が入っているとします。
判断の基準は、
整数型変数scoreが60以上の時:合格
整数型変数scoreが60未満の時:不合格
とします。
これをアルゴリズム風に書くと、
な感じでしょうか。
この分岐には、if( )文を使います。
書式ですが、
if ( 条件式 ) {
条件式が成り立つとき実行したい文群
}
が基本文法です。
条件式では、2つの値の比較を演算子を使って行います。
条件式で使われる演算子を比較演算子といい、
左辺 比較演算子 右辺 | 成り立つ(true)と判定されるとき |
== | 左辺右辺が等しい |
!= | 左辺右辺が等しくない |
< | 左辺より右辺が大きい (右辺より左辺が小さい) |
> | 左辺より右辺が小さい (右辺より左辺が大きい) |
<= | 右辺が左辺以上 (右辺が左辺以下) |
>= | 右辺が左辺以下 (右辺が左辺以上) |
などがあります。
条件式が成り立つときを、
真、true、などといい、
条件式が成り立たないときを、
偽、false、などといいます。
条件式が成り立つとき、成り立たないときの
両者を利用するときは、
if ( 条件式 ) {
条件式が成り立つとき実行したい文群
} else {
条件式が成り立たないとき実行したい文群
}
と記述します。
また、この図のような条件判断を行いたい場合は、
if ( 条件式 ) {
条件式が成り立つとき実行したい文群
} else if ( 条件式 ) {
条件式が成り立たないとき実行したい文群
} else {
条件式が成り立たないとき実行したい文群
}
のように、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:
}
となります。
また、このように、
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度利用して記述することもできる。
この記述は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( )文とよぶことが多いような?
ようなものです。
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:
}
break文は、ここで、switch文のブロック{ }から抜ける
という指示で、このbreak文を書かないと、そのまま、
次のcase文内の内容が実行されます。
利用方法によっては、わざとbreak文を書かず、継続的に
次々と実行するような記述を(仕組みと)する場合もあります。
注意点は、定量的な比較なので、
等しい( == )という判断比較のみでの使用です。