typestar

grade_report.erl en Erlang

Boletines desde tuplas etiquetadas, notas por guardas, ~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)]).

Cómo funciona

  1. El roster son tuplas nombre-puntajes; keysort lo ordena.
  2. letter califica por cláusulas con guarda, de arriba abajo.
  3. lists:append junta cada puntaje para el promedio del curso.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
28
Caracteres a escribir
713
Tokens
274
Ritmo de tres estrellas
60 tpm

Al ritmo de tres estrellas de 60 tokens por minuto, este intento toma unos 274 segundos.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 30 de 31 en Fundamentos del lenguaje.

← Anterior Siguiente →