2016-06-28 2 views
0

У меня есть этот код, где я вводю вход для сторон треугольника. В зависимости от значений он будет печатать его, треугольник равносторонний, изоселек или скальне. Он выполняет для чисел, но как я могу указать, что ввод должен быть целым? Например, если я набираю «w», он должен сказать недействительный или ошибку, но в этом случае он выполняется. Как я могу это решить?Как проверить, является ли ввод целым? - Ruby

В принципе, я ищу способ написать, что если строка должна быть введена, она должна отображаться как ошибка (тогда я бы написал инструкцию печати, заявив, что это недействительно). Могу ли я поместить это в другое заявление if? (До тех, которые упомянуты ниже)

Пример кода:

puts "Enter the triangle length" 
    x = gets.chomp 

    puts "Enter the triangle width" 
    y = gets.chomp 


    puts "Enter the triangle height" 
    z = gets.chomp 


    if x == y and y == z 
     puts "This triangle is equilateral" 
     else if 
     x==y or y == z or x==z 
      puts "This triangle is isoceles" 
     else if 
      x!=y and y!=z and x!=z 
      puts "this triangle is scalene" 
     end 
     end 
    end 
+0

Где Java часть? – shmosel

+0

Вы уверены, что не имеете в виду 'elsif' вместо' else if'? –

+0

В чем разница между elseif и else if? – small5

ответ

0

Есть несколько способов сделать это. Если вы позволили сделать знак, то

x =~ /^[+-]?\d+$/ 

было бы возможно.

Вам также придется подумать, разрешаете ли вы окружающие или внедряете пробелы (например, пробел между значком и первой цифрой).

0

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

Обратите внимание, что это не так надежно, как регулярное выражение, но оно охватывает большинство случаев.

if (input != '0') && (input.to_i.to_s != input.strip) 
    # input is not a number 
else 
    # input is a number 
end 

strip есть, если вы хотите принять вход с ведущим или конечные пробелы, в противном случае вы можете оставить его.

+0

Итак, это утверждение if в основном говорит о том, что до тех пор, пока ввод все еще является числом, и если строка может быть преобразована в целое число, она должна принимать и выполнять? – small5

+0

Советую вам открыть 'irb' и сыграть с' to_i', это может вас удивить, особенно когда вы вызываете 'to_i' в строке. Короче говоря, вызов 'to_i' в строке возвращает' 0'. Означает ли мое условие if сейчас? –

+0

Я изначально писал под каждой переменной (X = x.to_i и т. Д.), Но, тем не менее, я заметил, что даже если я ввел письмо, он каким-то образом ввел этот цикл if, потому что он был распознан как целое. Что будет делать регулярное выражение? – small5

0

Хотя все остальные ответы, вероятно, более или менее надежны, я бы пошел с другим. Поскольку у вас есть длины сторон треугольника, они должны быть больше нуля, не так ли? Тогда можно использовать побочный эффект метода String#to_i: для всего, что не преобразуется в целое число, оно возвращает ноль. Поэтому:

x = gets.chomp.to_i 
y = gets.chomp.to_i 
z = gets.chomp.to_i 

raise "Wrong input" unless x > 0 && y > 0 && z > 0 

# ... 
+0

Я попробовал команду поднять и работал для меня. Однако, мог бы я сделать заявление печати? I.E помещает «Недопустимый вход» (без ошибки, исходящей от компилятора?) – small5

+0

Конечно, просто измените 'raise' на' puts' или что-то еще. – mudasobwa

0

Вы можете сделать что-то вроде этого:

x = x.to_i 

puts "Please enter an integer" if x == 0 

Почему?

Потому что:

"ABC".to_i # returns 0 

Вы можете быть лучше вызвать полосу вместо грызть

gets.strip.to_i 

Пример:

## ruby user_age.rb 

# input variables 
name = "" 
years = 0 
MONTHS_PER_YEAR = 12 # a constant 

# output variable 
months = 0 

# processing 
print "What is your name? " 
name = gets.strip 

print "How many years old are you? " 
years = gets.strip.to_i 

puts "please enter an integer" if years == 0 

months = years * MONTHS_PER_YEAR 

puts "#{name}, at #{years} years old, "\ 
"you are #{months} months old." 
0

Я предполагаю, что любое значение строки что при преобразовании в float, равно целому числу, которое должно быть принято, и целочисленное значение должно быть возвращено. Более того, я предполагаю, что целые числа могут быть введены с помощью нотации (или "xEn"), где x является целым числом или поплавком, а n является целым числом.

def integer(str) 
    x = Float(str) rescue nil 
    return nil if x==nil || x%1 > 0 
    x.to_i 
end 

integer("3")  #=> 3 
integer("-3")  #=> -3 
integer("3.0")  #=> 3 
integer("3.1")  #=> nil 
integer("9lives") #=> nil 
integer("3e2")  #=> 300 
integer("-3.1e4") #=> -31000 
integer("-30e-1") #=> -3 
integer("3.0e-1") #=> nil 
0

Вы можете использовать Integer(), чтобы проверить, если строка содержит целое число:

Integer('1234') 
#=> 1234 

Integer('foo') 
#=> ArgumentError: invalid value for Integer() 

Это может быть объединен с retry:

begin 
    number = Integer(gets) rescue retry 
end 
Смежные вопросы