たのしいRuby 第10章 練習問題

たのしいRuby 第10章 数値(Numeric)クラスの練習問題をやってみた。

(1)と(2)は華氏を摂氏、もしくは逆の摂氏を華氏に変換するプログラムを書けと言う問題。小数点以下を求める為に引数をFloat()で囲む。そんなに難しい問題じゃないので、テストはかなり適当。

def cels2fahr(cels)
  Float(cels) * 9 / 5 + 32
end
require 'test/unit'
require 'cels2fahr'

class TestCels2Fahr < Test::Unit::TestCase
  def test_cels2fahr
    assert_equal(50, cels2fahr(10))
    assert_equal(77, cels2fahr(25))
  end
end
def fahr2cels(fahr)
  (Float(fahr) - 32) * 5 / 9
end
require 'test/unit'
require 'fahr2cels'

class TestFahr2Cels < Test::Unit::TestCase
  def test_fahr2cels
    assert_equal(10, fahr2cels(50))
    assert_equal(25, fahr2cels(77))
  end
end

(3)は乱数の問題。1から6までの数字を出力するメソッドdiceを実装する。乱数のテストって何書いたらいいんだろう。今回はテストは用意しなかったけど、1から6までの数値かどうかのテストぐらいは用意するべきだったのかな。

def dice
  rand(6) + 1
end

(4)は引数が素数かどうかを調べるメソッドの実装。2より小さい数(負数、0、1)は即falseを返す。それ以上の数は引数の平方根までの数で割り切れるか調べ、途中で割り切れたら素数ではないので、falseを返す。ループを抜けたら素数なのでtrueを返す。

def prime?(num)
  return false if num < 2
  (2..Math.sqrt(num)).each do |i|
    return false if (num % i).zero?
  end

  true
end
require 'test/unit'
require 'prime'

class TestPrime < Test::Unit::TestCase
  def test_prime
    assert(!prime?(0))
    assert(!prime?(1))
    assert(prime?(2))
    assert(prime?(3))
    assert(!prime?(4))
    assert(prime?(5))
    assert(prime?(13))
    assert(prime?(17))
    assert(prime?(113))
  end
end

書いたコードはCodeReposにCommitしてみた(/dan/ruby/tanoshi_ruby/sec10_numeric/)。突っ込み、添削大歓迎です。これぐらいの規模のプログラムだと添削とかしづらいかもですが。

たのしいRuby 第2版 Rubyではじめる気軽なプログラミング
たのしいRuby 第2版 Rubyではじめる気軽なプログラミング高橋 征義 後藤 裕蔵

おすすめ平均
starsプログラミング初心者にとっては少し難易度が高いかも
stars変数のスコープと寿命について詳しく書いて欲しかった
stars練習問題の内容にやや難あり
starsRubyをこれから覚える方は必読かも
stars読みやすいだけ

Amazonで詳しく見る
by G-Tools