typestar

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

  1. The roster is name-scores tuples; keysort orders it.
  2. letter grades through guard clauses top to bottom.
  3. lists:append pools every score for the class average.

Keywords and builtins used here

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.

Type this snippet

Step 2 of 3 in Encore, step 30 of 31 in Language basics.

← Previous Next →