typestar

grade_report.lisp en Lisp

Convierte una lista de estudiantes y sus notas en calificaciones por persona y un resumen del curso.

;; grade_report.lisp: student averages, letter grades, and a class summary.

(defparameter *students*
  '(("Ada" 92 88 95)
    ("Grace" 78 85 80)
    ("Alan" 65 72 70)
    ("Edsger" 88 91 84)
    ("Barbara" 55 61 58)))

(defun average (scores)
  (/ (reduce #'+ scores) (float (length scores))))

(defun letter-grade (score)
  (cond ((>= score 90) "A")
        ((>= score 80) "B")
        ((>= score 70) "C")
        ((>= score 60) "D")
        (t "F")))

(defun report-row (record)
  (let* ((name (first record))
         (scores (rest record))
         (mean (average scores)))
    (format t "~10a ~{~5d~} ~9,2f ~a~%"
            name scores mean (letter-grade mean))))

(format t "~10a ~15a ~9a ~a~%" "student" "scores" "average" "grade")
(dolist (record *students*)
  (report-row record))

(let* ((means (mapcar (lambda (record) (average (rest record))) *students*))
       (class-mean (/ (reduce #'+ means) (length means)))
       (passing (count-if (lambda (mean) (>= mean 70)) means)))
  (format t "~%class average ~,2f over ~d student~:p~%"
          class-mean (length means))
  (format t "passing at 70 or better: ~d of ~d~%" passing (length means))
  (format t "highest average: ~,2f~%" (reduce #'max means)))

Cómo funciona

  1. average divide por (float (length scores)) para que el resultado no sea una razón.
  2. letter-grade recorre un cond desde 90 hasta la cláusula final t.
  3. ~10a ~{~5d~} ~9,2f alinea las columnas; count-if cuenta los promedios de 70 o más.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
37
Caracteres a escribir
1097
Tokens
262
Ritmo de tres estrellas
75 tpm

Al ritmo de tres estrellas de 75 tokens por minuto, este intento toma unos 210 segundos.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →