コントロールブレーク処理|キーが変わったら小計を出す【基本情報技術者試験 科目B】

基本情報技術者試験

現行FE シラバス Ver9.2 準拠擬似言語の記述形式は2022年から変更なし最終更新 2026-10-17

コントロールブレーク処理は、キー(まとめる目印にする項目)の順に並んだデータを先頭から読み、キーが変わったところで小計(キーごとの合計)を出す処理です。店番号の順に並んだ売上から、店ごとの合計を出す例を1本、最後までたどります。

期間限定クーポンPR|Udemy の講座科目B オリジナル模試 3回分・60問42%OFF 1,500円2,600円中身を見る ›

コントロールブレーク処理とは ── キーが変わったところで小計を出す

売上のデータが5件あります。1件は「店番号」と「売上」の組で、店番号の小さい順に並んでいます。求めたいのは、店ごとの売上の合計(小計)です。出力は「店番号,小計」の形にします。店 1 の小計が 50 なら 1,50 です。

店番号が変わったところで、前の店の小計が出る

mise=店番号(小さい順に並んでいる)/uri=売上(万円)。2本の同じ位置(何番目か)どうしが1件ぶん

店 1 ── 1件目と2件目

mise

11

21

32

42

53

uri

130

220

310

445

560

30 + 20 = 50。次に読む3件目は店番号が 2 → 3件目を読んだところで 1,50 を出力する

店 2 ── 3件目と4件目

mise

11

21

32

42

53

uri

130

220

310

445

560

10 + 45 = 55。次に読む5件目は店番号が 3 → 5件目を読んだところで 2,55 を出力する

店 3 ── 5件目だけ

mise

11

21

32

42

53

uri

130

220

310

445

560

小計は 60。うしろに次の店が無い → 全部読み終えたあとで 3,60 を出力する

出力は 1,50 / 2,55 / 3,60 の3回。破線の枡=次に読む1件の店番号。ここで変わっている

キーは店番号です。同じ店番号が隣どうしに並んでいるので、「1つ前とちがう店番号が来た」ことだけで、前の店が終わったと分かります。この切れ目が「ブレーク」です。以下では区切りと呼びます。ばらばらに並んだデータでは、同じ店があとからまた出てくるので、この判定は使えません。先に並べ替えておくことが前提です。

試験での位置づけ

IPAのシラバスは「ファイル処理のアルゴリズム」の中で、整列処理・併合処理・コントロールブレーク処理・編集処理の名前を挙げています。一方、IPAが公開している科目Bの問題(サンプル問題と令和5〜8年度の公開問題)に、この処理を題材にしたものは見当たりません。ただ、ここで使う部品(集計中のキーを覚えておく変数、合計を 0 に戻す位置、くり返しのあとの後始末)は、配列を読むプログラムに共通のものです。

擬似言語の記述形式には、ファイルを読む書き方がありません。そこで以下では、データがすでに配列に入っているものとして書きます。ファイルの1件ぶんが、2本の配列の同じ番号の組(mise[i] と uri[i])にあたります。

プログラム ── 区切りで出力し、切り替えてから足す

整数型の配列: mise ← {1, 1, 2, 2, 3}
整数型の配列: uri ← {30, 20, 10, 45, 60}
整数型: key ← mise[1]
整数型: kei ← 0
整数型: i

for (i を 1 から miseの要素数 まで 1 ずつ増やす)
  if (mise[i] ≠ key)
    keyの値 と keiの値 をこの順にコンマ区切りで出力する
    key ← mise[i]
    kei ← 0
  endif
  kei ← kei + uri[i]
endfor

keyの値 と keiの値 をこの順にコンマ区切りで出力する

出力は 1,50、2,55、3,60 の3回です。覚えておく変数は2つあります。key はいま集計している店の番号、kei はその店の小計です。

for の行は「i を 1 から 5(mise の要素数)まで 1 ずつ増やしながら、endfor までをくり返す」と読みます。i が「いま何件目を読んでいるか」です。

1件ごとにやること

  1.   if (mise[i] ≠ key)
    店番号が変わったかを見る。いま読んだ1件の店番号 mise[i] が、集計中の店 key と等しくなければ、前の店はもう終わっています。
  2.     keyの値 と keiの値 をこの順にコンマ区切りで出力する
    変わっていたら、まず出力する。この時点の key と kei は、まだ前の店のものです。書き換える前に出します。
  3.     key ← mise[i]
        kei ← 0
    つぎの店に切り替える。店番号を覚え直し、小計を 0 に戻します。0 に戻さないと、前の店の小計につぎの店の売上を足し続けます。
  4.   kei ← kei + uri[i]
    いま読んだ1件を足す。endif の下なので、店番号が変わった回も変わらなかった回も、毎回ここを通ります。

店番号が変わったと気づいた1件は、新しい店の1件目です。だから 0 に戻したあとで足します。先に足すと、新しい店の売上が前の店の小計に入ります。

店ごとの小計を1行ずつ動かす

当サイトオリジナルの例題


ループ開始前

配列

▲ いま読んでいる▲ いま書いた

いま計算していること

まだ計算していません

変数の状態

トレース表(進めると1行ずつ積み上がります)

最後の小計 ── くり返しのあとで出力する

くり返しの中で出力されるのは、つぎの店の1件目を読んだときだけです。最後の店 3 には、それが来ません。だから endfor の下に、同じ出力の行がもう1つ要ります。この行を消すと、出力は 1,50 と 2,55 の2回で終わり、店 3 の 60 はどこにも出ません。

くり返しの前にも、対になる準備がある

整数型: key ← mise[1] は、1件目の店番号を先に覚えておく行です。これで1件目は「変わっていない」と判定され、何も足していない小計が出力されることはありません。もし key を 0 で始めると、1件目で「変わった」と判定され、0,0 が先に出力されます。始まる前に1件目のキーを入れ、終わったあとに最後の1組を出す。くり返しの前後で1つずつです。

練習

組番号の順に並べ替えていない名簿から、組ごとの人数を数えます。次のプログラムを実行したとき、出力はどうなりますか。配列の要素番号は1から始まります。

整数型の配列: kumi ← {5, 8, 5, 5}
整数型: key ← kumi[1]
整数型: ken ← 0
整数型: i

for (i を 1 から kumiの要素数 まで 1 ずつ増やす)
  if (kumi[i] ≠ key)
    keyの値 と kenの値 をこの順にコンマ区切りで出力する
    key ← kumi[i]
    ken ← 0
  endif
  ken ← ken + 1
endfor

keyの値 と kenの値 をこの順にコンマ区切りで出力する

次に読む

A3-2 2次元配列の集計 ─ 0 を入れる場所で、何ごとの集計かが決まる
A6 分割して並べる ─ 並んだ2本を1本にまとめる併合
A2-1 配列を全部見る ─ ten[i] と for の読み方
目次 基本情報技術者試験 科目B 攻略ガイド

この記事で引用した資料

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

本文の例題と練習問題は当サイトのオリジナルです。

タイトルとURLをコピーしました