Ruby 標準入力値の取得(数値)

競技プログラミングなどでは、プログラムで使う値が「標準入力」で渡されます。その値の取得方法についてまとめていきます。

今回は、取得した値を数値として使用したい場合です。

数値を受け取る

標準入力で渡される値12を使って、以下のようなプログラムを作ってみたいと思います。

(例題)標準入力値(12)× 3 をして答えの「36」を出力する。

値の形式は文字列で、最後に改行が入った状態で渡されるものとする。

input = gets  #標準入力値をinputという名前の変数に代入
puts input  #=> 12

例の計算(12 × 3 = 36)をしてみます。

input = gets.chomp  #chompは改行コードの削除
puts input * 3  #=> 121212
p input * 3  #=> "121212"

"12"が文字列なので、"12"× 3回で"121212"になってしまいました。

文字列を数値に変換する

文字列と数値は、それぞれ扱いが異なります。以下のコードでは、123のようにクォーテーション記号で囲まれていないものは数値、"123"のように囲まれているものは文字列です。

#文字列や数値を計算してみた例
p 10 + 2  #=> 12  数値同士の足し算
p "10" + "2"  #=> "102"  文字列同士の足し算(そのまま並ぶ)
p "Hello" + "2"  #=> "Hello2"  文字列同士の足し算
p "Hello" + 2  #=> エラー!文字列と数値を足すことはできない
p 10 * 2  #=> 20  数値同士の掛け算
p "Hello" * 2  #=> "HelloHello"  文字列と数値の掛け算はできる

input * 3 = 36 の正しい結果を得るには、inputの中身を文字列から数値に変えてあげる必要があります。

ここではto_iを使います。 to_iは、to integer(整数へ)という意味で、文字列を整数に変換するメソッドです。整数とみなせない文字があればそこまでしか変換されないので、chompは省略できます。

input = gets.to_i
puts input * 3  #=> 36

期待どおりの結果が得られました!

小数の扱い

ちなみに、Integerつまり整数クラスのオブジェクトは小数点以下を扱うことができないので、小数点以下を含む数値の場合はto_fでFloatクラスのオブジェクトに変換する必要があります。

p "12.5".to_i  #=> 12
#to_iでは整数とみなせないものの前までが変換対象
p "12.5".to_f  #=> 12.5
p "12".to_f  #=> 12.0

整数と小数の計算は、整数と文字列の計算のようにエラーにはなりません。ただし、整数同士の計算結果は整数にしかならないので、計算結果として小数が想定される場合は注意が必要です。

#整数同士の計算結果は整数になる
p 3 / 2  #=> 1
#小数を得たいときは、計算に使う数値の1つ以上をあらかじめ小数にしておく
p 3.0 / 2  #=> 1.5
p 3 / 2.0  #=> 1.5

まとめ

  • 文字列と数値を一緒に計算することはできない
  • 文字列から整数に変換するには、to_i
  • 小数点以下を含む数値の場合は、to_f
  • 整数同士の計算結果は整数になる

docs.ruby-lang.org

docs.ruby-lang.org