;; assign_letter_grade consumes a number and produces a symbol.
;;
;; (assign_letter_grade ave) produces either 'A, 'B, 'C, 'D or 'F
;; depending on the average. This function uses the following
;; (contorted) grading function:
;;
;; if the grade is > 90
;; then the grade is 'A
;; otherwise,
;; if the grade is > 80
;; then if the grade is even, it is B+, otherwise B-
;; otherwise if the grade > 65,
;; then if the grade is divisible by 5 it is an 'A,
;; otherwise a 'c'
;; otherwise the grade is F
;;
;; example: (assign_letter_grade 86)
(define (assign_letter_grade ave)
(cond
;; if average is above 90 - A
[(> ave 90) 'A]
;; if average is between 80 and 90
[(> ave 80)
(cond
;; if average is even, grade is B+
[(= 0 (modulo ave 2)) 'B+]
;; if average is odd, grade is B-
[else 'B-])]
;; if average is between 65 and 80
[(> ave 65)
(cond
;; if average is divisible by 5, grade is A
[(= 0 (modulo ave 5)) 'A]
;; otherwise grade is C
[ else 'C])]
;; average is less than 65 - grade is F
[else 'F]))
;; assign_letter_grade tests
;;(assign_letter_grade 92) ; should produce 'A
;;(assign_letter_grade 89) ; should produce 'B-
;;(assign_letter_grade 88) ; should produce 'B+
;;(assign_letter_grade 70) ; should produce 'A
;;(assign_letter_grade 35) ; should produce 'F