差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
gimmickkouza:electronic_basic:3:11_elseif [2024/05/29 22:15] – 作成 lutamestagimmickkouza:electronic_basic:3:11_elseif [2024/06/21 18:31] (現在) lutamesta
行 1: 行 1:
-====== 3-11 elseとelse ifでもっと分岐する ======+====== 3-11 elseとelse ifでもっと分岐 ======
 分岐処理の基本である「if」に、「else」や「else if」を組み合わせることでより複雑で多彩な分岐処理を作り出すことができます。 分岐処理の基本である「if」に、「else」や「else if」を組み合わせることでより複雑で多彩な分岐処理を作り出すことができます。
 ちょっと長いですが、このページで第3章は修了です。もうひと踏ん張りです。 ちょっと長いですが、このページで第3章は修了です。もうひと踏ん張りです。
-   
      
 ===== falseにも処理を与える「else」 ===== ===== falseにも処理を与える「else」 =====
行 17: 行 16:
 実はそれと同じ機能を、もっとシンプルな記述で実現する手段があります! 実はそれと同じ機能を、もっとシンプルな記述で実現する手段があります!
 それは「if」に「else」を組み合わせて使うことです。 それは「if」に「else」を組み合わせて使うことです。
- +  
- +
 ==== elseを組み合わせたif文の基本的な書き方 ==== ==== elseを組み合わせたif文の基本的な書き方 ====
 <code> <code>
行 30: 行 27:
 } }
 </code> </code>
- +==1~3行目== 
-1~3行目 +この部分はさっきのifそのままです。 
- この部分はさっきのifそのままです。 +( )内の条件式が成立した(true)場合、2~3行目内部の命令を、上から順に一行ずつ実行します。
- ( )内の条件式が成立した(true)場合、2~3行目内部の命令を、上から順に一行ずつ実行します。+
    
-4行目 +==4行目== 
- ifの終結部「}」の後に else がついていて、更にその後ろから新たな{ }が発生しています。 +ifの終結部「}」の後に else がついていて、更にその後ろから新たな{ }が発生しています。 
- この波かっこの中は、**ifの条件式が不成立だった(false)場合に実行したい処理を書く**場所です。 +この波かっこの中は、**ifの条件式が不成立だった(false)場合に実行したい処理を書く**場所です。 
- こちらもifと同じで、処理は何行でも書いてOKです。もちろんこの内部に更に別の分岐処理や繰り返し処理を書いて、入れ子状にするのもOKです。 +こちらもifと同じで、処理は何行でも書いてOKです。もちろんこの内部に更に別の分岐処理や繰り返し処理を書いて、入れ子状にするのもOKです。 
- { }内の処理をすべて終了すると、elseは終了です。引き続いて8行目以降の処理が実行されます。+{ }内の処理をすべて終了すると、elseは終了です。引き続いて8行目以降の処理が実行されます。
  
- 条件式で判定をしたときに、返す答えはtrueかfalseの二択です。 +条件式で判定をしたときに、返す答えはtrueかfalseの二択です。 
- 今回このif文ではelseを使うことで、条件式がtrueの場合とfalseの場合それぞれの処理を指定しました。 +今回このif文ではelseを使うことで、条件式がtrueの場合とfalseの場合それぞれの処理を指定しました。 
- なので、2行目~7行目までの処理が飛ばされることは絶対にありません。**trueであれば2~3行目、falseであれば5~6行目が必ず実行されます。**+なので、2行目~7行目までの処理が飛ばされることは絶対にありません。**trueであれば2~3行目、falseであれば5~6行目が必ず実行されます。**
      
 ==== elseを組み合わせたif文のサンプルコード解説 ==== ==== elseを組み合わせたif文のサンプルコード解説 ====
行 99: 行 95:
 === コード解説 === === コード解説 ===
 前半は3-10_if.inoと全く同じなのでif文が開始する18行目まで飛ばします。 前半は3-10_if.inoと全く同じなのでif文が開始する18行目まで飛ばします。
 +==18行目==
 <code> <code>
  for (int count = 1; count <= 10; count++) {  for (int count = 1; count <= 10; count++) {
 </code> </code>
-18行目: +ここも3-10と全く変わりありません。(randNum >= 5) なので、生成された乱数が「5, 6, 7, 8, 9」のどれかであればtrueです。 
- ここも3-10と全く変わりありません。(randNum >= 5) なので、生成された乱数が「5, 6, 7, 8, 9」のどれかであればtrueです。 +trueだった場合に実行される19~21行目の処理もそのままです。 
- trueだった場合に実行される19~21行目の処理もそのままです。 +処理をすべて終えたらこのif文は終了です。22~25行目はすっ飛ばして26行目に移ります。 
- 処理をすべて終えたらこのif文は終了です。22~25行目はすっ飛ばして26行目に移ります。 +==22~25行目==
 <code> <code>
 } else { } else {
行 114: 行 109:
  
 </code> </code>
-22~25行目: +ここからelseの出番です! 
- ここからelseの出番です! +if文冒頭の条件式は(randNum >= 5) でした。なので、生成された乱数が「1, 2, 3, 4」のどれかであれば不成立、すなわちfalseの判定になっています。 
- if文冒頭の条件式は(randNum >= 5) でした。なので、生成された乱数が「1, 2, 3, 4」のどれかであれば不成立、すなわちfalseの判定になっています。 +条件式がfalse判定だった場合、19~21行目の内容はすっ飛ばし23行目から処理が始まります。 
- 条件式がfalse判定だった場合、19~21行目の内容はすっ飛ばし23行目から処理が始まります。 +trueと同じ文言を表示しても面白くないので、elseの行では生成された乱数の値に関係なく、残念賞のメッセージを表示しています。 
- trueと同じ文言を表示しても面白くないので、elseの行では生成された乱数の値に関係なく、残念賞のメッセージを表示しています。 +==26行目==
 <code> <code>
 Serial.println("また来週!"); Serial.println("また来週!");
 </code> </code>
-26行目: +if文の外に出ました。if文の判定に関係なく、一律「また来週!」を表示します。 
- if文の外に出ました。if文の判定に関係なく、一律「また来週!」を表示します。 +==27行目==
 <code> <code>
 delay(3000); delay(3000);
 </code> </code>
-20行目: +人間がシリアルモニタを目で追えるよう、3秒待機させます。 
- 人間がシリアルモニタを目で追えるよう、3秒待機させます。 +28行目まで到達したらloop文の冒頭に戻り再び処理が始まります。 
- 28行目まで到達したらloop文の冒頭に戻り再び処理が始まります。+  
      
 ===== 「else」のまとめ ===== ===== 「else」のまとめ =====
行 140: 行 133:
 {{:gimmickkouza:electronic_basic:3:3-17.png?600|}} {{:gimmickkouza:electronic_basic:3:3-17.png?600|}}
      
----- +   
 +  
 ===== falseを更に分岐させる「else if」 ===== ===== falseを更に分岐させる「else if」 =====
 「else」を使うことで、if文の中でtrueの時とfalseの時で2通りの処理を行えるようになりました。 「else」を使うことで、if文の中でtrueの時とfalseの時で2通りの処理を行えるようになりました。
行 157: 行 150:
 ただこの流れでだいたいお察しいただけるかとは思いますが、入れ子のif文と同じことを、簡単に実現できる専用の書き方があります。 ただこの流れでだいたいお察しいただけるかとは思いますが、入れ子のif文と同じことを、簡単に実現できる専用の書き方があります。
 それが「else if」です。 それが「else if」です。
 +  
 ==== else ifを使ったif文の基本的な書き方 ==== ==== else ifを使ったif文の基本的な書き方 ====
 <code> <code>
行 170: 行 163:
 } }
 </code> </code>
- +==1~2行目== 
-1~2行目 +ありふれたif文です。( )内の条件式を、他と区別するために 条件式A とします。 
- ありふれたif文です。( )内の条件式を、他と区別するために 条件式A とします。 +この条件式Aがtrueだった場合は、2行目の処理を実行してif文を終了します。 
- この条件式Aがtrueだった場合は、2行目の処理を実行してif文を終了します。 +条件式Aがfalseだった場合は、{ }内は実行せず3行目のelse ifに移ります。 
- 条件式Aがfalseだった場合は、{ }内は実行せず3行目のelse ifに移ります。 +==3~4行目== 
-   +「else if」の登場です。else ifの後ろには( )があり、中には条件式Bが入っています。 
-3~4行目 +条件式Aがfalseだった場合、続けてこの条件式Bの判定が行われます。 
- 「else if」の登場です。else ifの後ろには( )があり、中には条件式Bが入っています。 +**条件式Bがtrueだった場合は、後続の{ }の内部の処理を実行**後、if文を終了します。 
- 条件式Aがfalseだった場合、続けてこの条件式Bの判定が行われます。 +条件式Aに引き続いて**Bもfalseだった場合は、{ }をすっ飛ばし5行目のelse ifに移ります。** 
- **条件式Bがtrueだった場合は、後続の{ }の内部の処理を実行**後、if文を終了します。 +==5~6行目== 
- 条件式Aに引き続いて**Bもfalseだった場合は、{ }をすっ飛ばし5行目のelse ifに移ります。** +2つ目の「else if」です。( )内には条件式Cが入っています。 
-   +やることは3~4行目と同じです!条件式AもBもfalseなので、条件式Cの判定が行われます。 
-5~6行目 +**Cがtrueであれば{ }内を処理してif文終了、falseであれば7行目に移ります。** 
- 2つ目の「else if」です。( )内には条件式Cが入っています。 +==7~8行目== 
- やることは3~4行目と同じです!条件式AもBもfalseなので、条件式Cの判定が行われます。 +最後に「else」です。elseは条件式がfalseだった場合に{ }内の処理を実行する場所です。 
- **Cがtrueであれば{ }内を処理してif文終了、falseであれば7行目に移ります。** +**A・B・Cの全てでfalseを叩き出した、falseの中のfalseにのみ処理が実行**され、if文を終了します。
-   +
-7~8行目 +
- 最後に「else」です。elseは条件式がfalseだった場合に{ }内の処理を実行する場所です。 +
- **A・B・Cの全てでfalseを叩き出した、falseの中のfalseにのみ処理が実行**され、if文を終了します。+
      
 ==== else ifを組み合わせたif文のサンプルコード解説 ==== ==== else ifを組み合わせたif文のサンプルコード解説 ====
行 244: 行 233:
 === コード解説 === === コード解説 ===
 if文が開始する20行目までは、おさらいしかないので飛ばします。 if文が開始する20行目までは、おさらいしかないので飛ばします。
 +==20行目==
 <code> <code>
 if (randNum == 1) { //乱数が1だった場合 if (randNum == 1) { //乱数が1だった場合
 </code> </code>
-20行目: +if文開始です。まずは一つめの条件式です。 
- if文開始です。まずは一つめの条件式です。 +(randNum == 1) なので、生成された乱数が「1」であればtrueです。 
- (randNum == 1) なので、生成された乱数が「1」であればtrueです。 +trueだった場合は21~22行目の処理を順番に実行してif文終了。33行目に移ります。 
- trueだった場合は21~22行目の処理を順番に実行してif文終了。33行目に移ります。 +falseの場合は21~22行目を飛ばして23行目に移ります。 
- falseの場合は21~22行目を飛ばして23行目に移ります。 +==23行目==
-  +
 <code> <code>
 } else if (randNum == 2){ //乱数が2だった場合 } else if (randNum == 2){ //乱数が2だった場合
 </code> </code>
-23行目: +最初のelse ifです! 
- 最初のelse ifです! +二つめの条件式は(randNum == 2) です。なので、生成された乱数が「2」であればtrueです。 
- 二つめの条件式は(randNum == 2) です。なので、生成された乱数が「2」であればtrueです。 +条件式がtrue判定だった場合、24~25行目の内容を実行してif文終了、falseの場合は26行目に飛びます。 
- 条件式がtrue判定だった場合、24~25行目の内容を実行してif文終了、falseの場合は26行目に飛びます。 +==26行目==
-  +
 <code> <code>
 } else if (randNum == 3){ //乱数が3だった場合 } else if (randNum == 3){ //乱数が3だった場合
 </code> </code>
-26行目: +次もelse ifです! 
- 次もelse ifです! +条件式は(randNum == 3)です。乱数が「3」であればtrueで、27~28行目の内容を実行して 
- 条件式は(randNum == 3)です。乱数が「3」であればtrueで、27~28行目の内容を実行して +if文を終了、falseの場合は29行目に飛びます。 
- if文を終了、falseの場合は29行目に飛びます。 +==29行目==
-  +
 <code> <code>
 } else { //1、2、3以外の乱数が生成された場合 } else { //1、2、3以外の乱数が生成された場合
 </code> </code>
-29行目: +最後にelseが待ち構えています。 
- 最後にelseが待ち構えています。 +先に出てきた3つの条件式の全てでfalse判定がついた場合は、最終的にここに行きつきます。 
- 先に出てきた3つの条件式の全てでfalse判定がついた場合は、最終的にここに行きつきます。 +elseの{ }内の処理を実行してif文を終了します。 
- elseの{ }内の処理を実行してif文を終了します。 +==33行目==
-  +
 <code> <code>
 Serial.println("また来週!"); Serial.println("また来週!");
 </code> </code>
-33行目: +if文の外に出ました。if文の判定に関係なく、一律「また来週!」を表示します。 
- if文の外に出ました。if文の判定に関係なく、一律「また来週!」を表示します。 +==34行目==
-  +
 <code> <code>
 delay(3000); delay(3000);
 </code> </code>
-34行目: +人間がシリアルモニタを目で追えるよう、3秒待機させます。 
- 人間がシリアルモニタを目で追えるよう、3秒待機させます。 +28行目まで到達したらloop文の冒頭に戻り再び処理が始まります。
- 28行目まで到達したらloop文の冒頭に戻り再び処理が始まります。+
      
      
行 295: 行 278:
 そうではなく、**else ifした先で別の変数を参照して分岐を発生させることも、もちろん可能**です。 そうではなく、**else ifした先で別の変数を参照して分岐を発生させることも、もちろん可能**です。
 また今回のサンプルコードのように、**ひとつの変数の値の違いだけをチェックして複数分岐をしたい場合は、else ifを連発する他にも「switch case」**文を利用することもできます。(ぜひ調べてみてね!) また今回のサンプルコードのように、**ひとつの変数の値の違いだけをチェックして複数分岐をしたい場合は、else ifを連発する他にも「switch case」**文を利用することもできます。(ぜひ調べてみてね!)
 +  
      
 ===== 「else if」のまとめ ===== ===== 「else if」のまとめ =====