scheme为给定列表中的所有等级添加5,并更新字母

scheme为给定列表中的所有等级添加5,并更新字母,scheme,racket,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 我想知道如何根据当前状态将成绩字母更新到成绩列表中,我们是否使用构建列表,然后调整条件?还是别的什么 为了

我试图设计一个函数,将给定列表中的所有等级添加5,并更新其字母等级

这是等级的数据定义

;; A Grade is: (make-grade Symbol Number)
(define-struct grade (letter num))
等级中的符号表示:

'A  >= 90,'B  >= 80,'C  >= 70,'D  >= 60,'F  < 60
我想知道如何根据当前状态将成绩字母更新到成绩列表中,我们是否使用构建列表,然后调整条件?还是别的什么

为了给所有的分数加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))
提前谢谢

您可以使用地图进行此操作,只需使用更新的值创建一个新的坡度。如果当前的分数加上5大于100,请小心,在我的代码中,我添加了一个限制,即任何分数都不能大于100。假设您已经实现了将分数转换为字母的过程,我们称之为数字->字母,这是一种可能的解决方案:

(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))

这清楚地表明你的设计有缺陷。等级应该只是一个数字,字母可以随时从数字中计算出来。但就目前情况而言,您的结构中存在冗余信息,而冗余正是造成问题的原因。顺便说一句,如果grade有一个最大值,例如99,您希望在add5过程中检查结果是否不高于最大值。@LEPETTPRINCE grade是一个包含等级字母和等级号的结构。所以我想用一种更简单的方式来做。首先,我把成绩表分成两部分,纯数字和纯字母。我可以建立一个数字列表add5,并检查其中没有一个超过100。然后用成绩表一个接一个地填写数字。谢谢奥斯卡!我有处理等级转换的功能。亲爱的驾车者:有意见吗?如果这个答案可以改进的话,我很想知道。没有评论、没有明显理由的否决票是毫无帮助的。
(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))