前回で、表を全部通る形が分かりました。今回は行ごと・列ごとにまとめる回です。ループの順と、0 を入れる場所だけで決まります。
第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ファイル処理
まず、通しで見る
5分ほどの動画です(音声つき)。同じ表でも、たてに足すか、よこに足すかで答えが変わるところを、1周ずつ動かして見せます。
たてに合計する場合も、配列を出して1マスずつ動かします。最後は、この回でいちばん問われる goukei ← 0 の位置です。外に出した形を実際に動かし、0 に戻らないまま 210 まで積み上がるところまで見せます。
0 を入れる場所で決まる(5分29秒・音声つき)
再生できないときは、この下の図とシミュレータで同じ内容を追えます。
ここから、同じ内容を1つずつ確かめていきます。
行ごとの合計 ── 外が行、内が列
各行の合計を出します。1行目を左から右へ足し終えたら、次の行へ移ります。
行ごとの合計 ── 外が行、内が列
外側が行、内側が列。出力は 60 と 150 の2つ
1行目を、左から右へ足す
| 1 | 2 | 3 | |
|---|---|---|---|
| 1 | 10 |
20 |
30 |
| 2 | 40 |
50 |
60 |
10 + 20 + 30 で 60。ここで1つ出力する
つぎに2行目を、左から右へ足す
| 1 | 2 | 3 | |
|---|---|---|---|
| 1 | 10 |
20 |
30 |
| 2 | 40 |
50 |
60 |
40 + 50 + 60 で 150
「行ごと」なので、行が変わるたびに goukei を 0 に戻す
整数型の二次元配列: hyou ← {{10, 20, 30}, {40, 50, 60}}
整数型: r, c, goukei
for (r を 1 から hyouの行数 まで 1 ずつ増やす)
goukei ← 0
for (c を 1 から hyouの列数 まで 1 ずつ増やす)
goukei ← goukei + hyou[r, c]
endfor
goukeiの値 を出力する
endfor
行ごとの集計を1行ずつ動かす
当サイトオリジナルの例題
ループ開始前
配列
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
出力は 60、150 です。1行目の 10 + 20 + 30 と、2行目の 40 + 50 + 60 が、1行ぶんずつ出てきます。
内側を1周まわし終えたときが、その行の合計
だから 合計を使うのは、内側の endfor の下です。内側の中で使うと、途中の値になります。
答えをあとで全部使うなら、行の数だけの配列に入れます。gyouKei[r] ← goukei のように、行番号をそのまま添字にできます。
列ごとの合計 ── 外と内を入れ替えるだけ
縦に足したいときは、外側を列にします。
列ごとの合計 ── 外と内を入れ替えるだけ
外側が列、内側が行。出力は 50・70・90 の3つ
1列目を、上から下へ足す
| 1 | 2 | 3 | |
|---|---|---|---|
| 1 | 10 |
20 |
30 |
| 2 | 40 |
50 |
60 |
10 + 40 で 50
2列目、3列目も同じように
| 1 | 2 | 3 | |
|---|---|---|---|
| 1 | 10 |
20 |
30 |
| 2 | 40 |
50 |
60 |
20 + 50 で 70、30 + 60 で 90
プログラムで変えるのは、外側と内側の for を入れ替えるところだけ
整数型の二次元配列: hyou ← {{10, 20, 30}, {40, 50, 60}}
整数型: r, c, goukei
for (c を 1 から hyouの列数 まで 1 ずつ増やす)
goukei ← 0
for (r を 1 から hyouの行数 まで 1 ずつ増やす)
goukei ← goukei + hyou[r, c]
endfor
goukeiの値 を出力する
endfor
出力は 50、70、90 です。表は同じでも、縦に足したので3つ出てきます。1列目の 10 + 40、2列目の 20 + 50、3列目の 30 + 60 です。
ループを入れ替えても、hyou[r, c] の書き方はそのままです。行が先、列があとは変わりません。
入れ替わるのは for の並び順だけです。ここを一緒に入れ替えてしまうのが、よくある誤りです。
0 を入れる場所で、何ごとの集計かが決まる
ここが、この回でいちばん問われるところです。
0 を入れる場所で、何ごとの集計かが決まる
置く場所が1行ちがうだけで、答えの意味が変わる
行ごとに集計する ── 外側の中に置く
for (r を 1 から hyouの行数 まで …) goukei ← 0 for (c を 1 から hyouの列数 まで …)
行が変わるたびに 0 に戻す。だから行ごとの合計になる
全部の合計を出す ── 外側の外に置く
goukei ← 0 for (r を 1 から hyouの行数 まで …) for (c を 1 から hyouの列数 まで …)
一度も戻さないので、最後まで足し続ける
試験では、この1行の位置が空欄になる
見分け方は1つだけ
外側の中外側が1周するたびに 0 に戻る → 行ごと(列ごと)の集計
外側の外一度しか 0 にならない → 表全体の集計
試験では、goukei ← 0 の行がどこにあるかを見るだけで、何を求めているかが分かります。プログラム全体を読む前に、この1行の位置を確かめてください。
goukei ← □ の初期値だけでなく、この行自体が空欄になることがあります。
そのときは問題文の日本語を読んでください。「各行の合計を求める」なら外側の中、「表全体の合計」なら外側の外です。
つまずきポイントまとめ
| まちがえ方 | 正しい読み方 |
|---|---|
| ループを入れ替えたら添字も入れ替える | hyou[r, c] はそのまま。行が先、列があと |
| 合計を内側の中で使う | まだ途中の値。内側の endfor の下で使う |
| 0 を外側の外に置いて行ごとを求める | 行が変わっても0 に戻らない。中に置く |
| 0 を外側の中に置いて全体を求める | 毎行消えてしまう。外に置く |
| 答えの箱を1つで済ませる | 行ごとに残すなら、行の数だけ要る |
次に読む
| A4-1 | 文字列を1文字ずつ見る ─ 文字数と i文字目の文字 |
| A3-1 | 2次元配列の走査 ─ 外側のループが読む向きを決める |
| G9-2 | 2重ループ ─ 内側と外側の回り方 |
| 目次 | 基本情報技術者試験 科目B 攻略ガイド |
この記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。
本文の例題は当サイトのオリジナルです。
