Схема функций высшего порядка - Калькулятор среднего балла

Я пытаюсь написать калькулятор GPA на языке схемы. Единственная часть, с которой, как мне кажется, у меня проблемы, - это часть, в которой мне нужно преобразовать буквы в целые числа в списке. Я использую eq? в приведенном ниже коде, потому что в одном из своих примеров наш профессор использовал eq? преобразовать букву в целое число.

(define creditSum 
  (lambda (lst)
    (if (or (not (list? lst)) (empty? lst))
        0
        (+ (car lst) (creditSum (cdr lst))))))

(define (gpa lst x)
  (cond
   ((eq? x "A") 4.0)
   ((eq? x "B") 3.0)
   ((eq? x "C") 2.0)
   ((eq? x "D") 1.0)
   ((eq? x "F") 0.0)
   (/ (creditSum x) (length x))))

Я хочу присвоить число каждой букве и использовать эти буквы, чтобы получить вывод в виде целого или десятичного числа. Например, если я ввожу: (gpa '(A B A B)), мой вывод должен быть 3,5.


person Zzhh82    schedule 30.06.2015    source источник
comment
экв.? может быть неправильным сравнением для строк. (eq? "a" "a") не обязательно верно. Вместо этого вам нужно использовать equal?< /а>.   -  person Joshua Taylor    schedule 01.07.2015
comment
экв.? не преобразует букву в целое число. экв.? — это отношение эквивалентности, о котором вы можете узнать больше в документации. Ваш профессор, возможно, сделал ошибку, или вы, возможно, неправильно поняли своего профессора, но eq? не преобразует буквы в целые числа.   -  person Joshua Taylor    schedule 01.07.2015
comment
В (eq? x "D") вы сравниваете строку и значение переменной x. Когда вы пишете '(A B A B), у вас есть список символов (не строк!), поэтому значение x будет символом. Ни один символ не будет равен строке.   -  person Joshua Taylor    schedule 01.07.2015
comment
Итак, есть ли встроенная функция, которую я мог бы использовать для преобразования символа в целое число?   -  person Zzhh82    schedule 01.07.2015
comment
Какой символ вы попытаетесь преобразовать в целое число?   -  person Joshua Taylor    schedule 01.07.2015
comment
Кажется, что вы действительно хотите сделать здесь сопоставление оценки (представлена ​​ли она в виде строки, символа и т. д., это другой вопрос) в число, а затем взяв среднее значение списка чисел.   -  person Joshua Taylor    schedule 01.07.2015
comment
Звучит хорошо, я попробую составить карту, чтобы увидеть, смогу ли я заставить ее работать. Спасибо!   -  person Zzhh82    schedule 01.07.2015


Ответы (1)


Вы путаете понятия. Во-первых, вам нужно преобразовать оценку в число, для этого вы можете использовать вспомогательную процедуру, и обратите внимание, что лучше использовать символы вместо строк (быстрее сравнение, легче писать):

(define (grade->number x)
  (cond
    ((eq? x 'A) 4.0)
    ((eq? x 'B) 3.0)
    ((eq? x 'C) 2.0)
    ((eq? x 'D) 1.0)
    ((eq? x 'F) 0.0)))

Теперь нам просто нужно применить описанную выше процедуру к каждому из элементов, добавить их и найти среднее значение — это та часть, где в игру вступает функция более высокого порядка, посмотрите, как мы используем map:

(define (gpa lst)
  (/ (creditSum (map grade->number lst))
     (length lst)))

На самом деле, credit-sum также можно выразить с помощью существующих процедур — нет необходимости изобретать велосипед!

(define (creditSum lst)
  (apply + lst))

Например:

(gpa '(A B A B))
=> 3.5
person Óscar López    schedule 30.06.2015
comment
Хороший ответ. Было бы еще лучше использовать символы вместо строк, чтобы вы могли использовать (gpa '(A B C)) вместо (gpa '("A" "B" "C")). Преимущество возможности использовать eq? для сравнения (это быстрее и проще набирать!) - person Jay; 01.07.2015
comment
@Jay Это хорошее предложение, я пытался следовать предложенному OP решению, но лучше показать ему / ей предпочтительный способ работы в Scheme. Я отредактировал свой ответ :) - person Óscar López; 01.07.2015
comment
Большое спасибо!!! Я боролся с этим вопросом в течение многих часов. Теперь я понимаю, как это работает! Теперь это действительно имеет смысл. Я застрял на части преобразования букв в цифры. А еще мне нравится, как вы делаете короткую и красивую процедуру для кредитной суммы! Когда я сравниваю его со своим....! ржу не могу - person Zzhh82; 02.07.2015