grade_report.erl in Erlang
Report cards from tagged tuples, guard-clause grading, ~4.1f.
%% Average each student's scores and print a letter-grade report.
roster() ->
[{"Ada", [92, 88, 97]},
{"Grace", [84, 91, 78]},
{"Alan", [70, 66, 74]},
{"Edsger", [58, 67, 61]}].
average(Scores) ->
lists:sum(Scores) / length(Scores).
letter(Avg) when Avg >= 90 -> "A";
letter(Avg) when Avg >= 80 -> "B";
letter(Avg) when Avg >= 70 -> "C";
letter(Avg) when Avg >= 60 -> "D";
letter(_) -> "F".
main(_) ->
Sorted = lists:keysort(1, roster()),
io:format("student avg grade~n"),
[begin
Avg = average(Scores),
io:format("~-8s ~4.1f ~s~n", [Name, Avg, letter(Avg)])
end || {Name, Scores} <- Sorted],
All = lists:append([S || {_, S} <- roster()]),
io:format("Class average: ~.1f~n",
[lists:sum(All) / length(All)]).
How it works
- The roster is name-scores tuples;
keysortorders it. lettergrades through guard clauses top to bottom.lists:appendpools every score for the class average.
Keywords and builtins used here
appendaveragebeginendformatkeysortlengthlettermainrostersumwhen
The run, in numbers
- Lines
- 28
- Characters to type
- 713
- Tokens
- 274
- Three-star pace
- 60 tpm
At the three-star pace of 60 tokens a minute, this run takes about 274 seconds.
Step 2 of 3 in Encore, step 30 of 31 in Language basics.