!Ubuntu-20.04.1 !ruby-2.7.1p83
これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。
やったこと
- bundler
- if, case, Array.each
if, case, Array.each
条件分岐を取り扱おうということだ
お題
入力された年数がleap year(うるう年)かどうかを判定する
プログラミングの実習でよくある課題だが、条件分岐が複雑
まず4の倍数かどうかを判定する
入力部は
p year = ARGV[0].to_i
to_iとはIntegerであるということを示すものらしい
if year%4==0 then
p true
else
p false
end
最初の条件分岐文がこちら。yearを入力として、それを4で割った余りが0ならtrue、そうじゃなければfalseだぞ、と出力するこれを実行すると
> ruby check_leap.rb 2004
2004
true
1997の場合は
> ruby check_leap.rb 1997
1997
false
となる
特殊な年数の場合をはじいていく
100で割り切れる年はうるう年でなく、400で割り切れる年はうるう年であるという二点を判定できるようにする
こういう例外処理は先に済ませておこうと思う。また、長くなってきたのでmethodにしておく
p year = ARGV[0].to_i
def leap?(year)
if year % 400 ==0
p true
elsif year % 100 ==0
p false
elsif year % 4 == 0
p true
else
p false
end
end
leap?(year)
これを実行すると
> ruby check_leap.rb 1900
1900
false
2000の場合は
> ruby check_leap.rb 2000
2000
true
となった。100の倍数だが400の倍数でない1900と、100の倍数かつ400の倍数である2000を区別できている
array, eachを使う
大量の値を一気にテストしたいときにはarray(配列)が便利。
def leap?(year)
if year % 400 ==0
p true
elsif year % 100 ==0
p false
elsif year % 4 == 0
p true
else
p false
end
end
[1900,1997,2000,2004].each do |year|
p year
leap?(year)
end
実行すると
> ruby check_leap.rb
1900
false
1997
false
2000
true
2004
true
正しく判定されてますね
case
授業中では扱ってなかった気がするけどcaseを使うとさらにコードのrefactoringが可能
caseを使って先ほどのコードを書きなおして
def leap?(year)
case
when year % 400 ==0 ; return true
when year % 100 ==0 ; return false
when year % 4 ==0 ; return true
else return false
end
end
[1900, 1997, 2000, 2004].each do |year|
p year
leap?(year)
end
で動くかと思ったら
> 1900
> 1997
> 2000
> 2004
となり、判定が行われていない???(red)
と思ったけど、よく見たらleap?(year)の結果の出力部が記述されてないじゃん、ということで、13行目を
p leap?(year)
として動かすと
> 1900
> false
> 1997
> false
> 2000
> true
> 2004
> true
よかった、プログラムは短くなったしgreen状態にできた
参考記事
- source ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter7.org