令和7年度 基本情報技術者試験 科目B 問5の解説|理論度数を二次元配列で計算する

基本情報技術者試験

令和7年度 科目B 公開問題 問5擬似言語・二次元配列・二重ループ最終更新 2026-09-04

令和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。解答群でこの組合せは オ ひとつだけです。

本番の手順 ── 表のマスを訊かれたら

  1. そのマスが「何行目の何列目か」を、表の見出しから先に決める。式より先です。ここを取りちがえると、正しく計算しても外れます。
  2. 式に出てくる和を、先に表へ書き足してしまう。行の和・列の和・総和の3つ。
  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)。計算し終えたら、ここで検算できます

次に読む

この問題でどこに手間取ったかで、行き先が変わります。

この記事で引用した資料

いずれも独立行政法人情報処理推進機構(IPA)が公表したものです。IPAは公表済みの試験問題について、教育目的での使用に許諾および使用料を不要としていますが、著作権は放棄していません。本記事では問題文を改変せずに引用しています。

Copied title and URL