typestar

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

  1. student es un record; el roster es un literal de lista.
  2. letter califica por una escalera if/else hasta un char.
  3. List.concat_map junta cada puntaje para el promedio del curso.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 28 de 29 en Fundamentos del lenguaje.

← Anterior Siguiente →