【问题标题】:scheme adds 5 to all of the Grades in a given list and updates the letter方案将 5 添加到给定列表中的所有成绩并更新字母
【发布时间】: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,我可以简单地使用ma​​p函数,

;; 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。然后将数字与等级字母列表一一对应。

标签: scheme racket


【解决方案1】:

您可以为此使用map,只需使用更新后的值创建一个新成绩。如果当前等级号加上5 大于100,请注意,在我的代码中,我添加了任何等级不能大于100 的限制。假设您已经实现了一个将年级数字转换为字母的过程(我们称之为number-&gt;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))

【讨论】:

  • 感谢奥斯卡!我有处理成绩转换的功能。
  • 亲爱的驾车投票者:想发表评论吗?如果可以以任何方式改进这个答案,我想知道它。没有 cmets 且没有明显原因的 downvote 根本没有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2022-07-29
相关资源
最近更新 更多