我正在尝试设计一个功能,在给定列表中为所有成绩添加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))
提前致谢。
答案 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))