2015-06-30 131 views
2

我正在嘗試在計劃語言中編寫GPA計算器。我認爲我遇到問題的唯一部分是我需要將字母轉換爲列表中的整數的部分。我正在使用eq?在下面的代碼中,因爲在他的一個例子中,我們的教授使用eq?將一個字母轉換爲一個整數。計劃高階函數 - GPA計算器

(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

+0

可能不是用於字符串的正確比較。 '(eq?「a」「a」)'不一定是真的。相反,您需要使用[平等](http://www.schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_idx_218)。 –

+1

可能重複[eq?,eqv?,equal?和=在Scheme中有什麼區別?](http://stackoverflow.com/questions/16299246/what-is-the-difference-between-eq- eqv-equal-in-scheme) –

+0

eq?不會將字母轉換爲整數。情商?是一種等價關係,您可以在[文檔](http://www.schemers.org/Documents/Standards/R5RS/HTML/)中閱讀更多內容。你的教授可能犯了一個錯誤,或者你可能誤解了你的教授,但公式?不會將字母轉換爲整數。 –

回答

2

你是混淆的概念。首先,你要一個等級轉換成一個數字,爲​​此,你可以使用一個輔助程序,並發現它是更好地使用符號而不是字符串(更快的比較,更容易寫):

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

例如: 「EQ」

(gpa '(A B A B)) 
=> 3.5 
+0

很好的答案。用符號代替字符串會更好,所以你可以用'(gpa'(A B C))'代替'(gpa'(「A」「B」「C」))''。有能力使用'eq?'進行比較的優勢(輸入起來更快,更容易!) – Jay

+1

@Jay這是一個很好的建議,我試圖遵循OP的嘗試解決方案,但最好向他/她展示他/她的首選方式在計劃中做事。我編輯了我的答案:) –

+1

非常感謝你!我一直在努力解決這個問題很多小時。現在我明白它是如何工作的!現在真的很有意義。我一直在把字母轉換成數字。我也喜歡你如何爲CreditSum做一個簡短而好的程序!當我比較它與我的....!大聲笑 – Zzhh82