scheme为给定列表中的所有成绩添加5并更新该字母

时间:2014-11-23 19:53:11

标签: scheme racket

我正在尝试设计一个功能,在给定列表中为所有成绩添加5并更新其字母等级。

以下是成绩的数据定义

;; A Grade is: (make-grade Symbol Number)
(define-struct grade (letter num))

成绩中的符号代表:

'A  >= 90,'B  >= 80,'C  >= 70,'D  >= 60,'F  < 60

测试清单,

(define grades 
(list (make-grade 'D 62) (make-grade 'C 79) (make-grade 'A 93) (make-grade 'B 84) 
      (make-grade 'F 57) (make-grade 'F 38) (make-grade 'A 90) (make-grade 'A 95)
      (make-grade 'C 76) (make-grade 'A 90) (make-grade 'F 55) (make-grade 'C 74)
      (make-grade 'A 92) (make-grade 'B 86) (make-grade 'F 43) (make-grade 'C 73)))

我想知道如何将当前状态的成绩字母更新为成绩列表,我们是否使用构建列表然后考虑条件?或者是其他东西?

如果只为所有成绩添加5,我只需使用地图功能,

;; add5: Lof[Grade] -> Lof[grade-num] 
;; adds 5 to all of the Grades in a given list 

(define (add5 log)
  (map 
   (lambda (a-grade) 
     (+ (grade-num a-grade) 5)) 
     log))

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以使用map来创建具有更新值的新成绩。如果当前成绩编号加上5大于100,请注意,在我的代码中,我添加了限制,即任何成绩都不能超过100。假设您已经实施了将成绩数字转换为字母的程序(让我们称之为number->letter),这是一种可能的解决方案:

(define (add5 log)
  (map (lambda (grade)
         (let ((new-grade (+ (grade-num grade) 5)))
           (if (<= new-grade 100)
               (make-grade (number->letter new-grade) new-grade)
               (make-grade 'A 100))))
       log))