;; The first three lines of this file were inserted by DrRacket. They record metadata ;; about the language level of this file in a form that our tools can easily process. #reader(lib "htdp-beginner-reader.ss" "lang")((modname 11-gradelist) (read-case-sensitive #t) (teachpacks ()) (htdp-settings #(#t constructor repeating-decimal #f #t none #f () #f))) (require 2htdp/image) (require 2htdp/universe) ; A Posn is (make-posn Number Number) #; (define (process-posn a-posn ...) ... (posn-x a-posn) ... (posn-y a-posn) ...) ; A PosnLst is one of: ; - empty ; - (cons Posn PosnLst) #; (define (process-plst a-plst ...) (cond [(empty? a-plst) ...] [else ... (first a-plst) ... ... (process-plst (rest a-plst) ...) ...])) ; plst-length : PosnLst -> Natural (define (plst-length a-plst) (cond [(empty? a-plst) 0] [else (add1 (plst-length (rest a-plst)))])) ;; "abc123" -> 53 ;; "xyz456" -> 56 ;; "jat789" -> 23 ; A GradePair is (make-grade-pair String Number) (define-struct grade-pair (name score)) #; (define (process-grade-pair gp ...) ... (grade-pair-name gp) ... (grade-pair-score gp) ...) ; A GradeTable is one of: ; -- empty ; -- (cons GradePair GradeTable) #; (define (process-grade-table gt ...) (cond [(empty? gt) ...] [else ... (first gt) ... ... (process-grade-table (rest gt) ...) ...])) ; count-grades : GradeTable -> Number ; To find out the number of grades in the table. ; Examples: (check-expect (count-grades empty) 0) (check-expect (count-grades (cons (make-grade-pair "abc123" 53) (cons (make-grade-pair "xyz456" 56) (cons (make-grade-pair "jat789" 23) empty)))) 3) ; Strategy: struct. decomp. (define (count-grades gt) (cond [(empty? gt) 0] [else (add1 (count-grades (rest gt)))])) ; lookup-grade : GradeTable String -> Number ; Looks up a grade by name, returning 0 if not found. ; ; Strategy: struct. decomp. (define (lookup-grade gt name) (cond [(empty? gt) 0] [else (cond [(is-name-of? name (first gt)) (grade-pair-score (first gt))] [else (lookup-grade (rest gt) name)])])) ; is-name-of? : String GradePair -> Boolean ; Is the given name the name of the grade pair? (check-expect (is-name-of? "me" (make-grade-pair "you" 55)) false) (check-expect (is-name-of? "you" (make-grade-pair "you" 55)) true) ; Strategy: function composition (define (is-name-of? name gp) (string=? name (grade-pair-name gp))) (check-expect (lookup-grade (cons (make-grade-pair "abc123" 53) (cons (make-grade-pair "xyz456" 56) (cons (make-grade-pair "jat789" 23) empty))) "xyz456") 56) (check-expect (lookup-grade (cons (make-grade-pair "abc123" 53) (cons (make-grade-pair "xyz456" 56) (cons (make-grade-pair "jat789" 23) empty))) "els837") 0) ; set-grade : GradeTable String Number -> GradeTable ; Associate a name with a grade, and keep the old stuff ; ; Strategy: struct. decomp. (define (set-grade gt name score) (cond [(empty? gt) (cons (make-grade-pair name score) empty)] [else (cond [(is-name-of? name (first gt)) (cons (make-grade-pair name score) (rest gt))] [else (cons (first gt) (set-grade (rest gt) name score))])])) (check-expect (set-grade (cons (make-grade-pair "abc123" 53) (cons (make-grade-pair "jat789" 23) empty)) "xyz456" 56) (cons (make-grade-pair "abc123" 53) (cons (make-grade-pair "jat789" 23) (cons (make-grade-pair "xyz456" 56) empty)))) (check-expect (set-grade (cons (make-grade-pair "abc123" 53) (cons (make-grade-pair "jat789" 14) empty)) "jat789" 12) (cons (make-grade-pair "abc123" 53) (cons (make-grade-pair "jat789" 12) empty))) ;; ==> {"abc123" -> 53, "xyz456" -> 56, "jat789" -> 23} ;; (add-grade {"abc123" -> 53, "jat789" -> 23} "abc123" 55) ;; ==> {"abc123" -> 55, "jat789" -> 23} (define empty-grade-table empty) (check-expect (lookup-grade empty-grade-table "anything") 0) (check-expect (lookup-grade (set-grade empty-grade-table "something" 5) "anything") 0) (check-expect (lookup-grade (set-grade empty-grade-table "something" 5) "something") 5) (check-expect (lookup-grade (set-grade (set-grade empty-grade-table "something" 5) "anything" 10) "something") 5) (check-expect (lookup-grade (set-grade (set-grade empty-grade-table "something" 5) "anything" 10) "anything") 10) (check-expect (lookup-grade (set-grade (set-grade (set-grade empty-grade-table "something" 5) "anything" 10) "something" 15) "something") 15) ; average-grade : GradeTable -> Number ; Finds the mean grade in the distribution. ; ; Examples: ; - (average-grade {}) => error! ; - (average-grade {a:2, b:3, c:7}) => 4 ; ; Strategy: function composition (define (average-grade gt) (/ (sum-grade-table gt) (count-grades gt))) (check-error (average-grade empty)) (check-expect (average-grade (cons (make-grade-pair "a" 2) (cons (make-grade-pair "b" 3) (cons (make-grade-pair "c" 7) empty)))) 4) ; sum-grade-table : GradeTable -> Number ; Adds up the grades in a grade table. ; ; Examples: ; - (sum-grade-table {}) => 0 ; - (sum-grade-table {a:3, b:4, c:5}) => 12 ; ; Strategy: struct. decomp. (define (sum-grade-table gt) (cond [(empty? gt) 0] [else (+ (grade-pair-score (first gt)) (sum-grade-table (rest gt)))])) (check-expect (sum-grade-table empty) 0) (check-expect (sum-grade-table (cons (make-grade-pair "a" 3) (cons (make-grade-pair "b" 4) (cons (make-grade-pair "c" 5) empty)))) 12)