2016-06-28 9 views
0

三角形の辺の入力にこのコードを入力します。値に応じて、三角形が等辺、アイソセン、またはスカラーで印刷されます。数値の値に対して実行していますが、入力を整数だけにするように指定するにはどうすればよいですか?たとえば、「w」と入力すると無効またはエラーと表示されますが、この場合は実行されます。これをどうすれば解決できますか?入力が整数かどうかをチェックする方法 - Ruby

基本的には、文字列が入力された場合は、エラーとして表示されるはずです(print文が無効であると書いています)。だから私はそれを別の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

「else if」ではなく「elsif」を意味するのではないですか? –

+0

elseifとelseの違いは何ですか? – small5

答えて

0

それを行うにはいくつかの方法があります。あなたが先行サインを許可する場合、

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

が考えられます。

また、周囲のスペースや埋め込みスペース(たとえば、記号と最初の数字の間のスペース)を許可するかどうかを考える必要があります。

0

整数を扱う場合は、これをrubyでチェックすることができます。

注:これは正規表現ほど堅牢ではありませんが、ほとんどのケースをカバーします。

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'を呼び出すと、あなたを驚かせるかもしれません。要するに、stringの 'to_i'を呼び出すと' 0'が返されます。私のif条件は今、意味がありますか? –

+0

私はもともと各変数(X = x.to_iなど)の下に書いていましたが、手紙を入力してもそれが整数として認識されていたので何とかそのループに入りました。正規表現は何をしますか? – small5

0

他のすべての回答はおそらく多かれ少なかれ堅牢ですが、私は別の回答に行くでしょう。あなたは三角形の辺の長さを持っているので、それらはゼロよりも大きくなければなりません、そうですか?次に、String#to_iメソッドの副作用を使用するかもしれません:整数に変換されていないすべてについてはゼロを返します。したがって:

x = x.to_i 

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

理由:

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

私はraiseコマンドを試して、私のために働いていました。しかし、私は印刷声明を書くことができますか? I.Eは "Invalid input"を入れます(コンパイラからのエラーなし) – small5

+0

もちろん、 'raise'を' puts'などに変更してください。 – mudasobwa

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"(または"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 
関連する問題