====== 3-10 ifで分岐処理 ======
「分岐処理」も「繰り返し処理」と同じ制御文の一つです。
**__分岐処理は、"特定の条件が成立する(orしない)時だけ、任意の処理をしたい時"__** に使われます。
最も基本的な分岐処理「if」、そのifの分岐を発展させる便利な「else」「else if」の組み合わせをマスターすれば、5章からの電子部品を動かすサンプルコードを読むことができるようになります。
===== 特定の条件の時だけ処理をする「if」 =====
==== if文の基本的な書き方 ====
if( 分岐処理をするための条件式をここに書く ){
条件が成立しているときに実行したい処理をここに書く
処理は何行書いてもOK
}
さっそく解説していきます!
==1行目==
ifの後ろの( )内に条件式を書きます。
この条件式が成立した(true)場合、if文内部の命令を、上から順に一行ずつ実行します。
if文の内部は、( )の後ろの「{」から4行目の「}」までの間です。
==2~3行目==
ここは{ }で括られた、if文の内部です。ここに、条件式が成立しているときに実行したい処理を書きます。
処理は何行でも、必要なだけ書いてOKです。この内部に更に別の分岐処理や繰り返し処理を書いて、入れ子状にしてもOKです。
{ }内の処理をすべて終了すると、このif文は終了です。引き続いて5行目以降の処理が開始されます。
==4行目==
波かっこ閉じによって、このif文の本文はここで終了です。
ちなみにif文冒頭で条件式が不成立(false)だった場合は、if文の内部はすっ飛ばして5行目以降の処理に移ります。
==== if文のサンプルコード解説 ====
サンプルコード3-10_if.inoを開いてください。
long randNum;
//生成した乱数を入れておく変数です。
//乱数はlong型の整数で生成される決まりなので、longで定義しています。
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
//このプログラムでは乱数を使いたいので、そのためにまずは
//Arduinoの、何も接続していないピンのノイズを利用して
//疑似乱数ジェネレータを初期化します。
}
void loop() {
randNum = random(1,10);
//乱数を生成して、変数randNumに入れておきます。
//今回生成する乱数は、1~9のどれかの整数です
if (randNum >= 5) {
Serial.print("今回生成された乱数は");
Serial.print(randNum);
Serial.println("でした!");
}
Serial.println("また来週!");
delay(3000);
}
=== 動作確認 ===
このプログラムをArduinoに書き込むと下記のどちらかのメッセージがシリアルモニタに表示されます。
今回生成された乱数はXでした!
また来週!
また来週!
「乱数はXでした」の「X」は、5~9の数字がランダムに表示されます。
どちらであっても、「また来週!」の表示から約3秒経過した後、再度メッセージの表示が繰り返されます。
=== 関数解説:乱数を生成するrandomSeed関数とrandom関数 ===
if文の解説に入る前に、新しい関数が出てきたのでそちらを先に解説します。
Arduinoでは、乱数(=サイコロを振って出るような、規則性のないランダムな数)を生成して、プログラムの中で利用することができます。
この乱数の生成に必要なのが、「randomSeed関数」と「random関数」です。
== randomSeed関数 ==
randomSeed(Seed)
この関数はsetup部内に書き、「Arduinoの、何も接続していないアナログ入力ピンのノイズを利用して乱数を生成するためのジェネレータを初期化する」関数です。
難しい話なので、とりあえず今は randomSeed(analogRead(0)); と書くと覚えましょう。
(一応ざっくり解説すると、この記述によりArduinoのアナログ0番ピンのノイズを乱数生成器として利用する準備をしています)
この場合、アナログ0番ピンには何もパーツを接続しないでください。
アナログ0番ピンに何かパーツを挿している場合は、他のアナログピンを使いましょう。randomSeed(analogRead(0));の0を任意のアナログピン番号にすればOKです。
== random関数 ==
random(min , max)
こちらは乱数を実際に生成するための関数です。
randomを使うには、あらかじめrandomSeedをsetup部内に記述しておく必要があります。
randomの( )内には1つ、もしくは2つの数値をカンマで区切って入れます。
数値1つめ(minの部分)は、"乱数を生成した時に出る数値の中で、最も小さい数値"です。こちらは省略可能です。省略すると最小の数値は「0」になります。
2つめ(maxの部分)は、"乱数を生成した時に出る数値の上限"です。こちらは省略不可です。
例えば「100」にした場合、このrandomで登場する最大の数値は「99」になります。
そしてrandomで生成した乱数はそのままでは保存されないので、変数Y = random(XX , XX) の形で関数を使い、変数の中に生成した乱数を格納して使う必要があります。
この時の変数は(たとえ入れる値がごく小さかったとしても)long型で定義しましょう。これは、**random関数で生成される乱数は必ずlong型になるという仕様**があるためです。
=== コード解説 ===
前置きが長くなりましたが、if文のサンプルコード解説に入ります!
==1行目==
long randNum;
ここは宣言部です!今回はここでlong型の変数randNumを宣言しています。
==7行目==
randomSeed(analogRead(0));
setup部内です。ここでrandomSeed関数を使って、乱数を生成するための準備をしています。
今回Arduinoのアナログ0番ピンは未接続なので、randomSeed(analogRead(0));でOKです。
==14行目==
randNum = random(1,10);
if文に入る前に乱数生成をして、生成された乱数をrandNumに入れておきます。
random(1,10);と書いたので、今回生成される乱数は最小値が1、最大値が9です。つまり1~9のどれかの数字が生成されます。
==18~22行目==
if (randNum >= 5) {
Serial.print("今回生成された乱数は");
Serial.print(randNum);
Serial.println("でした!");
}
お待ちかねのif文です。まずは条件式からです。
( )内は (randNum >= 5) となっているので、「randNumが5以上であればtrue」です。
つまり、生成された乱数が「5, 6, 7, 8, 9」のどれかであれば、if文の内部に突入します。
if文の内部では、今回は「今回生成された乱数はXでした!」を表示するだけのシンプルな処理を実行します。if文内の処理をすべて終えたら23行目に移ります。
もし冒頭の条件式の結果がfalseだった場合(つまり生成された乱数が「1, 2, 3, 4」のどれかだった場合)は、19~21行目はすっ飛ばして23行目に移ります。
==23行目==
Serial.println("また来週!");
シリアルモニタに文字列「また来週!」と表示させます。
ここはif文終了後なので、if文の条件式判定に関わらず、どんな場合でも実行されます。
==24行目==
delay(3000);
人間がシリアルモニタを目で追えるよう、3秒待機させます。
25行目まで到達したらloop文の冒頭に戻り再び処理が始まります。
===== 「if」のまとめ =====
===if文のポイント===
* if文は 特定の条件が成立する(orしない)時だけ、任意の処理をしたい時 に使われる処理
* 条件式を設定し、trueの場合のみ処理を実行する
* 条件式の判定がfalseだった場合は処理を実行しない