Как преобразовать строку в целое число в Ruby - PullRequest
0 голосов
/ 28 января 2011

Я новичок в ruby ​​и пытаюсь преобразовать строку в целое число.

Я пытаюсь вычислить средний балл, поэтому я использую get для ввода буквенной оценки (A, B, C,и т. д.), затем я преобразую каждый из них в соответствующие им числовые оценки (A = 4, B = 3, C = 2 и т. д.).Я нашел кучу информации о том, как преобразовать целое число в строки, но не строки в целое число.Есть предложения?

puts ("This program will calculate your GPA this semester")    
puts ("Please type your grade, then press enter")

puts("How many courses are you taking?")
num_courses=gets.chomp
puts("Your are taking #{num_courses} courses")

puts ("Use A, A-, B+, B, B-, C+, C, C-, D, or F (Press enter after typing each grade.)")

gradeList = []
gradeList.push gets.chomp while gradeList.last != ''
puts gradeList.sort

"A"=4
"A-"=3.7
"B+"=3.3

Обновление: Код полностью изменен.Я думаю, что я пришел к этому с неправильной точки зрения.Тем не менее, я все еще получаю сообщение об ошибке: grades.rb: 10: неопределенный метод `last 'для nil: NilClass (NoMethodError)

puts "This program will calculate your GPA this semester"
puts "Please type your grade, then press enter"

puts("How many courses are you taking?")
num_courses=gets.chomp
puts("Your are taking #{num_courses} courses")

puts ("Use A, A-, B+, B, B-, C+, C, C-, D, or F (Press enter after typing each grade.)")

grade=gets.chomp while grade.last != ''

if grade == "A"
  total=total+4
elsif grade=="B"
  total=total+3
elsif grade=="C"
  total=total+2
elsif grade=="D"
  total=total+1
end

gpa=total/num_courses
puts"Your GPA is #{gpa}"

Ответы [ 2 ]

2 голосов
/ 29 января 2011

Причина, по которой вы получаете эту ошибку, заключается в том, что 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}"

Есть несколько других способов сделать это, но, надеюсь, вышедостаточно прост, чтобы увидеть общие концепции, которые вы, возможно, изо всех сил пытались понять раньше.

Я надеюсь, что это поможет вам, но спросите что-нибудь, что вы можете по-прежнему удивляться.

2 голосов
/ 28 января 2011

Самым простым решением здесь, вероятно, будет хеш:

GRADE_VALUES = {
  "A" => 4,
  "A-" => 3.7,
  ...
}

gradeList = []
gradeList.push GRADE_VALUES[gets.chomp.strip] while gradeList.last != ''


puts gradeList

=> [3.7, 4, 3.3 ... ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...