みなさんはfor
文と仲良くやっていますか?私は昨日まで喧嘩ばかりしていました。あっちに行ったりこっちに行ったりと縦横無尽に駆け回るfor
文がなにを考えているのかわかりませんでした。しかし、ふと目に止まったJAVAの質問の解を自分の手でやってみようと試行錯誤していたときに一筋の光が差し込みfor
文がこう言いました。
「友達になろう」と。
for文の基本
まずはfor
文の基本をおさらいしましょう。for
文は初期化、条件、変化、実行内容の4つで構成されています。
基本
for (初期化; 条件; 変化) {
実行内容
}
- 初期化
- 変数の値を決める場所です。プログラミング初心者は初期化と聞くと0になると考えがちですが間違いです。実際はどんな値で開始するかという意味です。
for
文が開始されると最初に一度だけ実行されます。変数の型を宣言するのを忘れないでください
- 変数の値を決める場所です。プログラミング初心者は初期化と聞くと0になると考えがちですが間違いです。実際はどんな値で開始するかという意味です。
- 条件
- この条件が
false
になると終了します。つまり条件が満たされている限り実行内容が繰り返されます
- この条件が
- 変化
- 条件に書いた変数がどう変化するのかを指定します
- 実行内容
- 計算したり文字を出力したりといった内容を書きます
実演
for (int i = 0; i < 10; i++) {
System.out.println("Hello!");
}
-
int
-
int
型を宣言しています
-
-
i = 0
- 変数
i
に0
を代入します
- 変数
-
i < 10
-
i
が10
未満ならtrue
です。つまりi
が9
までのあいだは実行内容を繰り返します
-
-
i++
-
i
が1つ増えます
-
-
System.out.println("Hello!")
-
Hello!
という文字を出力します
-
動き
実演をもとに見ていきましょう。for
文が開始されると最初に動くのは初期化です。変数i
の値は0
ですね。for
文はi
は0
だと確認してから条件に移ります。条件はi < 10
です。今の時点では0 < 10
と同じです。日本語に直すと「0は10より小さい」と言えるので条件はtrue
ですね。条件がtrue
ということが確認できたので実行内容の部分が動きます。
System.out.println("Hello!")
が実行されると次は変化に移ります。変化はi++
です。今の時点では0++
なので1
になりました。この1
は実行の変数に代入するために条件に移ります。今の時点では1 < 10
です。true
ですね。というわけでまた実行内容に移ります。
この流れが何度も続くと条件のなかが10 < 10
になります。これはtrue
でしょうか?false
でしょうか?false
ですね。これでfor
文は終了です。お疲れ様でした。
流れをリスト化すると以下になります。
-
for
文開始 - 初期化
- 条件
- 実行内容
- 変化
- 条件(以下略)
- 条件が
false
ならfor
文終了
実は簡単だったfor文のネスト
for
文の基本をおさえたところで次はネストです。私はfor
文のネストをなんとなくわかったつもりになっていましたが実際に書いてみると上のfor
文と下のfor
がどういう風に絡むのかという点がわかっていませんでした。
では、九九の計算プログラムを紐解きながらネストの動きを見ていきましょう。
九九を表示するプログラム
public class MultiplicationTable {
public void multiply() {
for (int x = 1; x < 10; x++) {
for (int y = 1; y < 10; y++) {
System.out.print(x * y);
System.out.print(" ");
}
System.out.println();
}
}
}
ここから先は「上のfor
文」ではなく「外側のfor
文」、「下のfor
文」ではなく「内側のfor
文」という表現になります。では、3行目からです。int x = 1;
から実行されます。次にx < 10;
です。今回はtrue
なので実行内容に移ります。初心者は実行内容がどこなのか真っ白になるところですが下の図をご覧ください。
for
文を拡大して色分けしました。これを見るとわかるように外側のfor
文の実行内容というのは内側である青のfor
文なんです。内側のfor
文(青)の初期値のint y = 1
が実行されて条件に移ります。y < 10;
なので代入して1 < 10
です。true
なので実行内容に移ります。System.out.print(x * y)
です。x
は外側のfor
文の変数でしたね。今の時点ではx=1
です。なので、ここは1 * 1
が実行されて結果は1
です。画面に1
が表示されて次の行に移ります。System.out.print(" ")
は半角の空白が表示されます。
ここまで実行されたら次は変化に移ります。y++
なのでy
が1つ増えて2
と変化して次は条件に移ります。y < 10
なので2 < 10
となりtrue
なので、また実行内容へと移ります。System.out.print(x * y)
です。1 * 2
なので結果は2
となり画面へ表示され次の行の半角の空白も表示されて、また変化に移り以降は繰り返しです。このような動きでy
の値が9
までいくと画面には1 2 3 4 5 6 7 8 9
と表示されますね。このあとなにが起きるかを見てみましょう。
y++
でy
が10
となり条件に移ります。10 < 10
はfalse
なので内側のfor
文(青)の一番下のSystem.out.println()
が実行されて改行されます。これで内側のfor
文(青)は終了するので外側のfor
文(赤)に戻ります。ここからは繰り返しです。2 * 1
から始まり2 * 9
までいけば改行で3 * 1
が実行されます。では実際の実行結果を見てみましょう。
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
これがfor
文のネストを利用した九九のプログラムの動きです。紐解くと簡単ですね。これを応用して冒頭ではなしたとある質問を作ってみました。その結果がこちらです。
■
■■
■■■
■■■■
■■■■■
■■■■■■
■■■■■■■
■■■■■■■■
■■■■■■■■■
■■■■■■■■■■
■■■■■■■■■■
■■■■■■■■■
■■■■■■■■
■■■■■■■
■■■■■■
■■■■■
■■■■
■■■
■■
■
これはなにをやっているかというとfor
文を使って■
の数を1行ごとに増やして三角形を表現したんです。1つずつ増える形と1つずつ減る形を作り上下を合わせたものを表示しました。以下がそのプログラムです。
public class TriangleTop {
public void traiangle() {
for (int x = 0; x < 10; x++) {
for (int y = 0; y < x+1; y++) {
System.out.print("■");
}
System.out.println();
}
}
}
public class TriangleBottom {
public void traiangleReverse() {
for (int x = 0; x < 10; x++) {
for (int y = 10; y > x; y--) {
System.out.print("■");
}
System.out.println();
}
}
}
ここまで読んだみなさんなら、もう解説しなくとも紐解けますね。
あとがき
プログラミング初心者にとってfor
文のネストの動きをすぐに理解するのは難しいです。見るだけではなく、まずは自分の手で試行錯誤するのをおすすめします。今回作った三角形を左側に反転させたものを作りたくなり四角形に挑戦したのですが半角の空白を連続で表示することができずに断念しました。いつかfor
文で簡単な絵を描いてみたいです。
あと、Qiitaはこういう内容の投稿でいいのでしょうか?