2016-07-28 100 views
0

我試圖計算如果總分平均超過100,會發生什麼情況。我目前使用case語句輸出不同的分數。將表達範圍超過100的最佳解決方案,允許我們輸出'A +++'。你可以在Ruby中無限計算使用Case語句嗎?

def get_grade(score_1, score_2, score_3) 
    total = (score_1 + score_2 + score_3)/3 

    case total 
    # What if the score is above 100? 
    # I want it to express 'A+++' 
    when 90..100 then 'A' 
    when 80..89 then 'B' 
    when 70..79 then 'C' 
    when 60..69 then 'D' 
    else    'F' 
    end 
end 

p get_grade(91, 97, 93) # => 'A' 
p get_grade(52, 57, 51) # => 'D' 
p get_grade(105, 106, 107) # => 'A++' 
+2

我喜歡@尼克的方案中提到,但你可以添加以下行case語句之一:'當101。 .Float :: INFINITY然後'A +++'或'當101..total然後'A +++''。 –

回答

4

這將是else子句的典型情況。爲什麼不返工你case聲明是這樣的:

case total 
    when 90..100 then 'A' 
    when 80..89 then 'B' 
    when 70..79 then 'C' 
    when 60..69 then 'D' 
    when 0..59 then 'F' 
    else 'A+++' 
end 
+0

我當時想過這件事。我只是不知道是否有另一種方法來使用INFINITY或其他方法?謝謝! –

+0

你可以,但是Ruby沒有定義像'Fixnum :: MAX'這樣的常量。確定實際值會有點牽扯過,像[這裏](https://gist.github.com/pithyless/9738125)或[這裏](http://stackoverflow.com/a/736313/2116518) 。因此,堅持一個簡單的解決方案可能會更好。 –

+0

@NicNilov用戶如何傳遞一個或多個負數作爲參數(這使得總數<0)? – marmeladze

3

您可以結合的方法,如果你想打個小使用比較

... 
else 
    if total > 100 
     "A+++" 
    else 
     "F" 
    end 
end 

,你可以改變的情況下聲明:

(total > 100) ? "A+++" : "FFFFFFDCBAA"[(total/10).to_i] 
2

你可以提供一個proc的情況下,讓您使用的表達式如> 100

def get_grade(score_1, score_2, score_3) 
    total = (score_1 + score_2 + score_3)/3 

    case total 
    # What if the score is above 100? 
    # I want it to express 'A+++' 
    when 90..100 then 'A' 
    when 80..89 then 'B' 
    when 70..79 then 'C' 
    when 60..69 then 'D' 
    when ->(n) { n > 100 } then 'A+++' 
    else 'F' 
    end 
end 
+1

這是一個不錯的lambda使用,但它有點複製'case'語句的語義。 –

0

下面是使用無邊一個漂亮的解決方案:

首先@CarySwoveland

case total 
    when 101..Float::INFINITY then 'A+++' 
    when 90..100 then 'A' 
    when 80..89 then 'B' 
    when 70..79 then 'C' 
    when 60..69 then 'D' 
    else 'F' 
end 
相關問題