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])
答案 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])