使用一系列等级计算字母等级

时间:2013-05-20 01:45:46

标签: ruby-on-rails ruby

Noob to Ruby here。通过一些练习并撞墙。

练习:计算一系列成绩的字母等级

创建一个接受测试分数数组的方法get_grade。数组中的每个分数应该在0到100之间,其中100是最大分数。

计算平均分数并将字母等级作为字符串返回,即“A”,“B”,“C”,“D”,“E”或“F”。

我一直回复错误

avg.rb:1: syntax error, unexpected tLBRACK, expecting ')'
def get_grade([100,90,80])
               ^
avg.rb:1: syntax error, unexpected ')', expecting $end

这是我到目前为止所拥有的。我想坚持下面的方法或.join,因为我正在尝试使用我们在课堂上学习的方法。因此,总和,注入等不一定有用。我提前为请求的特殊性道歉:)我确信有更好的方法可以减少代码,但我只是想以这种方式开始学习它。

    def get_grade([100,90,80])
      get_grade = (array[0] + array[1] + array[2]).to_i / array.length.to_i
    case get_grade
      when 90..100
      "A"
      when 80..90
       "B"
      when 70..80
       "C"
      when 60..70
       "D"
      when 0..60
       "F"
      else
     "Error"
      end
    end

    puts get_grade([100,90,80])

5 个答案:

答案 0 :(得分:7)

您不能将像[100,90,80]这样的数组文字随机转储到函数定义的参数列表中。从功能体来看,我认为你的意思是接受一个参数array

def get_grade(array)
  grade = (array[0].to_i + array[1].to_i + array[2].to_i) / array.length
  case grade
    # unchanged
  end
end

答案 1 :(得分:1)

简洁地替换大case语句,以获得乐趣:

def letter_grade( score ) # assumes that score is between 0 and 100 (not 0-1)
  %w[F F F F F F D C B A][ (score/10.0).floor ] || 'A' # handles grades >=100
end

或者,更细化:

def letter_grade( score ) # score is between 0 and 100 (not 0-1)
  grades = %w[F F F F F F F F F F F F F F F F F F D- D D+ C- C C+ B- B B+ A- A A+ A+]
  grades[ (3.0*score/10).floor ]
end

答案 2 :(得分:0)

感谢今天的帮助!这就是我最终要做的就是让它不仅仅有3个参数。我使用了一个Array#each方法。我想那里有一个更优雅的解决方案,但它有效!从上午10点开始工作,非常感谢帮助!

def get_grade(array)
     sum = 0
   array.each do |element|
    sum += element
   end
   average = sum / array.length
    if average >= 90
      grade = "A"
    elsif average >= 80
      grade = "B"
    elsif average >= 70
     grade = "C"
   elsif average >= 60
     grade = "D"
   elsif average >= 0
    grade = "F"
   else
   "Error"
   end
end

puts get_grade([70,80,80,90,100])
puts get_grade([100,80,90,11,20])
puts get_grade([30,20,10,60,75])

答案 3 :(得分:0)

请记住,最高分为100(可以假设min为0)。

def get_grade(array)
sum = 0
array.each do |x|
    sum += x
end

average = sum / array.length

if average > 100
  print "Grades must be no more than 100!"
elsif average >= 90
  grade = "A"
elsif average >= 80
  grade = "B"
elsif average >= 70
  grade = "C"
elsif average >= 60
  grade = "D"
elsif average >=0
  grade = "F"
else 
  print "Grades must be no less than 0!"
end
grade
    end

puts get_grade([100,90,80]) == "A"
puts get_grade([98,90,80]) == "B"
puts get_grade([80,80,80]) == "B"
puts get_grade([55,45,35]) == "F"
puts get_grade([101,100,104]) 
puts get_grade([-2,-3,-4])  

答案 4 :(得分:0)

添加了一个过程,即使用户输入的分数超过100,也不会计入平均值。 还将switch语句重构为每行一行。如果这有帮助,请告诉我。祝好运。

  def get_grade array
    scores_under_100 = Proc.new {|score| score <= 100 && score > 0} 
    scores = array.select(&scores_under_100)
    average = scores.inject(:+) / scores.size

    case average
      when 90..100 then puts "A."
      when 80..89 then puts "B."
      when 70..79 then puts "C."
      when 60..69 then puts "D."
      else puts "F."
    end
  end

 puts get_grade([100, 100, 90, 67, 85, 200, 290, 299, 299])