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
averagedivide por(float (length scores))para que el resultado no sea una razón.letter-graderecorre unconddesde 90 hasta la cláusula finalt.~10a ~{~5d~} ~9,2falinea las columnas;count-ifcuenta los promedios de 70 o más.
Palabras clave y builtins usados aquí
conddefparameterdefundolistfirstfloatformatlambdalengthmapcarmaxreducerest
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.
Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.