改造1回目

前回のソース
悪い所が沢山(ほとんど?)あったわけですが
大きな問題を2つ抜き出してみると


1.各種アベレージを求める部分など、共通化できる所が多い
2.無限小数が出現した場合、出力された数値の扱いが悪い
と言った所でしょうか


各種アベレージは、「総スコアorストライク数orスペア数」を「ゲーム数」で割った物です
つまり、計算式自体は同じ形をしていますので、この部分は共通の処理として書けるはず


無限小数に関しては、繰り上がり等の処理をしてやれば解決するはず


そこで、まずは「アベレージ計算処理の共通化」から
rubyでは、同じ処理を抜き出してやる事を、「メソッド化」すると言います<書式>
def(仮引数)←引数は、「,」区切りで複数指定可能
  文←処理を書く
end
で、アベレージ処理のメソッドを書くとすると

def average(numerator,denominator)
	numerator.to_f/denominator.to_f
end

numerator,denominatorはそれぞれ分子・分母の英語
「.to_f」は「.の前にある数値をフロート型に変換する」
フロート型ってのは、浮動小数点。つまり、小数点以下も扱える数字って事
これを付けていないと、例えば「5÷2」は「2.5」ではなく「2」となる(小数点以下は無視される)
これを使って、前回のソースを書き直すと(前半部のみ)

puts 'EDNの総スコアを入力してください'
e_score = gets.chomp
puts 'EDNの総ゲーム数を入力してください'
e_game = gets.chomp
puts 'EDNの総ストライク数を入力してください'
e_strike = gets.chomp
puts 'EDNの総スペア数を入力してください'
e_spare = gets.chomp
puts 'EDNのハイゲームを入力してください'
e_higame = gets.chomp
puts 'あなたのアベレージは ' + ave(e_score,e_game).to_s + ' です'
puts 'あなたのストライクアベレージは ' + ave(e_strike,e_game).to_s + ' です'
puts 'あなたのスペアアベレージは ' + ave(e_spare,e_game).to_s + ' です'

大分すっきりしました。ただ、引数の「e_game」の部分は共通していますので、さらに簡略化できそうですね
ただ、このままでは「無限小数の問題」が解決していません


繰り上がり等の処理に関しては、ruby標準メソッドで提供されています
切り上げはNumeric#ceilメソッド、切り捨てはNumeric#truncateメソッド、四捨五入はNumeric#roundメソッドを使用します

f = 3.4
p f.ceil #=> 4
p f.truncate #=> 3
p f.round #=> 3

f = 3.5
p f.round #=> 4

今回は、「四捨五入の.roundメソッド」を使いましょう
これを使い、先ほどのaverageメソッドを書き直すと

def average(numerator,denominator)
	(numerator.to_f/denominator.to_f).round.to_f
end

これで完璧!
かと思いきや、「100÷3」を実行させてみると「33.0」と表示されました
これでは、せっかくフロート型にして小数点以下まで表示できるようにした意味がありません
小数点第2位あたりで四捨五入するにはどうしたら良いでしょう?


と言うところで、次回に続くw