Причина, по которой вы получаете эту ошибку, заключается в том, что grade
не определен на первой итерации.Вы не понимаете этого, потому что у вас есть while
, расположенное после действия.Вы должны написать это так:
while grade.last != '' {
grade=gets.chomp
}
Теперь, кроме того факта, что этот цикл не делает ничего, что вы хотите, эта форма намного лучше, потому что становится очевидным, что оценка nil
когда он оценивает.
Вот быстрая перезапись вашего кода ...
puts "This program will calculate your GPA this semester"
puts "How many courses are you taking?"
num_courses = gets.chomp.to_i # num_courses is now an integer
puts "You are taking #{num_courses} courses" # let's pretend num_courses = 4
puts "Use A, A-, B+, B, B-, C+, C, C-, D, or F"
values = { # using a hash will allow us to avoid a
"A" => 4, # large and inefficient if / elsif statement
"A-" => 3.7,
"B+" => 3.3,
"B" => 3,
}
total = 0.0 # sets our total prior to the loop for scope
num_courses.times do # so we will do this loop 4 times
total += values[gets.chomp.upcase] # looks up the value from our hash
end # and adds it to the (running) total
gpa = total / num_courses # calculates the gpa from the total
# and the num_courses we asked earlier
puts "Your GPA is #{gpa}"
Есть несколько других способов сделать это, но, надеюсь, вышедостаточно прост, чтобы увидеть общие концепции, которые вы, возможно, изо всех сил пытались понять раньше.
Я надеюсь, что это поможет вам, но спросите что-нибудь, что вы можете по-прежнему удивляться.