grade_report.ml en OCaml
Boletines desde un roster de records, una escalera de if y columnas.
(* Average each student's scores and print a letter-grade report. *)
type student = { name : string; scores : int list }
let roster = [
{ name = "Ada"; scores = [92; 88; 97] };
{ name = "Grace"; scores = [84; 91; 78] };
{ name = "Alan"; scores = [70; 66; 74] };
{ name = "Edsger"; scores = [58; 67; 61] };
]
let average s =
let total = List.fold_left ( + ) 0 s.scores in
float_of_int total /. float_of_int (List.length s.scores)
let letter avg =
if avg >= 90.0 then 'A'
else if avg >= 80.0 then 'B'
else if avg >= 70.0 then 'C'
else if avg >= 60.0 then 'D'
else 'F'
let () =
print_endline "student avg grade";
roster
|> List.sort (fun a b -> compare a.name b.name)
|> List.iter (fun s ->
let avg = average s in
Printf.printf "%-8s %4.1f %c\n" s.name avg (letter avg));
let all = List.concat_map (fun s -> s.scores) roster in
let class_avg =
float_of_int (List.fold_left ( + ) 0 all)
/. float_of_int (List.length all)
in
Printf.printf "Class average: %.1f\n" class_avg
Cómo funciona
studentes un record; el roster es un literal de lista.lettercalifica por una escalera if/else hasta un char.List.concat_mapjunta cada puntaje para el promedio del curso.
Palabras clave y builtins usados aquí
elsefunifinintletliststringthentype
El intento, en números
- Líneas
- 36
- Caracteres a escribir
- 975
- Tokens
- 274
- Ritmo de tres estrellas
- 60 tpm
Al ritmo de tres estrellas de 60 tokens por minuto, este intento toma unos 274 segundos.
Paso 2 de 3 en Bis; paso 28 de 29 en Fundamentos del lenguaje.