
武蔵野個別指導塾の特徴
共通テスト情報I 処理の空欄補充—目的と途中結果から更新式の候補を絞る|武蔵野個別指導塾

条件に合う値の合計と件数を例に、初回や境界での途中値と、誤った更新式を除く反例の作り方を学べます。
よくあるのは、高校生が集計プログラムの空欄に候補を入れ、1つの入力で期待した答えが出たので正しいと決めるという場面です。その入力では誤った式も偶然同じ結果を出すかもしれません。空欄の前後で何を保存し、次に何を加えるかを追うと、候補を区別する入力を選べます。
空欄が守る約束を先に読む
処理の空欄補充では、まずプログラムの目的を、終了時にどの値が入っているべきかという形に直します。次に、空欄へ到達する直前の値と、実行直後に必要な値を比べます。式の見た目が似ていても、前の集計を残すか、今の値だけを使うかで結果は変わります。
出方には、条件に合う値の合計を更新する式を選ぶ型、条件に合う件数を更新する式を選ぶ型、途中結果の表と合う更新式を選ぶ型があります。いずれも目的と更新前後の対応が中心です。ここでは短い自作の集計処理を扱い、複雑な探索や整列には広げません。
候補を試すときは、成功する場合と失敗する場合の両方を作ります。たとえば、条件に合う値が1つある入力に加え、合う値がない入力、境界ちょうどの値、合う値が複数ある入力を考えます。誤った候補が目的と異なる結果を出す入力は反例です。反例が1つあれば、その候補は指定された範囲のすべてで正しいとは言えません。
更新前と更新後をつなぐ
図1のように、初期値から始め、現在の値を条件と照合し、条件に合うときだけ更新します。最後に残った値が目的の集計結果です。空欄はこのつながりの一部なので、前後を切り離して選べません。

図1の条件判定が成り立たなければ、更新を行わずに次の値へ進みます。合計なら、更新前の合計に今回の値を加えたものが更新後の合計です。件数なら、条件に合うたびに1増やします。合計と件数はどちらも蓄積しますが、加えるものが違います。
以下の自作記法では「←」は右側を現在の値で計算し、左側に保存する代入です。比較は文章で示し、「以上」は境界を含みます。配列の添字は1から始め、指定した最初と最後の番号を含めて繰り返します。整数除算と剰余は使いません。空の配列では繰り返しを0回とします。この記法が実際の試験の表記と同一だとは限りません。
候補を試す表には、対象の番号、現在の値、条件の真偽、更新前、更新後を置きます。条件が偽の行も記録すると、誤って値を加えた場合を見つけやすくなります。最後の出力だけでなく各行の意味を確かめることが、空欄を選ぶ根拠になります。
基本例題:条件に合う値の合計
記録された作業時間の配列は [2, 5, 3, 7] 分です。4分以上の値の合計を整数の分数で出力します。以下の空欄に入れる式をアからエまでの中から1つ選んでください。配列の番号は1から4です。
合計 ← 0
番号を1から4まで1ずつ増やして繰り返す
値 ← 配列[番号]
値が4以上なら
合計 ← 空欄
合計を出力する
ア: 合計 + 値 イ: 値 ウ: 合計 + 1 エ: 合計 + 番号
図2のように、条件に合うのは5分と7分です。期待される結果は12分であり、2分と3分は加えません。候補アで各行を追うと、番号1では2が4未満なので合計は0のままです。番号2では5を加えて5になります。番号3では更新せず5のまま、番号4では7を加えて12になります。

図2の途中結果は更新後の合計です。アは前の合計に現在の値を足すので、条件に合う値を累積します。イは番号2で5となるところまでは合いますが、番号4で前の5を捨てて7に置き換えます。ウは2回の更新で2となり、値の合計ではなく該当件数を数えます。エは番号2と4を足すため6です。4候補を同じ入力で比べると、結果は順に12、7、2、6となり、答えはアです。
出力の12分を元の記録へ戻すと、5分と7分の和です。条件外の2分と3分を加えていないことも確認できます。ただし、この1回の一致だけでアの正しさを示したわけではありません。更新前にそれまでの該当値の合計が入っていれば、アは今回の該当値を加えた合計に変えます。条件外では値を変えず、初期値0はまだ値を見ていない段階の合計に合います。この関係を最後まで繰り返すことで、目的に合うと説明できます。
境界と空の入力で候補を試す
次の処理は、配列に入った整数のうち、6以上の値の個数を求めます。配列は空でもよく、要素数を長さと呼びます。番号は1から長さまでで、長さ0なら反復は0回です。答えは候補の記号を1つ、出力は整数の個数で考えてください。
件数 ← 0
番号を1から長さまで1ずつ増やして繰り返す
値 ← 配列[番号]
値が6以上なら
件数 ← 空欄
件数を出力する
ア: 件数 + 1 イ: 1 ウ: 件数 + 値 エ: 件数 + 番号
たとえば [2, 6, 8] では、境界の6と8が該当し、求める個数は2です。アの途中値は0、1、2です。イは0、1、1となり、2回目の該当で前の件数を失います。ウは0、6、14であり、値を足しています。エは0、2、5であり、番号を足しています。したがって候補はアです。
この判断をさらに試します。空配列では更新が0回なので、どの候補でも初期値0を出力します。空の場合だけでは候補を区別できませんが、処理が要素を無理に参照しないことを確かめられます。[5] では条件が偽で、期待値も出力も0です。[6] では境界を含むので、アの出力は1です。[6, 6] では重複した2要素をそれぞれ数えるので2です。イは1を出すため、最初の一致だけでは見えなかった誤りが現れます。
逆に、条件が「6を超える」へ変更された場合は、6は数えません。空欄の更新式が同じでも、判定する範囲が変われば出力が変わります。[6, 8] なら1個です。空欄だけを見るのではなく、何回その行を実行するかも読み取ります。最後に条件に合う値が並ぶ場合は、最終回の更新後に出力される点も確認します。
試す入力を対にして設計する
候補が目的を満たすか調べるとき、成立する場合と失敗する場合を対にすると、見落としを減らせます。基本例題のアについて、該当値が1つの [5] では5、複数の [5, 7] では12を出します。いずれも元の値の合計と一致します。さらに [4] は境界ちょうどを含み4、[2, 3] は該当なしで0です。これらは各経路で期待した処理ができるかを見る試験です。
同じ入力で誤った候補がどこで失敗するかも調べます。イは [5] では5で合いますが、[5, 7] では7となり、前の5を捨てます。ウは [4] で1となり、合計4と違います。エは [5, 7] で番号の和3を返し、値の和12と違います。[2, 3] では更新自体がないので、誤った式も0を返します。失敗を見つけられない入力があることも、試験の結果として記録します。
少し難しい例題の件数についても、[6] で1、[6, 6] で2、[5] と空配列で0という期待値を先に書けます。候補イは最初の該当では1を返しますが、重複した2回目でも1のままです。候補ウは [6] で6、エは [5, 6] で2を返し、いずれも実際の該当件数1と食い違います。正常に見える入力と誤りを露呈する入力の双方を用意して、出力を元の配列に戻して確かめます。
ここでの処理は整数の配列を入力として定義しています。文字列や欠損した値、途中で取得できない入力、時間切れや外部の道具の失敗は、この処理の条件には定められていません。その場合の出力を勝手に0と決めることはできません。実際にそのような入力を扱う処理を設計するなら、入力の検査方法、失敗を知らせる方法、再試行や中止の条件を別に定め、それぞれを正常な入力と同じように試します。
誤答を反例で直す
基本例題でイを選び、最初に条件を満たす5を見て正しいと判断したとします。原因は、更新後の値だけを見て、更新前に蓄積した値を残す必要を見落としたことです。図3のように、次の該当値7でイは合計を7に置き換え、アは5に7を加えて12にします。

図3の比較では、2回目の更新前の5を両候補に共通して与えています。違いは、イが古い合計を参照しないことです。修正するときは、まず「ここまでの該当値の合計」を変数の意味として書き、その意味を次の行でも保てる式を選びます。候補を決めた後も、条件外の行で変数が変わらないか確認します。途中値が示された問題なら、候補を入れて作った表の各行と、問題の表を順に照合します。途中で異なる値が出た候補は、最後に偶然一致しても残せません。表の値が合った候補についても、指定された入力の範囲で更新の意味が保たれる理由を考えます。
別の誤りは、件数を求める空欄に現在の値を加えることです。値がたまたま1なら1増えるので、その入力では失敗が隠れます。2以上の値を使えば、1件なのに2以上増えるため区別できます。候補に有利な例だけでなく、候補同士の違いが表れる例を用意することが大切です。
練習:候補を試す入力を選ぶ
各問の配列は整数の列で、番号は1から始まります。指定した両端を含めて反復し、空配列なら0回です。代入は右側を計算してから左側に保存します。出力は反復終了後です。各空欄には指定された候補を1つ入れます。
問題
- 配列 [1, 4, 6] から、4以上の値の合計を求めます。合計は0から始め、条件が真のときに更新します。ア「合計 + 値」、イ「値」、ウ「合計 + 1」から1つ選び、出力を整数で答えてください。
- 配列 [3, 3, 9] から、3以下の値の個数を求めます。件数は0から始め、該当時に更新します。ア「件数 + 値」、イ「件数 + 1」、ウ「1」から1つ選び、出力を整数の個数で答えてください。
- 10以上の値の合計を求める処理で、候補ア「合計 + 値」とイ「値」を区別したいとします。入力候補は A [10]、B [2, 8]、C [10, 12] です。合計は0から始め、該当時に更新します。出力が異なる入力を記号で1つ選び、両候補の出力を整数で答えてください。
- 配列の値のうち2以上の件数を求めます。件数は0から始め、該当時に「件数 + 1」で更新します。入力 A は空配列、B は [1]、C は [2, 5] です。各入力の出力を順に整数の個数で答えてください。
答えと解き方
- ア、10です。1は条件外なので0のまま、4で4、6で10になります。イは最後の6に置き換えて6、ウは該当2回で2です。元の配列に戻ると、対象の4と6の和が10です。
- イ、2個です。最初の3で1、次の3で2、9では更新しません。アは3と3を足して6、ウは2回目も1に置き換えます。元の配列では3以下の要素が2つあります。
- Cです。アは10から22へ増え、イは10から12へ置き換わります。Aは両方10、Bは条件に合う値がなく両方0です。Cの元の要素10と12の合計は22であり、イの12はその合計ではありません。
- 順に0個、0個、2個です。Aは反復が0回で初期値が残ります。Bは1が条件外です。Cは境界の2と5をそれぞれ数え、途中値は1、2です。入力に戻って数えても、該当する要素の数は順に0、0、2です。
練習の正しい候補は、複数の該当値がある場合に前の結果を引き継ぎます。失敗する候補は、複数回の更新で過去を捨てる、値と件数を混同するなど、異なる理由で目的から外れます。空や条件外の入力は、更新を行わない経路を確認するために必要です。一方、その経路だけでは更新式の違いを判別できないので、該当する入力も組み合わせます。
覚えておくこと
目的を終了時の値として書きます。 更新前の意味を保ち、今回必要な量を加えます。 初回、境界、複数回、0回、最終回を試します。 反例を見つけた候補は除き、残した候補の理由を説明します。
どこから追い直すか
答えが合わないときは、まず出力の直前からではなく、最初に期待値と実際の値がずれた行へ戻ります。条件が偽なのに更新したなら判定を、2回目の該当でずれたなら更新前の値の引き継ぎを確認します。個別指導で確かめる場合も、候補の記号だけでなく、各行の条件と更新前後を本人の言葉で説明できるかを見ます。1つの入力で一致した後に、候補が違う結果を出す入力を探せれば、空欄を選ぶ根拠がはっきりします。
もう「日東駒専」を目標にしないでください。
武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。
まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。
本気になった日が、入塾の日。
お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。
電話は年中無休。365日、24時間、お電話可能。



