for文
7.2 for文
ループのパターンには、繰り返しの回数をあらかじめ決定できる場合と、決定できない場合の2通りがあります。
for文は、主にループする回数が「決まっている」場合に使用します。
7.2.1 for文の基本構文
for文の基本構文は下記のようになります。
基本的なfor文は、カウンタ変数と呼ばれる変数を1つ作成し、それをインクリメント、またはデクリメントすることによって、ある上限回数まで繰り返し処理を行ないます。
for文では、以下で説明する3つの式を設定します。
1. カウンタ変数の初期化
式1は、初めの1回のみ実行され、カウント変数の初期化を行います。例えば、「int i = 0」などとし、その場合は0から繰り返す処理の回数を数え始めます。
2. 繰り返し処理に入る条件
式2には、繰り返すための条件(回数)を記述します。式2は論理型を示すものでなければならず、一般には関係演算子を使った式が入ります。例えば、「i < 3」などとした場合、iが3以上の時に条件に当てはまらなくなり、繰り返し処理が終了します。
3. 繰り返し処理時の更新処理式
式3は、繰り返す処理(forブロックの中の処理)が1回終わる毎に実行される、カウンタ変数の更新処理を記述します。例えば、「i++」などと記述します。ここでは主に、カウンタ変数のインクリメントやデクリメントを行います。
これをフローチャートで表すと、図 7.2.1のようになります。
図 7.2.1 : for基本構文のフローチャート
次の節からは、for文を使わないで繰り返し処理を行った場合と、for文を使って繰り返し処理を行なった場合の違いについて、プログラムを作成しながら学習していきます。
7.2.2 for文を使用せず同一処理を繰り返すプログラム
同じメッセージを複数回表示させるプログラムをfor文を用いずに作成し、ソースコードの記述を確認します。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch7
③ 名前 :NoLoop
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ NoLoop.java
package jp.co.f1.intro.ch7; public class NoLoop { public static void main(String[] args) { System.out.println("HelloLoop!"); System.out.println("HelloLoop!"); System.out.println("HelloLoop!"); } }
実行結果
解説
7~9行目までは、全く同じ構文を3回実行しています。この同じ処理をしているところは、ループ文によってまとめることができます。次の項では、この7~9行部分をループ文に書き換えたプログラムを作成してみましょう。
7.2.3 for文を使用し同一処理を繰り返すプログラム
同じメッセージを複数回表示させるプログラムを、for文を用いて作成し、先ほど作成したNoLoop.javaとの記述方法の違いを比較しましょう。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch7
③ 名前 :ForLoop
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ ForLoop.java
package jp.co.f1.intro.ch7; public class ForLoop { public static void main(String[] args) { for(int i = 0; i < 3; i++) { System.out.println("HelloLoop!"); } } }
実行結果
解説
7~9行目がfor文です。この部分は、前節で作成したNoLoop.javaの7~9行目と同じく「HelloLoop!」を3回出力する動作を行っています。
基本構文で説明しましたが、for文はその動作について、セミコロン( ; )で区切って3つの式を設定します。
カウンタ変数の宣言と初期化
for文に入る時に1度だけ行われる処理です。カウンタ変数iを宣言し、0で初期化します。0ではなく1からカウントしても問題ありませんが、プログラムでは0を基点とする数え方が一般的です。
繰り返し処理に入る条件
繰り返し処理が行われるのは、iが3未満の時と設定します。
繰り返し処理時の更新処理式
ここでは、繰り返し処理が1回行われる毎にインクリメントすることと設定しています。つまり、繰り返し処理が1度実行される度にiは1ずつ増えます。
以上を踏まえて、for文のひとつひとつの動きを追っていきましょう。
まず、7~9行目の動きを表で順番に説明していきます。下に示すソースコードに付けられた番号は、実際に実行される箇所の順序を表しています。プログラムが開始されると7行目以降が動作します。for文は指定した条件に合わせて繰り返し実行されるということに注意して下さい。
4回目で条件式の判定を行うと、式が満たされないのでfor文を抜けます。それ以降は処理が存在しないのでプログラムは終了します。
これまでに学習した範囲のプログラムは、同じ文が1度だけ実行されるものでした。しかし、現在学習を進めている繰り返し文を利用すると、同じ文を複数回実行することができます。
この繰り返しのプログラムをフローチャートで表すと、図 7.2.2のようになります。
図 7.2.2 : ForLoopのフローチャート
ポイントfor文は、「カウンタ変数の宣言と初期化」、「繰り返し処理に入る条件」、「繰り返し処理時の変更処理式」という3つの式を設定することで繰り返し処理の回数を指定する。
7.2.4 for文のカウンタ変数の値を出力するプログラム
for文で宣言した変数を表示するプログラムを作成し、結果を確認します。このプログラムでは、同じ処理を繰り返し、その繰り返しの回数をカウントすることができます。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch7
③ 名前 :LoopCountVariable
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ LoopCountVariable.java
package jp.co.f1.intro.ch7; public class LoopCountVariable { public static void main(String[] args) { for(int i = 1; i < 12; i++) { System.out.println("羊が" + i + "匹・・・"); } System.out.println("zzz..."); } }
実行結果
解説
このプログラムは、for文で11回printlnメソッドを実行し「羊が1匹・・・」~「羊が11匹・・・」と表示します。また、for文を抜けた後に11行目で「zzz・・・」と表示します。
7~9行目がfor文です。
7行目でこのfor文の定義を記述しています。このfor文は、int型の変数iをカウンタ変数とします。for文の内部処理が行われる条件は、「変数iの値が12より小さい時」で、変数iは内部処理が行われる毎に1ずつ増加します。変数iの初期値は1なので、内部処理は11回繰り返されます。
for文の処理の流れについては、次の表で確認して下さい。
12回目の条件式は満たされず、そこでfor文を抜けます。
for文を抜けると、次は11行目が実行され、「zzz・・・」という文字列を表示します。11行目の処理が終わると、プログラムは終了します。
図 7.2.3のフローチャートを参考にして、このプログラムの流れを追ってみて下さい。
図 7.2.3 : LoopCountVariable のフローチャート
7.2.5 変数のスコープ
for文のカウンタ変数として使っている変数iは、その有効範囲に注意する必要があります。変数は、基本的にはその変数が宣言されているブロック({ }で囲まれた範囲)の中でしか使えません。
この変数が有効な範囲のことを、変数のスコープといいます。
この例では、変数「sum」はmainメソッド内で宣言されていますので、mainメソッド内全てがスコープ(有効範囲)となります。一方、for文のカウンタ変数iは、for文のブロック内で宣言されていますので、for文のブロック内でのみ有効となります。
例えば、次のようなプログラムはコンパイルエラーになります。プログラムを作成・実行して、確認してみましょう。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch7
③ 名前 :VariableScope1
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ VariableScope1.java
package jp.co.f1.intro.ch7; public class VariableScope1 { public static void main(String[] args) { // 合計を管理する変数sumを宣言し、0で初期化 int sum = 0; for(int i = 0; i < 10; i++){ sum += i; } System.out.println("変数「i」の値は、" + i); System.out.println("変数「sum」の値は、" + sum); } }
プログラムを実行すると、上のように、エラーが発生します。これは、for文のブロック内で宣言したカウンタ変数「i」を、forブロック外(有効範囲外)で参照しようとしたためです。
続いて、次のプログラミングを作成してください。このプログラムはエラーが発生しません。先ほどのプログラムとの違いを確認しましょう。
① ソース・フォルダー :myproj_intro/src
② パッケージ :jp.co.f1.intro.ch7
③ 名前 :VariableScope2
④ 作成するメソッド・スタブの選択:public static void main(String[] args) にチェックを入れる
➢ VariableScope2.java
package jp.co.f1.intro.ch7; public class VariableScope2 { public static void main(String[] args) { // 合計を管理するための変数sumを宣言し、0で初期化 int sum = 0; // カウンタ変数の宣言 int i; for(i = 0; i < 10; i++){ sum += i; } System.out.println("変数「i」の値は、" + i); System.out.println("変数「sum」の値は、" + sum); } }
実行結果
今回のプログラムの場合は、カウンタ変数iをfor文のブロック外(mainメソッドのブロック)で宣言しているので、mainメソッド内が変数iの有効範囲となります。そのため、エラーにはならず、正常に参照することができます。
このように、変数は宣言したブロック内でしか使うことができません。変数を使う際にはスコープに気をつけましょう。