grade_report.php in PHP
Per-student averages, letter grades, and a class summary table.
<?php
// grade_report: per-student averages and a class summary
$scores = [
"Ada" => [92, 88, 95],
"Grace" => [79, 85, 91],
"Alan" => [88, 72, 80],
"Edsger" => [96, 90, 98],
];
function letter(float $avg): string {
return match (true) {
$avg >= 90 => "A",
$avg >= 80 => "B",
$avg >= 70 => "C",
default => "F",
};
}
$averages = [];
foreach ($scores as $name => $marks) {
$averages[$name] = array_sum($marks) / count($marks);
}
arsort($averages);
echo str_pad("student", 10), str_pad("avg", 8), "grade\n";
foreach ($averages as $name => $avg) {
printf("%-10s%-8.1f%s\n", $name, $avg, letter($avg));
}
$classAvg = array_sum($averages) / count($averages);
printf("class average: %.1f\n", $classAvg);
echo "top student: ", array_key_first($averages), "\n";
How it works
- Each student maps to an array of scores;
array_sumaverages them. match (true)converts an average into a letter grade.arsortorders students best-first;printfaligns the columns.array_key_firstnames the top student after the sort.
Keywords and builtins used here
array_key_firstarray_sumarsortascountdefaultechoforeachfunctionlettermatchprintfreturnstr_padtrue
The run, in numbers
- Lines
- 33
- Characters to type
- 765
- Tokens
- 208
- Three-star pace
- 85 tpm
At the three-star pace of 85 tokens a minute, this run takes about 147 seconds.
Step 2 of 3 in Encore, step 26 of 27 in Language basics.