みなさんは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はこういう内容の投稿でいいのでしょうか?
