前回は for が何回まわるかを読みました。科目Bの for は、そのほとんどが配列とセットで出ます。理由は単純で、i をそのまま要素番号として使えるからです。
第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コンストラクタ
要素番号を i で動かす
3人の点数が入った配列があります。全部出力するには、こう書きます。
整数型の配列: tensuu ← {80, 65, 90}
整数型: i
for (i を 1 から 3 まで 1 ずつ増やす)
tensuu[i] を出力する
endfor
出力は 80、65、90。中の行は tensuu[i] を出力する の1行だけです。i が 1 → 2 → 3 と変わるので、1周ごとに違う箱を見ることになります。
i が変わると、見る箱も変わる
for (i を 1 から 3 まで 1 ずつ増やす) / 中の行は tensuu[i] を出力する の1行だけ
1周目 i が 1 → tensuu[1] の 80
180▲
265
390
2周目 i が 2 → tensuu[2] の 65
180
265▲
390
3周目 i が 3 → tensuu[3] の 90
180
265
390▲
「1から順に増える数」と「1から始まる要素番号」が、そのままかみ合う
なぜ配列と相性がいいのか
要素番号は 1 から連番。そして for は連番を作るしくみだからです。
要素番号が飛び飛びだったり文字だったりすれば、こうはいきません。「1から順に増える数」と「1から始まる要素番号」が、そのままかみ合っています。
次のプログラムで、3周目に出力されるのはどれですか。
文字列型の配列: kudamono ← {"りんご", "みかん", "ぶどう"}
整数型: i
for (i を 1 から 3 まで 1 ずつ増やす)
kudamono[i] を出力する
endfor
「3 まで」ではなく「要素数 まで」と書く
さっきは 1 から 3 まで と書きました。実際の出題では、ここが数字ではなく tensuuの要素数 になっています。
for (i を 1 から tensuuの要素数 まで 1 ずつ増やす)
意味は同じです。tensuu の要素数は 3 なので、読むときは頭の中で 3 に置き換えて構いません。
配列の中身が変わっても、この行を直さなくて済むからです。要素が5個に増えれば tensuuの要素数 は自動的に 5 になります。
そしてこの書き方のおかげで、問題文が配列を与えていなくてもプログラムが成り立ちます。「関数◯◯を、{3, 2, 1, 6, 5, 4} として呼び出したとき」とあとから配列が渡される形が、科目Bの定番です。
配列を回す for に出会ったときの手順
- 要素数を数える(問題文で与えられた配列の中身を数える)
- 制御記述の
◯◯の要素数を、その数に置き換えて読む iがとる値を書き並べる(1, 2, 3, …)- 各周で
配列名[i]がどの箱を指すかを、配列の絵の上で確かめる
次のプログラムで、data の要素を出力する は何回実行されますか。
整数型の配列: data ← {7}
整数型: i
for (i を 1 から dataの要素数 まで 1 ずつ増やす)
data[i] を出力する
endfor
全部足す ── 外に置いた箱に足していく
配列を回す目的は、たいてい全部の要素を使って1つの答えを出すことです。合計を求めてみます。
整数型の配列: tensuu ← {80, 65, 90}
整数型: i
整数型: goukei ← 0
for (i を 1 から tensuuの要素数 まで 1 ずつ増やす)
goukei ← goukei + tensuu[i]
endfor
goukei を出力する
大事なのは goukei の置き場所です。for の外で用意して、0 を入れています。中で用意してしまうと、1周ごとに新しく作り直されて足したものが消えます。
| 周 | i |
tensuu[i] |
計算 | そのあとの goukei |
|---|---|---|---|---|
| 開始前 | — | — | — | 0 |
| 1周 | 1 | 80 | 0 + 80 | 80 |
| 2周 | 2 | 65 | 80 + 65 | 145 |
| 3周 | 3 | 90 | 145 + 90 | 235 |
| 抜けた直後 | 4 | — | — | 235 |
この形は、そのまま何度も出てくる
外で用意する答えを入れる箱を for の前で作り、0 を入れる
中で足すgoukei ← goukei + 配列名[i] を1行書く
外で使うendfor の下で、たまった値を出力する/返す
合計だけでなく、個数を数える・最大値を探すのも同じ形です。外に箱、中で更新、外で使う。
for の中に書かれた行は、周が変わるたびに、上から順にもう一度実行されます。
次のプログラムは、合計を求めるつもりで書かれています。何が起きますか。
整数型の配列: tensuu ← {80, 65, 90}
整数型: i
for (i を 1 から tensuuの要素数 まで 1 ずつ増やす)
整数型: goukei ← 0
goukei ← goukei + tensuu[i]
endfor
もう1つの書き方 ── 要素を順に代入する
要素番号を使わずに、中身を直接受け取る書き方もあります。
整数型の配列: tensuu ← {80, 65, 90}
整数型: ten
for (ten に tensuu の要素を順に代入する)
ten を出力する
endfor
出力は同じく 80、65、90。ちがいは、ten に要素番号ではなく中身が入ることです。tensuu[ten] ではなく ten と書く点に注意してください。
要素番号が要る処理(隣どうしを比べる、番号を答えるなど)では i を回す形。中身だけ使えばいい処理では、この形が使われます。回数はどちらも要素数と同じです。
(令和6年度 基本情報技術者試験 科目B 公開問題 問5)
for (order に orders の要素を順に代入する)
形は違っても、読み方は同じです。書かれている日本語を読めば、何が何回起きるかは決まります。制御記述は暗記するものではなく、その場で読むものだという理由がここにあります。
orders が6個の要素をもつ配列のとき、次の for は何回繰り返しますか。
for (order に orders の要素を順に代入する)
読むだけでなく、別の配列を作る
もう1つの定番が、元の配列から、新しい配列を作る形です。空の配列を用意して、末尾に足していきます。
整数型の配列: tensuu ← {80, 65, 90}
整数型の配列: kasan ← {}
整数型: i
for (i を 1 から tensuuの要素数 まで 1 ずつ増やす)
kasanの末尾 に (tensuu[i] + 10) の結果を追加する
endfor
追いかける前に ─ このプログラムは何をする?
全員に10点ずつ足した、新しい配列を作るだけです。終わるとこうなります。
| 1番目 | 2番目 | 3番目 | |
|---|---|---|---|
tensuu(元) |
80 | 65 | 90 |
kasan(作る) |
90 | 75 | 100 |
元の tensuu は変わりません。読むだけで、書き換えていないからです。
kasan は要素数0から始まって、1周ごとに1つずつ増えます。シミュレータを最後まで進めると、ちょうどこの表になります。
さっきの「合計」と、形は同じ
外で用意する合計なら 0 を入れた変数、ここでは空の配列
中で足す合計なら goukei ← goukei + …、ここでは末尾に追加
外で使うendfor の下で、できあがったものを使う
入れ物が変数か配列かだけの違いです。骨組みはいつもこれ。
(基本情報技術者試験 科目B サンプル問題 問3)
outの末尾 に … を追加する
空の out に、for の中で1つずつ追加していく ── いま見たのとまったく同じ形です。追加する中身が変わるだけです。
1行ずつ動かして確かめます。kasan が1つずつ伸びていくところを見てください。
元の配列から、新しい配列を作る
当サイトオリジナルの例題
ループ開始前
配列
いま計算していること
変数の状態
できあがった配列
トレース表(進めると1行ずつ積み上がります)
つまずきポイントまとめ
| まちがえ方 | 正しい理解 |
|---|---|
tensuu[i] の i のほうを出力してしまう |
[ ] の中は何番目か、付けた全体はその中身 |
| 要素番号を 0 から回す | 擬似言語の要素番号は1から。1 から 要素数 までが定型 |
答えを入れる箱を for の中で作る |
1周ごとに作り直されて消える。箱は外で用意する |
| 要素数と、中身の値を取り違える | 要素数は箱がいくつあるか。中の数字とは関係ない |
| 「要素を順に代入する」で番号を使う | 変数に中身が直接入る。[ ] を付けない |
次に読む
この記事で引用した資料
- 擬似言語の記述形式 科目Bの公開問題・サンプル問題の各冊子に掲載。冊子上の名称は年度により「基本情報技術者試験用」と「基本情報技術者試験,応用情報技術者試験用」があるが、本文は同一
- 基本情報技術者試験 科目B サンプル問題(2022年12月26日公開)
- 令和6年度 基本情報技術者試験 科目B 公開問題(2024年7月5日公開)
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
本文の例題は当サイトのオリジナルです。

