とりあえず発展課題の"現在価値計算"に関して
初級講座(2016/Feb/20開催)のレベルだと、
・3回計算する(同じ処理を変数を変えて3つ作る)
・最後に加算する
・累乗はfor
文で回す
って感じでした。
以下講座中で提示されたサンプルコード
#var input prompt
print("何年後にもらえますか?→")
year1 = gets.chomp.to_f
print("いくらもらえますか?→")
money1 = gets.chomp.to_f
print("何年後にもらえますか?→")
year2 = gets.chomp.to_f
print("いくらもらえますか?→")
money2 = gets.chomp.to_f
print("何年後にもらえますか?→")
year3 = gets.chomp.to_f
print("いくらもらえますか?→")
money3 = gets.chomp.to_f
#current value calc
for i in 1..year1
money1 = money1 / (1 + 0.05)
end
for i in 1..year2
money2 = money2 / (1 + 0.05)
end
for i in 1..year3
money3 = money3 / (1 + 0.05)
end
#summary
value = money3 + money2 + money1
print("現在価値の合計は",value,"です。\n")
こんな感じでした。
プログラミングレベルでいうと1です。
『ぬののふく』と『ひのきのぼう』を装備しているのでいくらでも戦えますしスライムを死ぬほど倒してレベル上げ狙えます。
が、効率よくサクサクプログラミングを進めてマシな感じにしたいなーとか感じたので、
プログラミングできないなりに"カッコ良く"書いてみましょう。
とりあえずprintとかputsとか使ってるとなんかカッコ悪いので不都合がない限りp
を使ってみましょう。
print ("hogehoge")
を全てp "hoge"
という書き方に置き換えます。
よくわからないですがp
はputs
と同じっぽいです。
金利5%固定とかわけわかんないですね。ここも変数にしてみましょう。
for
文の中のmoney0 = money0 / (1+0.05)
を
money0 = money / (1+rate)
にして、rate = gets.chomp.to_f
にします。
少数とか考えるの面倒臭いのでパーセンテージで入力できるようにした方が親切だし、
入力された値を100で割ってあげるようにしましょう。
rate = gets.chomp.to_f/100
にしたらokですね。
累乗もなぜかfor文で回してて微妙なので累乗演算子を使ってfor文をなくしてみましょう。
money0 = money0/(1+rate)**year
にできますね。
#interest rate
p "金利は何パーセント?"
rate = gets.chomp.to_f/100
#var imput prompt
p "何年後にもらえますか?"
year1 = gets.chomp.to_f
p "いくらもらえますか?"
money1 = gets.chomp.to_f
p "何年後にもらえますか?"
year2 = gets.chomp.to_f
p "いくらもらえますか?"
money2 = gets.chomp.to_f
p "何年後にもらえますか?"
year3 = gets.chomp.to_f
p "いくらもらえますか?"
money3 = gets.chomp.to_f
#current value calc
money1 = money1/(1+rate)**year1
money2 = money2/(1+rate)**year2
money3 = money3/(1+rate)**year3
#summary
value = money3 + money2 + money1
print("現在価値の合計は",value,"です。\n")
いい感じに短くできました。
しかしまだ同じようなことを繰り返していてダサいですね。
プログラムを組む時には「同じことを繰り返さない」ことが大事です。
3回も同じようなことを繰り返しているのは非常にダサいので同じことをしている部分はいっそまとめてしまいましょう。
計算した結果をsum
という変数に代入しておいてループごとにsum
に値を加算していくことで最終的にp sum
が結果表示になるようにします。
ついでに小数点第2位で丸めを行って金額を万単位で入力することで金額がわかりやすくなるようにしてみましょう。
#金利は現在の数字を入れてあげればいいだけなのでループの外に置いてしまう。
p "金利は何パーセント?"
rate = gets.chomp.to_f/100
sum = 0 #結果を入れておくための変数"sum"
#ループは3回
for i in 1..3
p "何年後にもらえますか?"
year = gets.chomp.to_f
p "何万円もらえますか?"
money = gets.chomp.to_f
money = money / (1+rate) ** year
sum += money
end
#少数を入れて計算したので、小数点第2位(100円台まで)で丸めを行う
print ("現在価値は",sum.round(2),"万円です。")
超ウルトラスーパー短くなりました。
これで最初の冗長なプログラムをスッキリした形に直すことに成功しましたね。
ここからさらにループを無限に回してbreak
を使うことでループ回数を自由に増やしたり、
金利をネットから自動で取得するようにしたりすると実用度がどんどん高まってちゃんとしたスクリプトになります。
現在価値計算スクリプトの需要があるかは全くわかりませんが、
同じことをしているスクリプトを整理するだけでここまでシンプルになるので、
ぜひもっとできる皆さんにやらせてみたらいいんじゃないでしょうか。
追記
ご指摘受けて調べてみたらRubyのp hoge
はデバッグ用(型の確認に使ったり)で間違いないようなので、
学習用のテストスクリプトとはいえちゃんとした方がいいでしょうしソースを修正してみます。
print
のスペースも地味にミスしているので修正しておきます。
scivolaさん、ご指摘ありがとうございました。
以下修正後
#金利は現在の数字を入れてあげればいいだけなのでループの外に置いてしまう。
print("金利は何パーセント?\n")
rate = gets.chomp.to_f/100
sum = 0 #結果を入れておくための変数"sum"
#ループは3回
for i in 1..3
print("何年後にもらえますか?\n")
year = gets.chomp.to_f
print("何万円もらえますか?\n")
money = gets.chomp.to_f
money = money / (1+rate) ** year
sum += money
end
#少数を入れて計算したので、小数点第2位(100円台まで)で丸めを行う
print("現在価値は",sum.round(2),"万円です。")
なおfor
ループに関してですが、個人的には便利な組み込みメソッドを使いこなすよりも、
できる限りどの言語でも似たような感じで書ける方法の方が新しい言語を勉強する時に良いよね。
と思ってるのでRubyに慣れてサクサク書けるようになるまではfor文を回していく所存です。
あと完全にプログラミング未経験のズブズブの素人さん相手に、
講師の用意した資料に書いてある範囲で書き換えてちょっと良い感じのプログラムに書き直す。
程度の内容なので講座で使ったもの以外は使っていません。