概要
このトピックの最後は 総合演習。お題は典型的な「学生 × 教科の成績データ」で、標準入力から「1 件 = 名前 + 複数の数値」の形式を読み取り、2 次元配列やオブジェクトリストに組み立て、行ごとの平均 (各学生の平均) と列ごとの平均 (教科ごとのクラス平均) を使い分ける ことを目的にする。ここまで (ch01〜ch11) で扱った断片的な技術が、1 つのプログラムとして繋がる経験になる。
ドリル 01 (学生別平均) では 行ごとの集計 が問われる。array_sum($scores) / count($scores) のように 1 件のレコードに対して平均を出すパターンで、ch06 (行合計) の発展形。ドリル 02 (教科別クラス平均) では 列ごとの集計 が問われ、ch07 (列合計) の発想を平均に拡張する。同じデータを「縦に見るか / 横に見るか」で答えが変わる、というデータ集計の核心がここで腹落ちする。
実務でも「売上を月別に見たいのか / 商品別に見たいのか」「ユーザー別の合計か / 日別の合計か」のように 集計軸の切り替え は常に出てくる。この章でその発想を一度通すと、後で BI ツールやデータ集計スクリプトを書く時の発想の元になる。標準入力 → パース → 2 次元配列 → 集計 → 出力 という流れを自分の手で一気通貫に書けるようになるのがゴール。
学習目標
- 標準入力から「1 件 = 名前 + 複数の数値」のデータを読み、2 次元配列やオブジェクトリストに組み立てられる
- 行ごとの計算 (各学生の平均) と列ごとの計算 (教科ごとの平均) を 1 つのプログラムで使い分けられる
- ここまで (ch01〜ch11) を組み合わせて使える
ドリル
| no | 内容 |
|---|---|
| 01 | 学生 3 人の 3 教科点数を読み、各学生の平均を出力 |
| 02 | 学生 3 人の 3 教科点数を読み、教科ごとのクラス平均を出力 |
📝 演習: ドリル 01 — 各学生の平均点を出力
問題
標準入力で 3 行のデータが与えられます。各行は次の形式です。
名前,国語の点,数学の点,英語の点
入力例:
太郎,80,70,90
花子,60,90,90
次郎,100,100,70
各学生について、3 教科の 平均点 を計算し、次の形で 1 行ずつ出力してください。
名前: 平均
期待される出力:
太郎: 80
花子: 80
次郎: 90ヒント
- 1 行ずつ
fgets(STDIN)で読み、explode(",", $line)で分割 - 1 件分を
['name' => ..., 'scores' => [...]]のような連想配列にして配列に追加 array_sum($scores) / count($scores)で平均- 今回は割り切れる点数になっているので、
echo $avgでそのまま整数として表示される
📝 演習: ドリル 02 — 教科ごとのクラス平均を出力
問題
標準入力で 3 行のデータが与えられます。各行は次の形式です。
名前,国語の点,数学の点,英語の点
入力例:
太郎,60,80,100
花子,90,80,70
次郎,90,80,100
各教科のクラス平均 (3 人の平均) を計算し、国語 → 数学 → 英語 の順に 1 行ずつ出力してください。
期待される出力:
80
80
90ヒント
- 各行を 2 次元配列に組み立てる (名前は無視してよいし、
'scores'キーに点数だけ入れてもよい) - 外側 = 教科 (列)、内側 = 学生 (行) で for ループ
- 各教科について
$sum += $row[$j];し、最後に学生数で割る - 今回は割り切れる点数になっているので
echo $avgでそのまま整数として表示される