差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
gimmickkouza:electronic_basic:3:8_while [2024/05/27 23:37] – lutamesta | gimmickkouza:electronic_basic:3:8_while [2024/06/21 18:29] (現在) – lutamesta | ||
---|---|---|---|
行 7: | 行 7: | ||
本資料では、よく使われる繰り返し処理「while」と「for」の解説をします。 | 本資料では、よく使われる繰り返し処理「while」と「for」の解説をします。 | ||
まずは「while」からいってみましょう! | まずは「while」からいってみましょう! | ||
- | + | ||
===== 判定してシンプルに繰り返す「while」 ===== | ===== 判定してシンプルに繰り返す「while」 ===== | ||
==== while文の基本的な書き方 ==== | ==== while文の基本的な書き方 ==== | ||
行 17: | 行 16: | ||
} | } | ||
</ | </ | ||
- | |||
さっそく解説していきます。 | さっそく解説していきます。 | ||
- | + | ==1行目== | |
- | 1行目: | + | whileの後ろの( )内に条件式を書きます。 |
- | whileの後ろの( )内に条件式を書きます。 | + | **__この条件式が成立している間、while文内部の処理を繰り返し続けます。__** |
- | **__この条件式が成立している間、while文内部の処理を繰り返し続けます。__** | + | while文の内部は、( )の後ろの「{」から4行目の「}」までの間です。 |
- | while文の内部は、( )の後ろの「{」から4行目の「}」までの間です。 | + | ==2~3行目== |
- | + | ここは{ }で括られた、while文の内部です。 | |
- | 2~3行目: | + | ここに、条件式が成立しているときに繰り返したい処理を書きます。 |
- | ここは{ }で括られた、while文の内部です。 | + | 処理は何行でも、必要なだけ書いてOKです。 |
- | ここに、条件式が成立しているときに繰り返したい処理を書きます。 | + | この内部に更に別の繰り返し処理や分岐処理を書いて、入れ子状にすることもできます。 |
- | 処理は何行でも、必要なだけ書いてOKです。 | + | **__繰り返したい処理とは別に、while文を抜けるための処理も用意しておく必要があります。__** |
- | この内部に更に別の繰り返し処理や分岐処理を書いて、入れ子状にすることもできます。 | + | 制御文の中身の行は、行頭にインデントを入れておきましょう。 |
- | **__繰り返したい処理とは別に、while文を抜けるための処理も用意しておく必要があります。__** | + | そうすることで、どこからどこまでがどの制御文の中身かが一目でわかります。 |
- | 制御文の中身の行は、行頭にインデントを入れておきましょう。 | + | ==4行目== |
- | そうすることで、どこからどこまでがどの制御文の中身かが一目でわかります。 | + | 波かっこ閉じによって、このwhile文は終了します。 |
- | + | while文の条件式が不成立だった、或いはwhile文の中身を繰り返処理する中で、成立していた式が不成立になった場合、while文は終了し5行目から次の処理が実行されます。 | |
- | 4行目: | + | |
- | 波かっこ閉じによって、このwhile文は終了します。 | + | |
- | while文の条件式が不成立だった、或いはwhile文の中身を繰り返処理する中で、成立していた式が不成立になった場合、while文は終了し5行目から次の処理が実行されます。 | + | |
- | + | ||
==== while文のサンプルコード解説 ==== | ==== while文のサンプルコード解説 ==== | ||
サンプルコード3-8_while.inoを開いてください。 | サンプルコード3-8_while.inoを開いてください。 | ||
行 74: | 行 68: | ||
このプログラムをArduinoに書き込むと、シリアルモニタに | このプログラムをArduinoに書き込むと、シリアルモニタに | ||
< | < | ||
- | 「えりんぎ稟議」 | + | えりんぎ稟議 |
- | 「現在XX回目の処理だよ」 | + | 現在XX回目の処理だよ |
</ | </ | ||
の2行がだいたい1秒間隔で表示されます。 | の2行がだいたい1秒間隔で表示されます。 | ||
「現在XX回目~」の「XX」は1~10までで1回ずつ増え、10回目を表示した後、 | 「現在XX回目~」の「XX」は1~10までで1回ずつ増え、10回目を表示した後、 | ||
- | < | + | < |
が表示され、約5秒経過した後「現在1回目~」から再度同じ動作が実行されます。 | が表示され、約5秒経過した後「現在1回目~」から再度同じ動作が実行されます。 | ||
=== コード解説 === | === コード解説 === | ||
続いてプログラムの解説です。 | 続いてプログラムの解説です。 | ||
- | == 1巡目 == | + | <alert type=" |
+ | ==1~4行目== | ||
< | < | ||
void setup() { | void setup() { | ||
行 91: | 行 86: | ||
} | } | ||
</ | </ | ||
- | 1~4行目: | + | setup部でシリアル通信の設定・初期化をしています。 |
- | setup部でシリアル通信の設定・初期化をしています。 | + | ==6行目== |
< | < | ||
int count = 0;// | int count = 0;// | ||
</ | </ | ||
- | 6行目: | + | int型の変数countを宣言し、中身に「0」を入れました。 |
- | int型の変数countを宣言し、中身に「0」を入れました。 | + | コメントにも書いてある通り、このcountはwhile文の条件式に使うための変数です。 |
- | コメントにも書いてある通り、このcountはwhile文の条件式に使うための変数です。 | + | 今回のプログラムの仕様上、このcountに入る最小の値は「0」、最大の値は「10」です。 |
- | 今回のプログラムの仕様上、このcountに入る最小の値は「0」、最大の値は「10」です。 | + | なのでデータ型にはintを採用しています。 |
- | なのでデータ型にはintを採用しています。 | + | ==8行目== |
< | < | ||
while(count < 10){ | while(count < 10){ | ||
</ | </ | ||
- | 8行目: | + | お待ちかねのwhile文です!まずは条件判定です。 |
- | お待ちかねのwhile文です!まずは条件判定です。 | + | 今回の条件式は(count < 10)です。 |
- | 今回の条件式は(count < 10)です。 | + | この意味は **「変数countの中身が10未満である間は、while文の中身を繰り返す」** です。 |
- | この意味は **「変数countの中身が10未満である間は、while文の中身を繰り返す」** です。 | + | 先ほど変数countの中身には0を代入しました。 |
- | 先ほど変数countの中身には0を代入しました。 | + | なので (count < 10) は、今回の条件では (0 < 10) となり、「0」は「10未満」なので、この条件式は成立している(true)と言えます。 |
- | なので (count < 10) は、今回の条件では (0 < 10) となり、「0」は「10未満」なので、この条件式は成立している(true)と言えます。 | + | 条件式が成立したので、while文の中身に突入し、これを実行します。 |
- | 条件式が成立したので、while文の中身に突入し、これを実行します。 | + | ==11行目== |
< | < | ||
Serial.println(" | Serial.println(" | ||
</ | </ | ||
- | 11行目: | + | 文字列「えりんぎ稟議」をシリアルモニタに表示する命令です。 |
- | 文字列「えりんぎ稟議」をシリアルモニタに表示する命令です。 | + | ==13行目== |
< | < | ||
count = count + 1; // | count = count + 1; // | ||
</ | </ | ||
- | 13行目: | + | 変数countに1を足します。これにより、countの中身は「1」になりました。 |
- | 変数countに1を足します。これにより、countの中身は「1」になりました。 | + | **このwhile文は、「whileの中身の処理を10回繰り返す」ことを目的としています。** |
- | **このwhile文は、「whileの中身の処理を10回繰り返す」ことを目的としています。** | + | **そのためには、「今何回目の処理まで終わっているか」を、プログラム内のどこかに記憶させておく必要があります。** |
- | **そのためには、「今何回目の処理まで終わっているか」を、プログラム内のどこかに記憶させておく必要があります。** | + | その役割を果たすのが、変数countです。 |
- | その役割を果たすのが、変数countです。 | + | この行でcountに1を足すことで、「今1回処理をしました!」ということをcount内に数値という形で蓄積・記憶させます。 |
- | この行でcountに1を足すことで、「今1回処理をしました!」ということをcount内に数値という形で蓄積・記憶させます。 | + | **この処理を忘れると、countの中身はずっと0のまま=永遠にwhile文を繰り返し続ける**ことになってしまいます。 |
- | **この処理を忘れると、countの中身はずっと0のまま=永遠にwhile文を繰り返し続ける**ことになってしまいます。 | + | ==15~17行目== |
< | < | ||
Serial.print(" | Serial.print(" | ||
行 136: | 行 126: | ||
Serial.println(" | Serial.println(" | ||
</ | </ | ||
- | 15~17行目: | + | シリアルモニタに文字列「現在XX回目の処理だよ」と表示させます。 |
- | シリアルモニタに文字列「現在XX回目の処理だよ」と表示させます。 | + | 「XX回目」の部分は、変数countの中身を表示しています。 |
- | 「XX回目」の部分は、変数countの中身を表示しています。 | + | countの中身には「今何回目の処理まで終わっているか」が数値で記憶されています。 |
- | countの中身には「今何回目の処理まで終わっているか」が数値で記憶されています。 | + | なので、「現在1回目の処理だよ」が表示されるはずです。 |
- | なので、「現在1回目の処理だよ」が表示されるはずです。 | + | ==20行目== |
< | < | ||
delay(1000);// | delay(1000);// | ||
</ | </ | ||
- | 20行目: | + | 人間がシリアルモニタを目で追えるよう、1秒待機させます。 |
- | 人間がシリアルモニタを目で追えるよう、1秒待機させます。 | + | |
行 153: | 行 141: | ||
このプログラムではwhile文の先頭は8行目です。 | このプログラムではwhile文の先頭は8行目です。 | ||
なので8行目に戻り、while文の条件式の判定を再度行います。 | なので8行目に戻り、while文の条件式の判定を再度行います。 | ||
- | + | ||
- | == 2巡目 | + | <alert type=" |
そんなわけでwhile文2巡目です! | そんなわけでwhile文2巡目です! | ||
- | + | ==8行目(2巡目)== | |
< | < | ||
while(count < 10){ | while(count < 10){ | ||
</ | </ | ||
- | 8行目(2巡目): | + | 条件式は同じ(count < 10) ですが、1巡目とは1点異なる点があります。 |
- | 条件式は同じ(count < 10) ですが、1巡目とは1点異なる点があります。 | + | それは、**countの中身が「1」に増えている**ことです。 |
- | それは、**countの中身が「1」に増えている**ことです。 | + | なので、今回の条件式では (1 < 10) が判定にかけられます。 |
- | なので、今回の条件式では (1 < 10) が判定にかけられます。 | + | 結果は今回もtrueなので、今回もwhile文の中身を実行していきます。 |
- | 結果は今回もtrueなので、今回もwhile文の中身を実行していきます。 | + | |
- | ちなみにwhile文は、while文の先頭で条件判定を行うのが特徴です。 | + | |
- | (=文の先頭で判定! → trueなら中身に突入 → 最後尾まで来たらもう一度先頭で判定!) | + | |
- | 今回この資料では触れませんが、文の末尾で条件判定をする「do while」文なんてのもありますので、興味のある方は調べてみてください。 | + | |
+ | ちなみにwhile文は、while文の先頭で条件判定を行うのが特徴です。 | ||
+ | (=文の先頭で判定! → trueなら中身に突入 → 最後尾まで来たらもう一度先頭で判定!) | ||
+ | 今回この資料では触れませんが、文の末尾で条件判定をする「do while」文なんてのもありますので、興味のある方は調べてみてください。 | ||
+ | ==11行目(2巡目)== | ||
< | < | ||
Serial.println(" | Serial.println(" | ||
</ | </ | ||
- | 11行目(2巡目): | + | またしても「えりんぎ稟議」がモニタに表示されます🍄💭 |
- | またしても「えりんぎ稟議」がモニタに表示されます🍄💭 | + | ==13行目(2巡目)== |
< | < | ||
count = count + 1; // | count = count + 1; // | ||
</ | </ | ||
- | 13行目(2巡目): | + | ここでcountに1を足します。 |
- | ここでcountに1を足します。 | + | 「今何回目の処理まで終わっているか」を記憶するcountの中身は1+1=「2」になりました。 |
- | 「今何回目の処理まで終わっているか」を記憶するcountの中身は1+1=「2」になりました。 | + | ==15~17行目(2巡目)== |
< | < | ||
Serial.print(" | Serial.print(" | ||
行 187: | 行 173: | ||
Serial.println(" | Serial.println(" | ||
</ | </ | ||
- | 15~17行目(2巡目): | + | countの中身が「2」になっているので、「XX回目」は「2回目」と表示されているはずです。 |
- | countの中身が「2」になっているので、「XX回目」は「2回目」と表示されているはずです。 | + | ==20行目(2巡目)== |
< | < | ||
delay(1000);// | delay(1000);// | ||
</ | </ | ||
- | 20行目(2巡目): | + | 1秒待機した後、再びwhile文の先頭に戻ります。 |
- | 1秒待機した後、再びwhile文の先頭に戻ります。 | + | |
行 200: | 行 184: | ||
**__この処理があと8回、10巡目まで繰り返されます。__** | **__この処理があと8回、10巡目まで繰り返されます。__** | ||
8回同じ内容を書き続けるのは書く方も読む方もダルいと思いますので、最後の回、10巡目の終了部分まで一気にショートカットします。 | 8回同じ内容を書き続けるのは書く方も読む方もダルいと思いますので、最後の回、10巡目の終了部分まで一気にショートカットします。 | ||
- | + | ||
- | == 11巡目 | + | <alert type=" |
そんなわけでwhile文11巡目です! | そんなわけでwhile文11巡目です! | ||
- | + | ==8行目(11巡目)== | |
< | < | ||
while(count < 10){ | while(count < 10){ | ||
</ | </ | ||
- | 8行目(11巡目): | + | while文の先頭にやってきました。11回目の条件式の判定です。 |
- | while文の先頭にやってきました。11回目の条件式の判定です。 | + | **11巡目時点(=10回目の処理終了直後)なのでcountの中身は「10」になっています。** |
- | **11巡目時点(=10回目の処理終了直後)なのでcountの中身は「10」になっています。** | + | 条件式 (count < 10) は (10 < 10) として判定にかけられますが、「10は10未満」は成立しません!falseです! |
- | 条件式 (count < 10) は (10 < 10) として判定にかけられますが、「10は10未満」は成立しません!falseです! | + | (「なぜ?」と思ってる人は、「未満」と「以下」の違いをググってね!) |
- | (「なぜ?」と思ってる人は、「未満」と「以下」の違いをググってね!) | + | **falseなので、このwhile文はこれにて終了です。** |
- | **falseなので、このwhile文はこれにて終了です。** | + | while文の中身は実行せずに、全文すっ飛ばして23行目に移ります。 |
- | while文の中身は実行せずに、全文すっ飛ばして23行目に移ります。 | + | ==23行目== |
< | < | ||
Serial.println(" | Serial.println(" | ||
</ | </ | ||
- | 23行目: | + | シリアルモニタに「whileを抜けました。loop部の先頭に戻ります」が表示されます。 |
- | シリアルモニタに「whileを抜けました。loop部の先頭に戻ります」が表示されます。 | + | Arduinoのプログラムの基本を思い出しましょう。 |
- | Arduinoのプログラムの基本を思い出しましょう。 | + | Arduinoでは、プログラムは常に上から1行ずつ順番に実行されます。 |
- | Arduinoでは、プログラムは常に上から1行ずつ順番に実行されます。 | + | なので、while文を抜けた後は、while文の下にあるコードが順番に実行されます。 |
- | なので、while文を抜けた後は、while文の下にあるコードが順番に実行されます。 | + | ==24行目== |
< | < | ||
delay(5000);// | delay(5000);// | ||
</ | </ | ||
- | 24行目: | + | delayにより約5秒待機します。 |
- | delayにより約5秒待機します。 | + | 長かったwhileを終えてプログラムの末尾まで到達した感動をかみしめてほしい…」 |
- | 「長かったwhileを終えてプログラムの末尾まで到達した感動をかみしめてほしい…」 | + | そんな講師の思いで5秒待機させています。仕様的な意味は特にないです。 |
- | そんな講師の思いで5秒待機させています。仕様的な意味は特にないです。 | + | ==25行目== |
< | < | ||
} | } | ||
</ | </ | ||
- | 25行目: | + | これにてようやくloop部が終了しました。 |
- | これにてようやくloop部が終了しました。 | + | 先頭に戻り、loop部のプログラムを最初から再度実行します。 |
- | 先頭に戻り、loop部のプログラムを最初から再度実行します。 | + | この解説文の冒頭に戻って、同じことをもう一度繰り返すと思っていただければOKです。 |
- | この解説文の冒頭に戻って、同じことをもう一度繰り返すと思っていただければOKです。 | + | |
+ | |||
===== 「while」のまとめ ===== | ===== 「while」のまとめ ===== | ||
- | while文は… | + | ===while文のポイント=== |
* 特定の条件が成立する時だけ、同じ処理を繰り返したい時 に使われる処理 | * 特定の条件が成立する時だけ、同じ処理を繰り返したい時 に使われる処理 | ||
* 繰り返す条件や回数を条件式で設定する | * 繰り返す条件や回数を条件式で設定する |