2015-05-10 6 views
-2

Я пишу простую и маленькую программу в Ruby для вывода порядкового номера числа, основанного на пользовательском вводе. Вот что я писал:Ошибка Ruby if/elseif

puts "Enter a number" 
number = gets.chomp.to_i 

conversion = number % 10 

if number == 11 || number == 12 || number == 13 
    puts "That is #{number}th" 

end 

if conversion == 1 
    puts "That is #{number}st" 
elsif conversion == 2 
    puts "That is #{number}nd" 
elsif conversion == 3 
    puts "That is #{number}rd" 
else 
    puts "That is #{number}th" 

end 

Как мой код показывает, что я хотел взять «номер» из пользовательского ввода, отрезать последний номер, и использовать это единственное число цифр, чтобы определить, действительно ли «номер» следует быть (fir) st, (seco) nd, (thi) rd или (4) -й тип ординала. Значение «конверсия» должно преобразовать это для меня. Однако можно видеть, что номера 11, 12 и 13 являются исключениями. Моя программа работает нормально, за исключением того, когда я входной один из этих трех значений, я получаю два результата, а не один, в терминале, такие как:

That is 11st 
That is 11th 

Мое намерение состоит в том, что «11» должен отображаться, а не «одиннадцатым ». Несмотря на то, что я пытался написать исключение в свой код, «преобразование» все равно выполняется. Я не уверен, какую ошибку я сделал, но есть ли способ изолировать первый оператор if, чтобы мое преобразование не включало 11, 12 и 13?

+1

'end [...] if conversion == 1' должно быть, должно быть' elsif conversion == 1'. – Biffen

ответ

3

Именно так у вас есть программа написана!

Если число равно 11,12,13, оно будет вызывать первый оператор if, как вы ожидаете. Затем он перейдет к следующему утверждению if, потому что у него нет никаких причин для завершения. puts не является оператором return/break (оператор return/break нарушает этот код, но это другая проблема), поэтому код будет продолжать работать до конца.

Самым простым решением было бы просто объединить два, если заявления в ваш основной, если/другое заявление:

if number == 11 || number == 12 || number == 13 
    puts "That is #{number}th" 
elsif conversion == 1 
    puts "That is #{number}st" 
elsif conversion == 2 
    puts "That is #{number}nd" 
elsif conversion == 3 
    puts "That is #{number}rd" 
else 
    puts "That is #{number}th" 
end 

Это предотвратит любое число от того, чтобы быть правдой в различных если петлями.