差分

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

この比較画面へのリンク

次のリビジョン
前のリビジョン
gimmickkouza:electronic_basic:3:9_for [2024/05/29 19:14] – 作成 lutamestagimmickkouza:electronic_basic:3:9_for [2024/06/21 18:30] (現在) lutamesta
行 1: 行 1:
 ====== 3-9 forで繰り返し処理 ====== ====== 3-9 forで繰り返し処理 ======
-本資料ではArduinoのためのプログラミング言語Arduino言語使い方学んいきます。 +「for」も「while」と同じ特定条件下で処理繰り返す制御文です。 
-まずプログラミ始める準備ょう!+機能的にwhileと同じですが、よりコパクトな文章で書き表すことができます。 
 +   
 +===== whileコンパクトにし「for」 ===== 
 +==== for文基本的な書き方 ==== 
 +<code> 
 +for ( 変数宣言し初期化する部分; 条件式の部分; 1ループごとに変数に加る変化の部分 ) { 
 +    条件が成立ているときに繰り返したい処理をここに書く 
 +    処理は何行書いてもOK 
 +
 +</code>
  
 +for文では、while文で数行使って別々に書いていた、
 +  * 繰り返しの判定に使う変数の宣言と初期値の代入
 +  * 条件式の設定
 +  * 繰り返しの判定に使う変数に加える変化
 +の3つを、なんとforの後ろの( )内に、まとめて1行で書くことができます。
  
-===== Arduino IDEっなんだろう =====+早速解説しいきます。
  
 +==1行目==
 +forの後ろの( )内に、3つの要素を「;」で区切って書きます。
 +**一つめは「繰り返しの判定に使う変数の宣言と初期値の代入」**です。先ほどのwhileのサンプルコードの変数countの宣言にあたる部分です。
 +**二つめは「条件式の設定」**です。先ほどの例では(count < 10)でした。
 +**三つめは「繰り返しの判定に使う変数に加える変化」**です。whileの中身にある count = count + 1; がこれにあたります。
 +==2~3行目==
 +ここは{ }で括られた、for文の内部です。
 +ここに、条件式が成立しているときに繰り返したい処理を書きます。
 +==4行目==
 +波かっこ閉じによって、このfor文は終了します。
 +for文の条件式が不成立だった、或いはfor文の中身を繰り返処理する中で、成立していた式が不成立になった場合、for文は終了し5行目から次の処理が実行されます。
 +   
 +==== for文のサンプルコード解説 ====
 +サンプルコード3-9_for.inoを開いてください。
  
 +<code>
 +void setup() {
 +  Serial.begin(9600);
 +   //シリアルモニタで結果を見たいので、シリアル通信を開始します
 +}
 +
 +void loop() {
 +   for (int count = 1; count <= 10; count++) {
 +     //↑左から順に、
 +     //繰り返しの判定に使う変数countの宣言をし初期値に1を代入
 +     //このfor文を繰り返すための条件式。「countが10以下なら繰り返す」
 +     //このfor文の中身を1回処理するごとにcountに1を足す
 +
 +    Serial.println("マッシュRoom");  //モニタに文字列を表示
 +
 +     Serial.print("現在");
 +     Serial.print(count);
 +     Serial.println("回目の処理だよ");
 +     //現在何回目の処理かを、↑の3行でシリアルモニタに表示します
 +
 +    delay(1000);  //1秒待機します
 +  }
 +   Serial.println("forを抜けました。loop部の先頭に戻ります");
 +   delay(5000);  //5秒待機します
 +
 +}
 +</code>
 +
 +=== 動作確認 ===
 +このプログラムでは、先程のwhile文と全く同じ動作内容を、for文を使って実現しています。
 +なのでシリアルモニタから確認できる動作は、(一部のメッセージ内容を除いて)while文のサンプルコードと全く同じです。
 +従って、このプログラムをArduinoに書き込むと、下記のように動作するはずです。
 +
 +<code>
 +マッシュRoom
 +現在XX回目の処理だよ
 +</code>
 +の2行が、シリアルモニタにだいたい1秒間隔で表示されます。
 +「現在XX回目~」の「XX」は1~10までで1回ずつ増え、10回目を表示した後、
 +<code>forを抜けました。loop部の先頭に戻ります</code>
 +が表示され、約5秒経過した後「現在1回目~」から再度同じ動作が実行されます。
 +
 +
 +=== コード解説 ===
 +続いてプログラムの解説です!
 +setup部は繰り返しになるので割愛します。
 +==7行目==
 +<code>
 + for (int count = 1; count <= 10; count++) {
 +</code>
 +forの後ろの( )内に、3つの式が「;」で区切られて書かれています。
 +
 +**一つめは、「繰り返しの判定に使う変数の宣言と初期値の代入」**です。
 +この部分は、**for文を開始する時に1度だけ実行**されます。
 +今回はint count = 1; でint型の変数countを宣言し、中身に「1」を入れます。
 +
 +while文では、countを宣言した時に代入した初期値は「0」でした。
 +この0が入ったcountに対し、while文の"内部"で+1の加算処理をした後に「現在XX回目の処理だよ」を表示する構造になっていました。
 +
 +一方for文では、countへの加算処理はfor文の"内部"ではなく、"for文内部の処理を終えた後"で行われます。
 +for文の内部にある、「現在XX回目の処理だよ」のメッセージを表示する処理をする前に1回目のカウントを済ませている必要があるので、初期値を「1」に設定しています。
 +  
 +  
 +次に、**二つめの式では「条件式の設定」**をしています。今回は count <= 10; です。
 +
 +ここはwhileの例では (count < 10) でした。
 +whileでは、0の状態でwhile文の内部に突入したcountが、1回目の処理を行った証として1加算されます。
 +これを繰り返し、最終的に9の状態で突入し10回目の処理を行ったcountは10になります。
 +この10を以て「既に10回処理した」判定をし、whileから脱出する処理フローになっています。
 +
 +一方、今回のforではcountの初期値は1です。理由は先述の通り、「現在XX回目の処理だよ」のメッセージ表示に対応するためです。
 +for文の内部の処理を全て終えた段階でこのcountには+1の処理がされ「2」となり、for文の先頭に戻って再度条件式の判定を受けます。
 +__つまり今回のfor文では、変数countは 「既に何回処理したか」 ではなく 「これから何回目の処理をしたいか」 を意味します。__
 +3-8と同じ要領で「<(未満)」を使ってしまうと、countが10の時に10回目の処理をすることなくfor文を終了してしまうので、「<=(以上)」を使って処理をさせています。 
 +  
 +  
 +**三つめの式は「繰り返しの判定に使う変数に加える変化」**です。
 +count++ の++は、「1加算する」を意味します (3-5の「Tips:Arduinoでの計算記号」を見てね!)
 +(count = count + 1; でも同じ結果は得られます。どちらを使ってもOKです)
 +この**「繰り返しの判定に使う変数に加える変化」は、for文の中身を処理した後に実行されます。**
 +==13行目==
 +<code>
 +Serial.println("マッシュRoom");  //モニタに文字列を表示
 +</code>
 +文字列「マッシュRoom」をシリアルモニタに表示する命令です。
 +==15~17行目==
 +<code>
 +Serial.print("現在");
 +Serial.print(count);
 +Serial.println("回目の処理だよ");
 +</code>
 +シリアルモニタに文字列「現在XX回目の処理だよ」と表示させます。
 +==20行目==
 +<code>
 +delay(1000);//1秒待機します
 +</code>
 +人間がシリアルモニタを目で追えるよう、1秒待機させます。
 +  
 +  
 +for文の最後まで来たので**__for文の先頭に戻り、条件式の判定を再度行います。__**
 +for文の中身を10回処理した後、22、23行目を実行し、そしてloop部の先頭に戻ります。
 +  
 +  
 +===== 「for」のまとめ =====
 +===for文のポイント===
 +  * whileと同じく、特定の条件が成立する時だけ同じ処理を繰り返したい時 に使われる処理
 +  * whileでは個別に処理する「繰り返しの判定に使う変数の宣言と初期値の代入」「条件式の設定」「繰り返しの判定に使う変数に加える変化」をまとめて設定する
 +  * 「繰り返しの判定に使う変数の宣言と初期値の代入」はfor文を開始する時に1度だけ実行される
 +  * 「繰り返しの判定に使う変数に加える変化」は、for文の中身を処理した後に実行される