【发布时间】:2014-11-24 11:42:54
【问题描述】:
我正在尝试设计一个函数,将给定列表中的所有成绩加 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,我可以简单地使用map函数,
;; 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))
提前致谢。
【问题讨论】:
-
这清楚地表明您的设计存在缺陷。
grade应该只是一个数字,字母可以随时从数字中计算出来。但就目前而言,您的结构中有冗余信息,而冗余正是在这里给您带来问题的原因。 -
顺便说一句,如果成绩有最大值(例如 99),您希望在
add5程序中检查结果不高于您的最大值。 -
@LePetitPrince Grade 是一个包含等级字母和等级编号的结构。所以这是我想以一种更简单的形式做到这一点的一种方式。首先,我将成绩单分为纯数字和纯字母两部分。我可以建立一个数字列表add5并检查它们是否超过100。然后将数字与等级字母列表一一对应。