Lisp等级到字母的转换

时间:2018-10-01 01:50:27

标签: lisp common-lisp

问的问题:

Define a LISP function SCORE->GRADE which takes a single argument, s, and returns a symbol according to the following scheme:
 s ≥ 90 A           73 ≤ s < 77 C+
 87 ≤ s < 90 A–     70 ≤ s < 73 C
 83 ≤ s < 87 B+     60 ≤ s < 70 D
 80 ≤ s < 83 B      s < 60 F
 77 ≤ s < 80 B–
 If the argument s is not a number then the function should return NIL.

我的答案是这样的

 (defun SCORE->GRADE (s)
        (if (not (numberp s))  (return-from SCORE->GRADE “NIL”))
        (progn 
        (if (>= s 90) (return-from SCORE->GRADE "A"))
        (if (and (>= s 87) (< s 90)) (format nil “A-“))
        (if (and (>= s 83) (< s 87)) (format nil “B+”))
        (if (and (>= s 80) (< s 83)) (return-from SCORE->GRADE “B”))
        (if (and (>= s 77) (< s 80)) (return-from SCORE->GRADE “B-“))
        (if (and (>= s 73) (< s 77)) (return-from SCORE->GRADE “C+”))
        (if (and (>= s 70) (< s 73)) (return-from SCORE->GRADE “C”))
        (if (and (>= s 60) (< s 70)) (return-from SCORE->GRADE “D”)
        (if (< s 60) (return-from SCORE->GRADE “F”)) 
        )
      )
    )

它适用于90,返回A,然后对于其他任何东西,只要给出我输入的内容不同,它都会给出此错误

  

***-RETURN-FROM:变量“ B”没有值

     

***-如果是:变量“ A-”没有值

任何人都可以解释为什么我无法对每条相同的行都得到相同的结果吗?

我已经尝试过消息,格式t,案例,直到前3种案例的一些工作,然后停止。没办法弄清楚。

4 个答案:

答案 0 :(得分:5)

除了其他答案外,请注意,由于您试图将分数划分为成绩,因此您无需重复共同的界限。

(cond
  ((>= s 90) "A")
  ((>= s 87) "A-")
  ((>= s 83) "B+")
  ...
  ((>= s 70) "C")
  ((>= s 60) "D")
  (t "F"))

它还减少了必须保留在代码中的不变式的数量,这有助于维护。

答案 1 :(得分:4)

使用双引号解决问题时,以下是一些其他提示:

  • 您通常不需要在Lisp中使用RETURN-FROM
  • 最好使用COND而不是多个IF语句来检查多个条件。
  • >=>等功能可以接受两个以上的参数。

例如:

(cond ((not (numberp s)) NIL)
      ((>=    s 90)  "A" )
      ((>= 90 s 87)  "A-")
      ((>= 87 s 83)  "B+")
      ((>= 83 s 80)  "B" )
      ;...
      ((>= 60 s   )  "F" ))

答案 2 :(得分:2)

似乎您正在使用字符而不是"来包装字符串。

答案 3 :(得分:0)

我和@coredump有相同的想法。

(defun SCORE->GRADE (s)
  (cond ((not (numberp s)) nil)
        ((>= s 90) "A")
        ((>= s 87) "A-")
        ((>= s 83) "B+")
        ((>= s 80) "B")
        ((>= s 77) "B-")
        ((>= s 73) "C+")
        ((>= s 70) "C")
        ((>= s 60) "D")
        (t "F")))

以下公式可以更优雅地表示为:

(defun SCORE->GRADE (s)
  (when (numberp s)
    (cond ((>= s 90) "A")
          ((>= s 87) "A-")
          ((>= s 83) "B+")
          ((>= s 80) "B")
          ((>= s 77) "B-")
          ((>= s 73) "C+")
          ((>= s 70) "C")
          ((>= s 60) "D")
          (t "F"))))