同じ処理を何度も実行したいとき、その回数だけ書き並べるのは大変です。「何回、どう変えながら繰り返すか」を1行で書くのが for です。そしてその1行は、日本語で書かれています。i を 1 から 5 まで 1 ずつ増やす ── この一文から何回まわるかと変数がどんな値をとるかを読み取れれば、for は読めたことになります。
第1部 擬似言語の教科書 地図+20回
G1擬似言語の地図(入口)G2-1変数と宣言G2-2データ型G2-3代入「←」G3-1部品を呼ぶ/戻るG3-2引数G3-3戻り値・手続と関数G4-1配列と要素番号G4-2配列の読み書きG5選択処理 ifG6-1繰返し forG6-2配列を for で回すG7繰返し whileG8-1算術演算子と優先順位G8-2and / or / notG9-12次元配列G9-22重ループG10大域変数と局所変数G11未定義G12-1演算子 . の読み方G12-2クラスとはG12-3コンストラクタ
繰返し ── 同じことを、書き並べずに済ませる
1 から 5 までを順に出力したい、とします。習ったことだけで書くと、こうなります。
1 を出力する 2 を出力する 3 を出力する 4 を出力する 5 を出力する
5 までなら書けますが、100 までとなると手に負えません。変わっているのは数字だけなので、その数字を変えながら1行を繰り返すと書けば済みます。それが for です。
整数型: i for (i を 1 から 5 まで 1 ずつ増やす) i を出力する endfor
出力は 1、2、3、4、5。5行が3行になりました。中の i を出力する は1回しか書かれていないのに、5回実行されます。
for の1周で起きること
① for の行制御記述にしたがって i の値を決める
② 中の処理for と endfor にはさまれた行を、上から実行する
③ endforfor の行に戻る。①へ
この①②③をぐるぐる回り、①で決めた値が範囲から外れたときに endfor の下へ抜けます。
for と endfor の間の行は、1段下げて書かれます。どこまでが繰り返される範囲かは、この字下げと endfor の位置で決まります。
次のプログラムを実行すると、何が出力されますか。
整数型: i for (i を 1 から 3 まで 1 ずつ増やす) "*" を出力する endfor
制御記述 ── 回し方は、日本語で書いてある
擬似言語の書き方は、IPAが「擬似言語の記述形式」という表にまとめています。for についての説明は、そのなかのこれだけです。この表は2022年から変わっていませんので、覚えたことはそのまま使えます。
出典:IPA「擬似言語の記述形式」
- for (制御記述) 処理 endfor
- 繰返し処理を示す。
制御記述の内容に基づいて,処理を繰返し実行する。
処理は,0 以上の文の集まりである。
ルール表には「制御記述」の中身が書かれていません。「制御記述の内容に基づいて」としか書かれておらず、i を 1 から 10 まで 1 ずつ増やす のような具体的な書き方は、記述形式ではなく問題文の中に日本語で現れます。
つまり for の解き方とは、暗記した構文に当てはめることではなく、その問題に書かれた日本語を読んで、変数がどう動くかを自分で決めることです。ここを取り違えると、見慣れない制御記述が出た瞬間に手が止まります。
とはいえ、読み取るものは決まっています。3つだけです。さっきの i を 1 から 5 まで 1 ずつ増やす で1つずつ確かめます。
1つ目は開始値。1 から の部分です。ループに入った瞬間の i がこの値になります。1から始まるとは限りません。
for (i を 2 から 5 まで 1 ずつ増やす)
こう書かれていれば、i は 2、3、4、5。1回目の i がすでに 2 です。
2つ目は終了値。5 まで の部分です。ここで大事なのは、「まで」はその値を含むということ。「5 未満」ではありません。
for (i を 1 から 5 まで 1 ずつ増やす)
i が 5 のときの処理も実行されます。5回まわって、6 になったところで抜けます。
3つ目は増分。1 ずつ増やす の部分です。1とは限りません。
for (i を 1 から 9 まで 2 ずつ増やす) for (i を 10 から 1 まで 3 ずつ減らす)
上は i が 1、3、5、7、9。下は 10、7、4、1 と減っていきます。「減らす」と書かれていたら、終了値は下限になります。
制御記述は、3つの部分に分けて読む
増分は 1 とは限らない。3つとも必ず書いてある
for (i を 1 から 9 まで 2 ずつ増やす)
| 読む場所 | そこにある値 | 意味 |
|---|---|---|
| 「から」の前 | 1 | 開始値。ここから始まる |
| 「まで」の前 | 9 | 終了値。この値を含む |
| 「ずつ」の前 | 2 | 増分。増やすか減らすかも一緒に見る |
i は 1、3、5、7、9 と進む
減らす向きなら、終了値は下限
for (i を 10 から 1 まで 3 ずつ減らす)
i は 10、7、4、1 と減っていく
開始値・終了値・増分。この3つだけ読めば、回る値が決まる
制御記述を読む手順
- 「から」の前を見る ── これが開始値
- 「まで」の前を見る ── これが終了値。この値を含む
- 「ずつ」の前と、増やすか減らすかを見る ── これが増分
- 開始値から順に、増分を足した値を書き並べる。終了値を外れたところで止める
この4番目を省いて頭の中で数えると、必ずどこかでずれます。値の並びは、書き出してしまうのが速い。試験はCBT(画面上での受験)ですが、手元に書き出せるものは使えます。
ここまでの3つを、1つの表にまとめておきます。読み返すときは、ここだけ見れば足ります。
| 要素 | 該当部分の例 | 読み取ること |
|---|---|---|
| 開始値 | i を 2 から |
ループに入った瞬間の値。1から始まるとは限らない |
| 終了値 | inの要素数 まで |
この値を含めて繰り返す。「まで」は以下の意味 |
| 増分 | 1 ずつ増やす |
1とは限らない。「2 ずつ増やす」「1 ずつ減らす」もある |
for (i を 3 から 12 まで 3 ずつ増やす) と書かれているとき、処理は何回実行されますか。
終了値ちょうどで止まるとは限らない
「まで」はその値を含む ── ただしそれは、i がその値になったらの話です。増分によっては、終了値を踏まずに飛び越えます。
for (i を 1 から 6 まで 2 ずつ増やす)
i は 1、3、5。次は 7 で、6 を超えるので終わりです。6 は一度も使われません。「6 まで」と書いてあっても、6 で処理が動くとは限らないわけです。
終了値は止める位置を決める線であって、最後に処理される値そのものではありません。
だから .tech の4番目 ── 値を書き並べる ── が効きます。並べてしまえば、終了値を踏むかどうかも、回数も、ひと目で分かります。
for (i を 1 から 6 まで 2 ずつ増やす) のとき、処理は何回実行されますか。
抜けた直後の i ── 最後に使った値ではない
繰返しが終わったあと、i はいくつになっているでしょうか。最後に処理したときの値だと思うと、間違えます。
for (i を 1 から 9 まで 2 ずつ増やす) で考えます。i は 1、3、5、7、9 と進み、9 のときの処理まで実行されます。そのあと endfor から for の行へ戻り、2 を足して 11 になり、9 を超えたので抜けます。
抜けたあとの i は、終了値を外れている
「抜けたときの i」を、最後に処理した値だと思うと間違える
for (i を 1 から 9 まで 2 ずつ増やす) で追う
1
3
5
7
9
11
色のついた 9 が最後に処理した値。そのあと 2 を足して 11 になり、9 を超えたので抜ける
範囲から外れたと分かるのは、外れた値を実際に作ってみたあとだから
なぜ終了値より大きくなるのか
「範囲から外れた」と分かるのは、外れた値を実際に作ってみたあとだからです。
だから抜けたときの i は、必ず終了値を外れた側にいます。減らす向きなら、終了値より小さい値です。
1 から 9 までの奇数を全部足す。答えは 1+3+5+7+9 です。
やることはこれだけです。「2 ずつ増やす」と書かれた i がどんな値を順にとるかと、ループを抜けた直後に i がいくつになっているかを見てください。
トレースシミュレータ 増分が2の繰返し
当サイトオリジナルの例題
ループ開始前
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
ループを抜けた時点で i は 11 です。9 ではありません。最後に実行された処理のときの値と、抜けたあとの値は違います。
ループの外で i を使う問題では、ここが直接得点になります。「抜けた直後の値を聞かれたら、1歩ぶん進める」と覚えてください。
次の for は何回繰り返しますか。ずつ減らす と書いてあるときは、始まりの値からその数ずつ引きながら、終わりの値を下回るまで繰り返します。
for (i を 10 から 1 まで 3 ずつ減らす) 処理 endfor
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
| 「まで」を「未満」と読む | 6 まで は 6を含む。i が 6 になれば処理も実行される |
| 終了値で必ず止まると思う | 増分しだいで踏まずに飛び越える。1 から 6 まで 2 ずつは 1, 3, 5 |
ループを抜けた i の値を間違える |
範囲を外れた値まで進んでから抜ける。抜けた直後は終了値の外側 |
| 増分を1だと決めつける | 2 ずつ増やす/1 ずつ減らすもある。制御記述の日本語を必ず読む |
| 終了値をそのまま回数だと思う | 回数は値を書き並べた個数。開始値が 1 でなければ一致しない |
for の構文を暗記しようとする |
ルール表に制御記述の中身は無い。その場で読んで解釈するのが正しい |
次に読む
この記事で引用した資料
- 擬似言語の記述形式 科目Bの公開問題・サンプル問題の各冊子に掲載。冊子上の名称は年度により「基本情報技術者試験用」と「基本情報技術者試験,応用情報技術者試験用」があるが、本文は同一
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
シミュレータで使用した例題は当サイトのオリジナルです。

