擬似言語の for は、他の言語の for 文と少し違います。回し方が日本語で書いてあるからです。i を 2 から inの要素数 まで 1 ずつ増やす── この一文を正確に読めるかどうかで、答えが変わります。この記事では、その読み方を実際に動かしながら身につけます。
IPAが決めている for の書き方
試験本番では、問題冊子の2ページ目に「擬似言語の記述形式」というルール表が載っています。for についての説明はこれだけです。この表は2022年から変わっていませんので、覚えたことはそのまま使えます。
出典:擬似言語の記述形式(基本情報技術者試験用)
- for (制御記述) 処理 endfor
- 繰返し処理を示す。
制御記述の内容に基づいて,処理を繰返し実行する。
処理は,0 以上の文の集まりである。
ルール表には「制御記述」の中身が書かれていません。「制御記述の内容に基づいて」としか書かれておらず、i を 1 から 10 まで 1 ずつ増やす のような具体的な書き方は、記述形式ではなく問題文の中に日本語で現れます。
つまり for の解き方とは、暗記した構文に当てはめることではなく、その問題に書かれた日本語を読んで、変数がどう動くかを自分で決めることです。ここを取り違えると、見慣れない制御記述が出た瞬間に手が止まります。
制御記述の3要素
実際の出題で使われる制御記述は、ほぼ次の形です。読むときは3つの要素に分解します。
| 要素 | 該当部分の例 | 読み取ること |
|---|---|---|
| 開始値 | i を 2 から |
ループに入った瞬間の値。1から始まるとは限らない |
| 終了条件 | inの要素数 まで |
この値を含めて繰り返す。「まで」は以下の意味 |
| 増分 | 1 ずつ増やす |
1とは限らない。「2 ずつ増やす」「1 ずつ減らす」もある |
まず最小のコードで動かす
1 から 9 までの奇数を全部足す。答えは 1+3+5+7+9 です。
やることはこれだけです。あとは 「2 ずつ増やす」と書かれた i がどんな値を順にとるかを見ていきます。とくにループを抜けた直後に i がいくつになっているかに注目してください。
トレースシミュレータ ① 増分が2の繰返し
当サイトオリジナルの例題
ループ開始前
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
ループを抜けた時点で i は 11 です。9 ではありません。i が終了値を超えたからこそ繰返しが終わったのであって、最後に実行された処理のときの値と、抜けたあとの値は違います。ループの外で i を使う問題では、ここが正解と誤答を分けます。
for (i を 3 から 12 まで 3 ずつ増やす) と書かれているとき、処理は何回実行されますか。
for (i を 1 から 10 まで 2 ずつ増やす) のループを抜けた直後、i の値はいくつですか。
実際の出題ではこう出る
ここからは本物の問題です。for と配列の組合せは科目Bの中心で、この問題も「for が読めるか」だけを問うています。
出典:基本情報技術者試験 科目B サンプル問題 問3
次の記述中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1 から始まる。
関数makeNewArray は,要素数2 以上の整数型の配列を引数にとり,整数型の配列を返す関数である。関数makeNewArray をmakeNewArray({3, 2, 1, 6, 5, 4})として呼び出したとき,戻り値の配列の要素番号5 の値は となる。
〔プログラム〕
○整数型の配列: makeNewArray(整数型の配列: in)
整数型の配列: out ← {} // 要素数0の配列
整数型: i, tail
outの末尾 に in[1]の値 を追加する
for (i を 2 から inの要素数 まで 1 ずつ増やす)
tail ← out[outの要素数]
outの末尾 に (tail + in[i]) の結果を追加する
endfor
return out
解答群
ア 5イ 6ウ 9エ 11オ 12カ 17キ 21
答えだけ先に見る
正解は カ(17)。戻り値の配列は {3, 5, 6, 12, 17, 21} になります。その作られ方を、このあと1行ずつ追います。
追いかける前に ─ この関数は何をする?
いきなり1行目から追うより先に、プログラムを日本語に直しておきます。やっていることは2つだけです。
① in の1番目を、そのまま out に入れる(4行目)
② そのあとは out の最後の値 + in の同じ位置の値を、out の末尾に足していく(for の中)
入れる(in)=問題文で与えられた配列
↓
出てくる(out)=この時点で決まっているのは1番目だけ
2番目から先は、for が1周するたびに1つずつ埋まっていきます。求めるのは要素番号5の値です。
追う前に、ひとつ予想してみましょう
for の1周目(i が 2 のとき)、out の末尾に足されるのはいくつですか。
あとは同じ計算の繰返しですが、頭の中だけで追うと必ずどこかで間違えます。1行ずつ動かして確かめます。
トレースシミュレータ ② makeNewArray
出典:科目B サンプル問題 問3
ループ開始前
配列
いま計算していること
変数の状態
戻り値
トレース表(進めると1行ずつ積み上がります)
最後まで進めると out は {3, 5, 6, 12, 17, 21} になります。要素番号5の値は 17 なので、正解は カ。
なお キ 21 は「最後の要素」を答えてしまった人向けの選択肢、オ 12 は要素番号を1つずらした人向けの選択肢です。誤答の選択肢は、トレースのどこで間違えたかに対応して作られています。選択肢を見て「自分はどこで間違えたのか」を確かめる癖をつけてください。
実際の試験には、次のような for も出ます。orders が6個の要素をもつ配列のとき、この for は何回繰り返しますか。
for (order に orders の要素を順に代入する)
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
| 「まで」を「未満」と読む | 6 まで は 6を含む。i は 6 のときも処理が実行される |
ループを抜けた i の値を間違える |
終了値を超えたときに抜ける。抜けた直後の i は終了値より大きい |
| 配列の要素番号を0から数える | 擬似言語は1から。問題文にも毎回「要素番号は1から始まる」と書かれる |
| 増分を1だと決めつける | 2 ずつ増やす/1 ずつ減らすもある。制御記述の日本語を必ず読む |
for の構文を暗記しようとする |
ルール表に制御記述の中身は無い。その場で読んで解釈するのが正しい |
次に読む
この記事は「擬似言語の教科書」第1部の第6回です。第1部は全12回で、擬似言語の記述形式に出てくる要素を1つずつ扱います。
本記事で引用した問題の出典:基本情報技術者試験 科目B サンプル問題 問3/令和6年度 基本情報技術者試験 科目B 公開問題 問5(独立行政法人情報処理推進機構)。擬似言語の記述形式は各年度の科目B問題冊子より引用。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。シミュレータ①で使用した例題は当サイトのオリジナルです。

