ここからアルゴリズムの中身に入ります。1本目は配列を全部見ることです。地味に見えますが、科目Bでいちばん出るのはこれです。公開されている44問のうち、配列を扱う問題は21問あります。
第2部 定番処理の型 全26回
A1-1トレース表の書き方A1-2繰返しのトレースA1-3配列のトレースA2-1配列を全部見るA2-2最大・最小を見つけるA2-3探す(線形探索)A2-4入れる・消すA3-12次元配列の走査A3-22次元配列の集計A4-1文字列を1文字ずつA4-2文字列照合A5-1交換して並べるA5-2挿入ソートA6分割して並べるA7-12分探索A7-2ハッシュ表探索A8-1再帰とはA8-2再帰のトレースA9スタックとキューA10-1リストを読むA10-2リストの挿入と削除A11木構造A12木の巡回A13グラフA14AI・データを題材にしたプログラムA15ファイル処理
まず、通しで見る
1分20秒ほどの動画です(音声つき)。なぜ配列を読むのに for を使うのかが、前半で分かります。書き並べた3行を見比べると、変わっているのが番号だけだと目で確かめられるからです。後半は、その形が実際に回って合計が育つところ。ここが分かると、科目Bの配列問題の多くが同じ形として読めます。
動画の後半で回すのは、このプログラムです。
整数型の配列: ten ← {80, 65, 90}
整数型: goukei ← 0
整数型: i
for (i を 1 から tenの要素数 まで 1 ずつ増やす)
goukei ← goukei + ten[i]
endfor
goukeiの値 を出力する
出力は 235 です。3人の点数を全部足した合計です。
配列を全部見る(1分40秒・音声つき)
再生できないときは、この下の図と説明で同じ内容を追えます。
ここから、同じ内容を1つずつ確かめていきます。
全部見るとは、番号を1つずつ変えて読むこと
配列から値を取り出すときは、何番目かを [ ] の中に書きます(G4-2)。3つ入った配列なら、こう書けば全部読めます。
整数型の配列: ten ← {80, 65, 90}
ten[1]の値 を出力する
ten[2]の値 を出力する
ten[3]の値 を出力する
出力は 80、65、90 です。3つならこれで足ります。
ただ、この3行をよく見ると、変わっているのは [ ] の中の番号だけです。1、2、3。ほかはまったく同じ行です。
そこで、その番号のところを変数にします。i という箱に番号を入れておいて、ten[i] と書く。i が 1 なら ten[1]、2 なら ten[2] を指します(A1-3 で表に書いたのが、この動きです)。
書き並べた3行が、for の1行になる
整数型の配列: ten ← {80, 65, 90}
3つなら、こう書けば全部読める
ten[1]の値 を出力する ten[2]の値 を出力する ten[3]の値 を出力する
ちがうのは [ ] の中の番号だけ。ほかはまったく同じ行
その番号を変数 i にする
ten[i]の値 を出力する
i が 1 なら ten[1]、2 なら ten[2] を指す
あとは i を 1、2、3 と変えながらくり返す
for (i を 1 から tenの要素数 まで 1 ずつ増やす) ten[i]の値 を出力する endfor
要素が100個でも、この形のまま
あとは i を 1、2、3 と変えながら、同じ1行をくり返すだけです。それをやるのが for です。
for のかっこの中を、1つずつ読む
整数型の配列: ten ← {80, 65, 90}
整数型: i
for (i を 1 から tenの要素数 まで 1 ずつ増やす)
ten[i]の値 を出力する
endfor
さきほどの3行と、出力はまったく同じです。かっこの中は4つの部分でできています。
| かっこの中 | 何を決めているか |
|---|---|
i を |
番号を入れておく変数の名前。この名前を、そのまま [ ] の中に書く |
1 から |
最初の番号。擬似言語の配列は1番目から始まるので、たいてい 1 |
tenの要素数 まで |
最後の番号。ten の中身が3個なら 3、100個なら 100 が入る |
1 ずつ増やす |
1周おわるごとに i が 1 増える。だから指す箱が1つ進む |
endfor は「ここまでが1周ぶん」という印です。for と endfor にはさまれた行が、i を変えながら何度も実行されます。i が tenの要素数 を超えたら、くり返しは終わります。
ここを 1 から 3 まで と直接書いても、この配列なら同じ動きをします。ただし要素が4つに増えたとき、4つ目が読まれません。
問題文のプログラムも、ほぼ必ず 〜の要素数 と書かれています。配列の長さがいくつでも動くようにするためです。
取り出した値を、1つの箱に足し込む
1つずつ読めるようになったら、次は取り出した値をどうするかです。合計を出すなら、答えを入れる箱を1つ用意して、そこへ足していきます。
整数型の配列: ten ← {80, 65, 90}
整数型: goukei ← 0
整数型: i
for (i を 1 から tenの要素数 まで 1 ずつ増やす)
goukei ← goukei + ten[i]
endfor
goukeiの値 を出力する
goukei ← goukei + ten[i] は「いまの goukei に ten[i] を足したものを、あらためて goukei に入れる」という意味です(G2-3)。goukei は 80 → 145 → 235 と育ち、出力は 235 になります。
整数型: goukei ← 0 は for の外にあります。中に書くと毎周 0 に戻り、最後の1つぶんしか残りません。
← 0 のほうも落としやすいところです。宣言しただけの箱には、まだ何も入っていません(未定義の値)。足す相手が無いので、1周目で行き詰まります。
足し込む箱は、0 から始める
整数型: goukei ← 0 は for の外。中に書くと毎周 0 に戻る
正しい ── はじめに 0 を入れた
| 周 | ten[i] | goukei |
|---|---|---|
| はじめ | ー | 0 |
| 1周 | 80 | 80 |
| 2周 | 65 | 145 |
| 3周 | 90 | 235 |
誤り ── 0 を入れ忘れた
| 周 | ten[i] | goukei |
|---|---|---|
| はじめ | ー | 未定義 |
| 1周 | 80 | ? |
| 2周 | 65 | ? |
| 3周 | 90 | ? |
未定義の値には足せない。1周目で行き詰まる
答えを入れる箱は、必ず先に 0 を入れる
整数型: goukei ← □ の形で、初期値が問われることがあります。
迷ったら1周目を書いてみるのがいちばん早いです。1周目で正しい答えになる値が、入れるべき初期値です。
合計と個数のちがいは、足すものだけ
「何個あるか数える」も、いま作った形のままです。足す行だけが変わります。
変わるのは1行だけ
合計goukei ← goukei + ten[i]取り出した値を足す
個数kosuu ← kosuu + 1いつも 1 を足す
数えるときは、中身を見ません。1周まわった=1個あったなので、足すのはいつも 1 です。
条件に合うものだけ数える
「60点以上の人が何人いるか」も、同じ形です。くり返しの中に if を1つ足すだけです。
整数型の配列: ten ← {80, 65, 90, 52}
整数型: kosuu ← 0
整数型: i
for (i を 1 から tenの要素数 まで 1 ずつ増やす)
if (ten[i] ≧ 60)
kosuu ← kosuu + 1
endif
endfor
kosuuの値 を出力する
「全部見て、数える」を1行ずつ動かす
当サイトオリジナルの例題
ループ開始前
配列
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
出力は 3 です。80・65・90 の3人が 60 以上で、52 だけが外れます。
kosuu ← kosuu + 1 は if と endif のあいだにあります。
endif の下に書くと、条件に関わらず毎周1を足すことになり、要素数がそのまま出てきます。
配列が2本あっても、番号がそろっていれば for は1本
名前の配列と点数の配列があって、2番目どうしが同じ人だとします。試験でよく出る形です。
番号がそろっていれば、for は1本でいい
文字列型の配列: namae / 整数型の配列: ten
i = 2 のとき、2本とも2番目を読む
1田中
2鈴木▲
3佐藤
180
265▲
390
2番目どうしが同じ人、と問題文に書いてある形。番号がそろっている
要素数が同じで、同じ番号が同じものを指すなら、目印は 1 つで足りる
このとき、くり返しは1本で足ります。i を1つ用意して、両方から [i] を取り出すだけです。
文字列型の配列: namae ← {"田中", "鈴木", "佐藤"}
整数型の配列: ten ← {80, 65, 90}
整数型: i
for (i を 1 から namaeの要素数 まで 1 ずつ増やす)
namae[i]の値 と ten[i]の値 をこの順にコンマ区切りで出力する
endfor
出力は 田中,80 鈴木,65 佐藤,90 の3回です。目印が1つなので、2本がずれようがありません。
見分け方
2本の要素数が同じで、同じ番号が同じものを指すと問題文に書いてあれば、この形です。
そうでない ── 2本を先頭から見比べて、進む側だけを進める形は、目印が2つ要ります。A6「分割して並べる」の併合で扱います。
つまずきポイントまとめ
| まちがえ方 | 正しい読み方 |
|---|---|
| 番号を1つずつ書き並べようとする | [ ] の中を変数にして for で回す。変わるのは番号だけ |
| くり返しの終わりに 3 のような数を直接書く | 〜の要素数 と書く。要素が増えても最後まで読める |
| くり返しの中で答えの箱を作る | 中で作ると毎周 0 に戻る。用意するのは for の前 |
| 答えを入れる箱に 0 を入れ忘れる | 未定義の値には足せない。足し込む箱も数える箱も 0 から |
| 個数を数えるのに値を足す | 数えるときに足すのは 1 |
| 配列が2本あると、目印も2つ要ると思う | 番号がそろっていれば1つ。2つ要るのは、進む側だけを進めるとき |
次に読む
| A2-2 | 最大・最小を見つける ─ 仮の王者を置いて入れ替える |
| A1-3 | 配列のトレース ─ 欄を作る、まとめる、減らす |
| G6-2 | 配列を for で回す ─ 要素数までまわす形 |
| 目次 | 基本情報技術者試験 科目B 攻略ガイド |
この記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
本文の例題は当サイトのオリジナルです。
