2014-12-23 3 views
0
def factors_to_three (n) 
    puts n 

    if n % 3 == 0 
    puts "Your number is divisible by 3" 
    else 
    puts "Your Number is NOT divisible by 3" 
    end 
end 

puts "Enter the number to check if its divisible by 3" 
number = gets.chomp 
factors_to_three(number) 

Независимо от того, на каком количестве я ввожу, моя программа всегда выводит Your Number is NOT divisible by 3, даже если это ясно.Что не так с оператором модуля в этом Ruby-коде?

ответ

2

Ваш результат всегда будет false потому gets.chomp возвращает строку:

number = gets.to_i 

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

Таким образом, вы могли бы проверить первый так:

number = gets 
factors_to_three(number.to_i) if number.is_a?(Integer) 
+1

Не нужно 'chomp' значение. 'to_i' будет заботиться только о цифрах в строке и будет игнорировать конечную новую строку. См. «[Всегда ли нужно использовать« chomp »перед использованием' to_i' или 'to_f'?] (Http://stackoverflow.com/questions/20598679/is-it-ever-necessary-to-use-chomp- прежде чем использовать-to-i-or-to-f) »для получения дополнительной информации. –

+0

Спасибо Tin Man, ответ изменился, чтобы удалить chomp. – Rots

2

Когда текст читается с использованием gets, он считывается как строка. Так что в вашем коде number на самом деле не число, а строка. Из-за этого, оператор «модуль», на самом деле не оператора модуля, но оператор формата на String, String#%:

Format-Польза ул как спецификации формата, и возвращает результат его применения к arg. Если спецификация формата содержит более одной подстановки, тогда arg должен быть массивом или хэшем, содержащим значения, подлежащие замене. См. Kernel :: sprintf для получения подробной информации о строках формата.

"%05d" % 123        #=> "00123" 
"%-5s: %08x" % [ "ID", self.object_id ] #=> "ID : 200e14d6" 
"foo = %{foo}" % { :foo => 'bar' }  #=> "foo = bar" 

Как вы можете видеть, этот метод возвращает строку, которая не равна нулю. Поэтому в этой программе всегда будет указано, что номер не делится на 3, даже если это так.

Вы можете это исправить, вызвав to_i на входе вернулся из get:

number = gets.chomp.to_i 
+0

Нет необходимости использовать 'chomp'. См. «[Всегда ли нужно использовать« chomp »перед использованием' to_i' или 'to_f'?] (Http://stackoverflow.com/questions/20598679/is-it-ever-necessary-to-use-chomp- прежде чем использовать-to-i-or-to-f) »для получения дополнительной информации. –

3

n не является целым числом. gets() возвращает строку, а chomp удаляет новую строку, но данные по-прежнему являются строкой.

"6" % 3 != 0 
6 % 3 == 0 

Вам необходимо преобразовать ваши данные в целочисленное представление.