「たのしいRuby」 第10章 数値(Numeric)クラス
すごい勢いで食べて昼寝して…な生活をしているbonlifeです。軽くどころじゃなくヤバイです。しかも髭面ですし…。というのは置いておいて、Rubyの勉強の記録をメモしておきます。完全には消化できていないので、とりあえず練習問題のbonlife的解答(間違い含む)とコメントをメモしてみます。まずは第10章の数値(Numeric)クラスの練習問題です。
ex10-1.rb
- 摂氏温度を華氏温度に変換するメソッドcels2fahrを定義する
- 変換の公式は「 華氏 = 摂氏 × 9 ÷ 5 + 32 」
def cels2fahr(cels) cels.to_f * 9 / 5 + 32 end p cels2fahr(32)
出力結果は以下の通り。
89.6
解答例を見て気づいたことは以下の通り。
- String#to_fで引数を浮動小数点数(Float)に変換しているが、Float(arg)を使った方が適切な例外(ArgumentError)を発生させることができて良い
- 明示的にreturnを書いた方が何を返すのかが分かりやすいかもしれない
ex10-2.rb
- 華氏温度を摂氏温度に変換するメソッドfahr2celsを定義する
- 摂氏1度から摂氏100度まで1度きざみに華氏温度との対応を出力
def cels2fahr(cels) cels.to_f * 9 / 5 + 32 end def fahr2cels(fahr) ( fahr.to_f - 32 ) * 5 / 9 end # far2cels()のテスト p fahr2cels(30) # 摂氏1度から摂氏100度まで表示 print "摂氏\t華氏\n" 100.times{|i| print i+1, "\t" print cels2fahr(i+1), "\n" }
出力結果は以下の通り。
-1.11111111111111 摂氏 華氏 1 33.8 2 35.6 3 37.4 4 39.2 5 41.0 (中略) 96 204.8 97 206.6 98 208.4 99 210.2 100 212.0
解答例を見て気づいたことは以下の通り。
- 後半部分の回答が準備されていない様子 (問い合わせてみます)
ex10-3.rb
- randメソッドを使い、1から6までの数字をランダムに返すメソッドdiceを定義する
def dice rand(6) + 1 end 10.times{ p dice }
出力結果は以下の通り。
2 5 3 3 6 3 6 1 2 6
解答例を見て気づいたことは特になし。同じでした。
ex10-4.rb
- 整数numが素数であるかどうかを調べるメソッドprime?(num)を定義する
def prime?(num) if (num < 2) return false end i = 2 while ( i < num ) if ( num % i == 0 ) return false else i += 1 end end return true end print "素数かどうかのチェック\n" 100.times{|i| print i+1, "\t" print prime?(i+1), "\n" }
出力結果は以下の通り。
素数かどうかのチェック 1 false 2 true 3 true 4 false 5 true 6 false (後略)
解答例を見て気づいたことは以下の通り。
- numの平方根まで割り算を行って、すべての剰余が0でなければ良い、なんて文系人間にはちょっと思いつきません
- uptoを使った方が、上記で行っているようなiをインクリメントする処理が不要でスッキリ書ける
timesやuptoなどのイテレータはすごく便利っぽいですね。まだRuby素人ですが、Rubyっぽい気がします。最初、行の末尾にセミコロン(;)を付けない書き方に違和感があったのですが、早くも慣れてきました。他の言語で簡単なスクリプトを書く時、頻繁に文法エラーを起こしてしまいそうですよ。そんなこんなで「たのしいRuby」で楽しく勉強中です。早くRails、Rails言う人になりたいです。(いつになることやら…。)