冬期講習 2026-2027、募集中。総復習は売りません。90分×完全1対1で、穴だけを塞ぎます 詳しく →
電話 0422-27-7828チャットで質問無料相談を予約

武蔵野個別指導塾の特徴

高校情報I 合計と件数の集計—初期値と更新場所を決めて条件付きの平均を求める|武蔵野個別指導塾

学習のイメージ写真 武蔵野個別指導塾
X LINE Facebook

基準内の作業時間を選び、0件の扱いまで合計と件数の集計を追います。

よくあるのは、高校生が条件に合わない値も平均の分母に入れてしまう場面です。作業時間の記録から一定の範囲に入るものを選ぶとき、合計には選んだ時間を足したのに、件数には記録全体の数を使ってしまいます。分子と分母が異なる集団を表すため、得られた値は求めたい平均ではありません。

ここでは、作業時間を順に見て、基準内の時間の合計と件数を作ります。値が0件のときの表示も先に決め、入力の不備や処理の失敗が起きた場合には、平均を作れた場合と区別します。

何を集め、何で割るか

集計の問題には、記録と条件から合計・件数・平均を求める型、途中の変数の値を表にする型、更新場所の誤りを直す型があります。どの型でも、まず1件の値が対象に入るかを判定し、対象の合計を対象の件数で割ります。範囲の端を含むか、単位は何か、対象が0件なら何を返すかも出力条件に含めます。

以下の基本例は整数の分を記録したリストを受け取り、5分以上15分以下を対象とします。端の5と15は含みます。リストは空でもよく、同じ時間が繰り返された場合はそれぞれ別の記録として数えます。対象があれば合計、件数、平均をこの順に表示し、なければ合計0、件数0と「平均なし」を表示します。平均はPythonの除算の結果として表示し、丸めは指定しません。

図1のように、1件を判定してから、対象なら合計と件数を同じ分岐で更新します。対象外ならどちらも変えません。図1の二つの値は、これまでに見た範囲に対する記録です。

図1 条件を通った記録だけを合計と件数へ送る

合計を入れる変数を累積変数、数を数える変数をカウンタと呼びます。初期値をそれぞれ0にするのは、まだ何も見ていない時点の対象時間の合計と件数がどちらも0だからです。合計を毎回0に戻せば、それ以前に足した時間が消えます。件数だけを毎回0に戻しても、最後に対象が現れたかどうかしか残りません。

途中で保ちたい約束は「処理済みの記録のうち基準内の時間の合計がtotal、同じ記録の件数がcount」です。対象なら時間をtotalに足し、countに1を足すと約束が続きます。対象外なら両方を保ちます。有限のリストを先頭から1件ずつ処理するので反復は終了し、終了時の処理済み範囲は入力全体です。この説明は例を実行しただけの確認とは別に、任意の長さの有限リストについて成立する理由を示しています。

基本例:記録を1件ずつ足す

作業時間が [4, 5, 12, 15, 18] 分のとき、5分以上15分以下の合計、件数、平均を求めます。手で選ぶと5、12、15分です。合計は32分、件数は3件、平均は32を3で割った値です。4と18は選びません。

times = [4, 5, 12, 15, 18]
total = 0
count = 0
for minutes in times:
    if 5 <= minutes <= 15:
        total = total + minutes
        count = count + 1
print(total, count)
if count > 0:
    print(total / count)
else:
    print("平均なし")

最初の行は入力のリストです。次の2行は累積と件数の初期化です。forはリストから値を順にminutesへ取り出し、ifは両端を含む条件を調べます。条件が真のときにtotalとcountをそれぞれ更新します。反復後のprintは合計と件数を表示し、最後のifは0で割ることを避けます。対象がない場合は除算を行わず、文字列を表示します。

図2のように4分では更新せず、5分で合計5、件数1になります。図2の最後の状態は、選んだ3件を直接足した結果と一致します。

図2 作業時間を順に調べた合計と件数の変化
処理した時間    判定    total    count
開始前          -       0        0
4               対象外  0        0
5               対象    5        1
12              対象    17       2
15              対象    32       3
18              対象外  32       3

Python 3.14.8での入力はコード中のリストです。期待する1行目は 32 3、2行目は32を3で割った値です。実際の出力は次のとおりです。

32 3
10.666666666666666

平均は約10.67分です。この近似値は説明のためで、コードの出力を小数第2位に丸めるという指定ではありません。3件に対応する合計が32分であり、元の5、12、15分を合算しても32分に戻ります。平均に対象外の4、18分を混ぜていないことも確認できます。

条件を変えた集計と失敗の扱い

標準例では、完成した部品の作業時間 [7, 16, 7, 20] 分から、7分以上16分以下を選びます。基本例の条件行を if 7 <= minutes <= 16: に変え、入力行をこのリストにします。期待値は合計30分、3件、平均10.0分です。Python 3.14.8で実行した出力も 30 3 と 10.0 です。7分が2回あるので2件として数え、7、16、7を足して30分に戻ります。20分は条件外です。両端を含む指定があるため、7も16も落としてはいけません。

少し難しい例では、記録 [2, 21, 24] 分から5分以上15分以下を選びます。入力行をこのリストにして基本例を実行すると、期待値も実際の出力も 0 0 と 平均なし です。3件を1件ずつ調べても対象がないので、合計0と件数0は自然ですが、平均0とは言えません。平均0は対象があって値の平均が0である場合を示し、対象なしとは意味が異なります。空リスト [] も同じ出力です。単一要素 [5] は 5 1 と 5.0、単一要素 [16] は 0 0 と 平均なし です。

プログラムが受け取る値は整数の分という前提です。文字列や負の時間、記録の欠落は正常な時間として平均に入れません。実際の入力を扱う際には、入力を受け取る場所で型と範囲を検査し、不備を知らせて集計を中止する仕様を決めます。たとえば文字列 "不明" と整数を比較すると、この基本コードではTypeErrorで停止します。途中までの合計を完成した結果として使わず、入力を直して最初から実行します。数値であっても負の時間は型の例外にならないため、別途、非負かどうかの検査が必要です。

外部から記録を受け取る仕組みが時間切れや読み込み失敗になった場合も、空リストを受け取った成功として扱わないことが必要です。取得成功の空リストなら「平均なし」、取得失敗なら失敗の表示とし、取得できた件数が全件か不明な状態では平均を確定しません。再取得するときは重複して足し込まないよう、最初から集計し直すか、再開位置を別に管理します。基本コードは外部との通信を行わないので、これらは実装をつなぐときに定める条件です。

分母の誤りを直して再実行する

基本例で、合計は正しく求めたのに、件数をリスト全体の長さ5にしたとします。この誤答は32を5で割り、6.4分を返します。図3のように、合計に入った3件と分母の5件が一致しません。図3の修正後は、対象の5、12、15分に対して合計32分、件数3件となります。

図3 対象外を分母に入れる誤りと修正後の対応

原因は、記録を見た回数と、条件を満たした回数を混同したことです。修正はcountを0から始め、条件が真のときにtotalと同じ分岐で1増やすことです。基本例を再実行すると 32 3、10.666666666666666 となります。対象外の記録を追加しても合計と件数が変わらないことを調べれば、同じ間違いの再発に気づきやすくなります。

別の誤りとして初期化をforの内側に入れると、各回で前の結果が消えます。基本例では最後の18分を調べる直前にも0に戻るため、結果は0件になります。初期化を反復の前に移し、各行の状態を表に戻して再実行します。更新行を条件の外に出す誤りでは対象外まで足されるので、インデントを条件の内側にそろえます。いずれも最終出力だけを見るのでなく、初めて期待値と食い違う行を探します。

結果を受け取るまでの試験設計

集計の成功を確かめるときは、入力の各値が条件に入るかを手で印付けし、印の付いた値の合計と印の個数を別々に出します。上端と下端が対象であること、同じ値が複数あればそれぞれを数えることも確認します。対象外の値を1件足しても答えは変わらず、対象内の値を1件足すと合計はその値だけ増え、件数は1増えます。この関係を利用すれば、元の答えの計算と異なる方向から検証できます。対象内の値が1件なら、その値と平均が一致することも確認できます。

失敗についても、どこで起きたかと、どの結果を出してよいかを同じように分けて試験します。例えば入力の最初が文字列なら比較で停止し、途中に文字列があれば前半を処理した後で停止します。どちらも完成した合計や平均を出した成功ではありません。負の整数は比較できてしまうので、入力時の非負チェックを設計してから、先頭と途中に負の値がある場合を試します。空リストを成功として受け取れた場合との違いを確認し、異常な値を黙って除外して0件と表示しないようにします。

取得処理を加える場合には、記録の到着前の時間切れと、一部の記録を受け取った後の失敗の両方を試します。前者で空の成功結果を返さないこと、後者で途中の値を全件分と誤認しないことを確認します。読み込み元が壊れた形式を返した場合も、不備の位置を知らせ、修正した入力で最初から再実行します。外部の道具が使えず実行自体が始まらない場合は、出力がないことを成功の0件と判断せず、道具の状態を直してから同じ入力と期待値で再試行します。こうした失敗の試験は追加する入出力部分に対する設計であり、上の基本コードが自動的に処理する機能ではありません。

自分で試す5問

各問の記録は整数の分で、空リストと重複を認めます。対象範囲の両端は含みます。合計は分、件数は件で整数として答え、平均は対象があれば数値、0件なら「平均なし」と答えてください。各問は基本コードの入力と条件を置き換えて実行できます。

  1. 記録 [3, 8, 11, 19] から8分以上11分以下を集計してください。
  2. 記録 [6, 6, 13] から6分以上9分以下を集計してください。
  3. 記録 [1, 22] から9分以上12分以下を集計してください。
  4. 空の記録 [] から2分以上10分以下を集計してください。
  5. 記録 [14] から10分以上14分以下を集計してください。

答えと照合

  1. 対象は8、11分です。途中状態は (8, 1)、(19, 2) となり、合計19分、2件、平均9.5分です。元の2件の和は19分です。実行結果は 19 2、9.5 です。
  2. 対象は6、6分です。同じ値でも2件なので状態は (6, 1)、(12, 2)、13分の後も変わりません。合計12分、2件、平均6.0分で、元の2件の和に戻ります。実行結果は 12 2、6.0 です。
  3. 1分も22分も範囲外です。状態は最後まで (0, 0)、合計0分、0件、平均なしです。実行結果は 0 0、平均なし です。入力が2件あっても、対象は0件です。
  4. 調べる記録がないので初期状態 (0, 0) のまま終了します。合計0分、0件、平均なしで、実行結果は 0 0、平均なし です。0件のとき除算をしないのでエラーになりません。
  5. 14分は上端と一致して対象です。状態は (14, 1)、合計14分、1件、平均14.0分です。元の1件に戻ることを確認できます。実行結果は 14 1、14.0 です。

覚えておくこと

合計と件数は反復の前に0で始めます。
対象と判定した同じ記録について両方を更新します。
平均は対象の合計を対象の件数で割ります。
対象が0件なら除算せず、決めた表示にします。
入力や取得の失敗は、成功した0件と区別します。

手が止まったときの見直し

個別指導で確かめるなら、まず対象の記録に印を付け、合計と件数のそれぞれに何を入れたか本人の言葉で説明してもらいます。次に、対象外の行で2つの変数が変わっていないか、処理表とコードのインデントを見比べます。端の値、重複、空、対象0件の順に入力を変えると、条件と初期化のどこで食い違うかを絞れます。

最後に、データを受け取れなかった場合と、受け取れたが対象がなかった場合を別々に説明できるかを確かめます。合計と件数が同じ対象を指して初めて、条件付き平均は意味を持ちます。

読んで終わりにするか、ここから変えるか。

武蔵境駅徒歩30秒、講師1人に生徒1人の完全1対1。授業のあいだ、先生は隣を離れません。いまの詰まりを、無料相談でそのまま話してください。

まず15分だけ電話で話したい方は、無料電話相談(15分)から。塾からお電話を差し上げます。

本気になった日が、入塾の日。

お子様の教育、迷ったら「丸投げ」してください。必ず、期待以上の結果で返します。武蔵野で育む、武蔵境で学ぶ。

電話は年中無休。365日、24時間、お電話可能。

チャットで質問チャット
無料相談を予約する 電話 0422-27-7828電話 LINE チャット
で質問