5

鲁比在这里的菜鸟。通过一些练习并遇到了困难。

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

创建一个接受测试分数数组的方法 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])
4

5 回答 5

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
于 2013-05-20T01:53:15.760 回答
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
于 2015-05-15T18:57:21.247 回答
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])
于 2014-05-16T06:11:43.820 回答
0

请记住,最高分数为 100(可以假设最低分数为 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])  
于 2014-04-04T14:22:59.423 回答
0

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

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])
于 2013-05-20T06:16:28.473 回答