前回はwhile文による繰り返し処理を扱った。今回は、繰り返し回数があらかじめ決まっている場合によく使われる for文 を扱う。
for文の基本構文
for (変数 を 初期値 から 終了値 まで 増分 ずつ増やす)
処理
endforfor文は、ループ変数の初期化・条件判定・更新をまとめて1行で表現できる構文である。前回のwhile文で書いた「1からnまでの合計」を、for文で書き直すと次のようになる。
○整数型: goukei(整数型: n)
整数型: i, sum
sum を 0 とする
for (i を 1 から n まで 1 ずつ増やす)
sum を sum + i とする
endfor
return sumwhile文の例と比較すると、i の初期化(i を 1 とする)と更新(i を i + 1 とする)が、for (i を 1 から n まで 1 ずつ増やす) という1行にまとめられていることが分かる。for文はこのように、カウンタ変数を使った定型的な繰り返しを簡潔に表現するために使われる。
for文の実行順序
for文の実行順序は、実質的に次のようなwhile文と同じである。
i を 1 とする
while (i が n 以下)
処理
i を i + 1 とする
endwhileすなわち、次の順番で実行される。
- ループ変数を初期値に設定する
- 終了条件を満たしているか確認する(満たしていなければループ終了)
- 内側の処理を実行する
- ループ変数を増分だけ更新する
- 2に戻る
増分を変えたパターン
「1ずつ増やす」だけでなく、増分を変えたり、減らしたりするパターンも出題される。
/* 2ずつ増やす(偶数のみを合計する) */
for (i を 2 から n まで 2 ずつ増やす)
sum を sum + i とする
endfor/* nから1まで、1ずつ減らす(降順) */
for (i を n から 1 まで 1 ずつ減らす)
sum を sum + i とする
endfor増分・減分の指定によってループの回数や処理される値の並びが変わるため、トレース問題ではループ変数がどのような順序でどのような値を取るかを1つずつ書き出して確認することが重要である。
for文のネスト(二重ループ)
for文の内側に別のfor文を書く「二重ループ(ネスト)」も頻出パターンである。九九の表を作るような処理を考える。
○手続き: kuku()
整数型: i, j
for (i を 1 から 9 まで 1 ずつ増やす)
for (j を 1 から 9 まで 1 ずつ増やす)
出力する(i * j)
endfor
endfor外側のループ(i)が1回進むごとに、内側のループ(j)が1から9まで丸ごと実行される。つまり、内側の処理は合計で 9 × 9 = 81 回実行されることになる。二重ループの問題では、外側のループ変数が1つ進むたびに、内側のループが最初から最後まで繰り返されるという感覚を持っておくことが、処理回数や出力結果を求める際の基本になる。
配列とfor文の組み合わせ
for文は配列の各要素に順にアクセスする処理でも頻繁に使われる。
○整数型: saidai(整数型の配列: data)
整数型: i, max
max を data[1] とする
for (i を 2 から data の要素数 まで 1 ずつ増やす)
if (data[i] が max より大きい)
max を data[i] とする
endif
endfor
return maxこの処理は、配列dataの中から最大値を求めるものである。maxを配列の先頭要素(data[1])で初期化し、2番目の要素(添字2)から最後の要素まで順に比較していくという流れになる。
添字が1から始まることと、forの開始位置が2(つまり2番目の要素)から始まっている理由(すでにdata[1]をmaxの初期値として使っているため)を合わせて理解しておく必要がある。
学習のポイント
- for文は「初期化・条件判定・更新」を1行にまとめた繰り返し構文であることを理解する
- 増分・減分の指定(何ずつ増やす/減らすか)によって、ループの回数や値の並びが変わることに注意する
- 二重ループでは、外側が1回進むごとに内側が丸ごと繰り返されるという構造を意識する
- 配列と組み合わせる場合は、要素番号の範囲(1から要素数まで)を正確に把握する
まとめ
for文は、繰り返し回数があらかじめ決まっている処理を簡潔に表現するための構文であり、内部的にはwhile文と同じ仕組みで動いている。増分の指定や二重ループ、配列との組み合わせなど、応用パターンを含めて出題されることが多いため、それぞれのパターンを一度自分の手でトレースしておくことが重要である。次回は、処理をひとまとまりにする「関数(手続き)」の考え方を扱う。



コメント