如标题中所述,无论我设置为输入的结果如何,它总是给出其他结果,这意味着F. 我花了一些时间寻找原因,但我无法弄清楚。 我习惯使用Java作为一种语言而且我刚刚开始使用ruby,因此我尝试相应地编写我在Java中所知道的代码,这可能是错误。
class Test
@g1
@g2
@g3
@avg
@grade
def initialize(g, gg, ggg)
@g1 = g
@g2 = gg
@g3 = ggg
end
def setAVG
@avg = (@g1.to_f + @g2.to_f + @g3.to_f)/3.0
end
def getScore
if @avg.to_f >= 90 and @avg.to_f <= 100
@grade = 'A'
elsif @avg.to_f >= 80 and @avg.to_f <= 89
@grade = 'B'
elsif @avg.to_f >= 70 and @avg.to_f <= 79
@grade = 'C'
elsif @avg.to_f >= 60 and @avg.to_f <= 69
@grade = 'D'
else
@grade = 'F'
end
@grade
end
end
puts 'Enter g1'
gr1 = gets()
puts 'Enter g2'
gr2 = gets()
puts 'Enter g3'
gr3 = gets()
gradesArr = [gr1, gr2, gr3]
for g in 0..gradesArr.length
if gradesArr[g].to_f <0 or gradesArr[g].to_f > 100
puts "Reset program with correction at the #{g+1} grade"
abort
end
end
grObj = Test.new(gr1,gr2,gr3);
puts "YOUR GRADE IS: #{grObj.getScore} #{grObj.setAVG}"
也可以随意告诉我这些是否是ruby标准,例如,我知道在java中你通常输入一个get方法的返回值,但是在ruby中,你只需要编写变量。
感谢您的时间。
答案 0 :(得分:3)
这是一个更简单的课程,你可以实现:
class Test
attr_accessor :scores
def initialize(*scores)
@scores = scores
end
def average
scores.sum / scores.size
end
def grade
case average
when 90..100 then "A"
when 80...90 then "B"
when 70...80 then "C"
when 50...70 then "D"
when 0...50 then "F"
end
end
end
用法:
t = Test.new(78, 88, 92)
t.average #=> 86
t.grade #=> "B"
提示:
attr_accessor
对类变量进行读/写访问case
语句而不是长if/else
语句注意:对于Ruby版本&lt; 2.4,使用scores.reduce(:+)
代替scores.sum
。