令和7年度の科目B、その5問目です。空欄はプログラムの中ではなく、表の中にあります。求めるのは数字2つ。result[r, c] という二次元配列がはじめて出てきますが、やることは掛けて割るだけです。難しいのは計算ではなく、「理論度数」という聞き慣れない言葉のほうなので、そこから始めます。
出題
まず原文のまま読んでみてください。記号の読み方は次の節にまとめてありますので、読めなくてもここでは問題ありません。
出典:令和7年度 基本情報技術者試験 科目B 公開問題 問5
次の記述中の a と b に入れる正しい答えの組合せを,解答群の中から選べ。ここで,配列の要素番号は1 から始まる。
予防接種の病気X に対する予防効果を調査するために集めたデータの集計結果を基に,病気X にかかるかどうかが,予防接種の有無に影響されないと仮定した場合の人数を計算する。この人数を理論度数という。表1 に集計結果の例を示し,表2 に表1 を基に計算した理論度数を示す。
関数f は,引数data で受け取った集計結果を基に計算した理論度数を返す。引数と戻り値は二次元配列で,その行が表の行,その列が表の列に対応する。
表1 集計結果の例
単位 人
| 病気X にかからなかった | 病気X にかかった | |
|---|---|---|
| 予防接種を受けた | 82 | 6 |
| 予防接種を受けていない | 58 | 8 |
表2 表1 を基に計算した理論度数
単位 人
| 病気X にかからなかった | 病気X にかかった | |
|---|---|---|
| 予防接種を受けた | a | |
| 予防接種を受けていない | b |
注記 網掛けの部分は表示していない。
〔プログラム〕
○実数型の二次元配列: f(実数型の二次元配列: data)
実数型: t ← dataの要素の和
整数型: row ← dataの行数
整数型: col ← dataの列数
実数型の二次元配列: result ← {row行col列の 未定義の値}
整数型: r, c
for (r を 1 から row まで 1 ずつ増やす)
for (c を 1 から col まで 1 ずつ増やす)
result[r, c] ← (dataの行番号rの要素の和) ×
(dataの列番号cの要素の和) ÷ t
endfor
endfor
return result
解答群
| a | b | |
|---|---|---|
| ア | 44 | 33 |
| イ | 58 | 8 |
| ウ | 70 | 7 |
| エ | 75 | 2 |
| オ | 80 | 6 |
| カ | 80 | 8 |
| キ | 82 | 6 |
※ 表2で灰色の斜線が入っているマスが「網掛け」=問題が値を伏せているところです。a b と合わせて、表2は4マスとも数が見えていません。
答えだけ先に見る
正解は オ。ただし、この記事は解答群を見ずに数字を出す順で進みます。先に答えまで見てしまうと、組み立てをなぞるだけになります。
この問題に出てくる記号と言葉
読めない記号があったときだけ開いてください。先に全部読む必要はありません。
擬似言語の記号 10コ の読み方をひらく
| 書き方 | 読み方 |
|---|---|
○実数型の二次元配列:f(実数型の二次元配列: data)return ◯ |
○ はここから関数が1つ始まるという印。関数=ひとまとまりの処理につけた名前です。○ のうしろが返すものの型、括弧の中が受け取るものの型と名前(これを引数といいます)。return ◯ で ◯ を返して、その関数はそこで終わります。返したものを「戻り値」といいます |
二次元配列 |
表そのものだと思ってください。ふつうの配列は枡が1列に並んだものですが、二次元配列は縦横に並んだものです。この問題では2行2列=4マス |
result[r, c] |
二次元配列 result の r 行目・c 列目のマス。行が先、列があとです。result[2, 1] なら「2行目の1列目」。この試験では 1 から数えます(0 からではありません) |
実数型 |
その箱に何を入れるかの決まり。整数型 が整数だけなのに対し、実数型 は小数もそのまま入れられます(この問題では割り算が出てくるので、こちらになっています)。この問題の数はすべて割り切れるので、答えは整数になります |
◯ ← ◯ |
右の値を、左へ入れる。入れられた側(左)は前の中身が消えて上書きされます |
{row行col列の 未定義の値} |
枠だけ用意するという意味。row 行 col 列ぶんのマスを並べて、中身はまだどれも空(未定義)にしておきます |
dataの要素の和t |
その二次元配列の全マスを足したもの。表1なら 82+6+58+8 = 154 です。プログラムはこれを t という名前の箱に入れて使い回します |
dataの行数dataの列数 |
それぞれ縦に何段あるかと横に何マスあるか。表1はどちらも 2 です |
dataの行番号rの要素の和dataの列番号cの要素の和 |
前者はr 行目だけを横に足したもの、後者はc 列目だけを縦に足したもの。この記事ではそれぞれ「行の和」「列の和」と呼びます |
for (…)endfor |
あいだの行を何度もくり返す。くり返しの1回ぶんを、この記事では「1周」と呼びます。for の中に、もう1つ for を書くこともできます(二重ループ。中と外の関係を入れ子といいます) |
これで手が止まるところがあれば、下の教科書から、先にそこだけ読んでください(G9 のような番号は、当サイトの擬似言語の教科書の第何回かを表します)。
使うのは、行の和・列の和・総和の3つだけ
答えを作る式は (行の和) × (列の和) ÷ (総和) の1本だけです。出てくるのはこの3つの和なので、先にどのマスを足したものなのかを、表1の上で確かめます。
※「理論度数」は問題文が定義しています(「病気X にかかるかどうかが,予防接種の有無に影響されないと仮定した場合の人数」)。ただし解くのに使うのは、この言葉ではなく〔プログラム〕の式のほうなので、聞き慣れない言葉で立ち止まらなくて大丈夫です。
3つの和は、表1のどこを足したものか
※ 琥珀=足したマス/緑=出た和。
① 横に足すと 行の和 ── そのグループの人数
| 1列目 かからな かった |
2列目 かかった |
行の和 | |
|---|---|---|---|
| 1行目 受けた |
82 | 6 | 88 |
| 2行目 受けて いない |
58 | 8 | 66 |
| 列の和 |
1行目は 82 + 6 = 88(受けた人は全部で88人)、2行目は 58 + 8 = 66(受けていない人は66人)。
② 縦に足すと 列の和 ── 結果ごとの人数
| 1列目 かからな かった |
2列目 かかった |
行の和 | |
|---|---|---|---|
| 1行目 受けた |
82 | 6 | 88 |
| 2行目 受けて いない |
58 | 8 | 66 |
| 列の和 | 140 | 14 |
1列目は 82 + 58 = 140(かからなかった人は140人)、2列目は 6 + 8 = 14(かかった人は14人)。
③ どちらから足しても 総和
| 1列目 かからな かった |
2列目 かかった |
行の和 | |
|---|---|---|---|
| 1行目 受けた |
82 | 6 | 88 |
| 2行目 受けて いない |
58 | 8 | 66 |
| 列の和 | 140 | 14 | 154 |
行の和どうし 88 + 66 = 154。列の和どうし 140 + 14 = 154。同じ 154 になります ── これが全員の人数です。
使うのはこの3種類だけ。マスが変わっても、この表は書き直しません。
プログラムでは総和が t という名前で出てきます。t = 表の全マスの合計 = 154 です。
コードの中で、答えを作っているのは1行だけ
いま手でやったことを、プログラムはどう書いているのか。注釈を付けて見ます。
○実数型の二次元配列: f(実数型の二次元配列: data)
表を受け取り、同じ形の表を返す
実数型: t ← dataの要素の和
総和 154。4マスとも同じ値を使うので、くり返しの外で1回だけ求める
整数型: row ← dataの行数
2
整数型: col ← dataの列数
2
実数型の二次元配列: result ← {row行col列の 未定義の値}
答えの枠だけ用意する。中身はまだ空
整数型: r, c
2つのくり返しが動かす番号
for (r を 1 から row まで 1 ずつ増やす)
行を1つずつ
for (c を 1 から col まで 1 ずつ増やす)
その行の中で列を1つずつ
result[r, c] ← (dataの行番号rの要素の和) ×
この1行だけが答えを作っている。
(dataの列番号cの要素の和) ÷ t
行の和 × 列の和 ÷ 総和
endfor
1行ぶんの2マスが埋まった
endfor
全部の行が終わった
return result
4マス埋まった表を返す
※ 右側の注釈は当サイトで書き加えたものです。プログラム自体は原文のまま引用しています。
空欄に入るものを決める
空欄はどちらも表2のマスです。問題文に「その行が表の行,その列が表の列に対応する」とあるので、表2の見出しで何行目・何列目かを決めれば、あとは式に当てはめるだけ ── 解答群を見るのは最後にします。
空欄 a ── 表2の 1行目・1列目
表2で a があるのは「予防接種を受けた」の行、「病気X にかからなかった」の列 ── どちらも1番目です。この a を作っているのは、プログラムのこの行です。
〔プログラム〕a を作る行(r = 1・c = 1 の周)
for (r を 1 から row まで 1 ずつ増やす)
for (c を 1 から col まで 1 ずつ増やす)
result[r, c] ← (dataの行番号rの要素の和) ×
(dataの列番号cの要素の和) ÷ t
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
空欄 a は result[1, 1] ── 行1の和と、列1の和を使う
※ 太枠=いま使うところ。網掛け=問題が値を伏せているマス。
表2のどこにあるマスか
| 1 | 2 | |
|---|---|---|
| 1 | a |
|
| 2 | b |
表1のどこを使うか ── 1行目の和と、1列目の和
| 1列目 かからな かった |
2列目 かかった |
行の和 | |
|---|---|---|---|
| 1行目 受けた |
82 | 6 | 88 |
| 2行目 受けて いない |
58 | 8 | 66 |
| 列の和 | 140 | 14 | 154 |
太枠が、この a を出すのに使う3つです ── 行1の和 88・列1の和 140・総和 154。
88 × 140 ÷ 154。
a に入る数
88 × 140 = 12320 → 12320 ÷ 154 = 80
空欄 b ── 表2の 2行目・2列目
b は「予防接種を受けていない」の行、「病気X にかかった」の列 ── どちらも2番目です。ここが取りちがえやすいところなので、表2の見出しで確かめてから式を書きます。行も列も変わりますが、動かす行は同じ1行です。
〔プログラム〕b を作る行(r = 2・c = 2 の周)
for (r を 1 から row まで 1 ずつ増やす)
for (c を 1 から col まで 1 ずつ増やす)
result[r, c] ← (dataの行番号rの要素の和) ×
(dataの列番号cの要素の和) ÷ t
※ 上の〔プログラム〕からの抜粋です(1字も変えていません)。
空欄 b は result[2, 2] ── 行が変わるので、行の和も変わる
※ 太枠=いま使うところ。網掛け=問題が値を伏せているマス。
表2のどこにあるマスか ── a はもう決めました
| 1 | 2 | |
|---|---|---|
| 1 | a |
|
| 2 | b |
表1のどこを使うか ── 2行目の和と、2列目の和
| 1列目 かからな かった |
2列目 かかった |
行の和 | |
|---|---|---|---|
| 1行目 受けた |
82 | 6 | 88 |
| 2行目 受けて いない |
58 | 8 | 66 |
| 列の和 | 140 | 14 | 154 |
太枠が 1つずつ下・右へ動きました。a のときは 88 と 140、こんどは 行2の和 66・列2の和 14。同じなのは総和 154 だけです。
66 × 14 ÷ 154。
b に入る数
66 × 14 = 924 → 924 ÷ 154 = 6
ここで初めて解答群を見る
a が 80、b が 6。解答群でこの組合せは オ ひとつだけです。
本番の手順 ── 表のマスを訊かれたら
- そのマスが「何行目の何列目か」を、表の見出しから先に決める。式より先です。ここを取りちがえると、正しく計算しても外れます。
- 式に出てくる和を、先に表へ書き足してしまう。行の和・列の和・総和の3つ。
- 当てはめて、最後に解答群を見る。似た数字が並んでいても、照合するだけになります。
答え合わせ ── 動かすと4マスが順に埋まる
関数 f に表1を渡して、最初から最後まで動かします。見るのは result の4マスが1つずつ埋まっていくところです。
トレースシミュレータ
ループ開始前
いま計算していること
変数の状態
出力
トレース表(進めると1行ずつ積み上がります)
正解は オ
a = 80(result[1, 1])、b = 6(result[2, 2])。
ほかの6つは、実測値をそのまま写した(キ=表1の1行目 82/6、イ=2行目 58/8)、行を1つ取りちがえた(カ=b に result[1, 2] の 8)、掛けずに2で割っただけ(ア=行の和の半分、ウ=列の和の半分)のどれかです。エだけは、どの和からも実測値からも作れません。
「行の和 × 列の和 ÷ 総和」の問題を見分ける
縦横に集計した表が出てきて、「もし関係がなかったら」と仮定させたら、この形です。覚えるのは名前ではなく3つの和です。
| 見るところ | 読み取ること |
|---|---|
| 選択肢に、もとの表の数がそのまま載っていないか | 実測値は材料であって答えではありません。もとの表の行がまるごと選択肢になっていることがあるので、まず疑います |
| 掛け算をしていない選択肢が無いか | 和をそのまま/行数や列数で割っただけの数は、この形の誤答の定番です。掛け算をした跡が無い数は疑います |
| できあがった表の和 | 行の和も列の和も、もとの表と同じになります(この問題なら 80+8=88、60+6=66、80+60=140、8+6=14)。計算し終えたら、ここで検算できます |
次に読む
この問題でどこに手間取ったかで、行き先が変わります。
[行, 列] の順で迷った人へG9-2二重ループ ── 内側と外側がどう回るかを見たい人へ問3令和7年度 科目B 問3 ── 同じ年度の、配列と変数の問題です一覧科目B 全44問の解説 ── 同じ形の問題を続けて解きたい人へこの記事で引用した資料
いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

