目標
rubyでのif,caseなどを,うるう年かどうか判定するプログラム(check_leap_year.rb)を用いて理解する.
解説
うるう年(4年に1度)
西暦で4の倍数の時うるう年になるので,4の倍数であればtrue,違えばfalseと返すものを作ります.まずはrubyでif,else_ifがどういう風に記述されるのかを確認します.
if 式 [then]
式 ...
[elsif 式 [then]
式 ... ]
...
[else
式 ... ]
end
thenの部分は省略可能です.では,これに伴って作ってみます.
if year%4 == 0
p true
else
p false
end
うるう年(完全版)
先ほどのものに加えて,西暦で100の倍数はうるう年ではなく,400の倍数はうるう年として扱うものにしていきます.
p year = ARGV[0].to_i
if year%400 == 0
p true
elsif year%100 == 0
p false
elsif year%4 == 0
p true
else
p false
end
.to_iはARGで受け取ったものをintに変換するものです.
array,each,case
array,each
先ほどのものを使ってテストを自動化していきます.その際はarray,eachを使います.arrayは配列になります.具体的な使い方は以下の通りです.
[1, 2, 3].each do |i|
puts i
end
>1
>2
>3
各要素に対してブロックを評価します.ブロックが与えられなかった場合は、自身とeachから生成したEnumerator オブジェクトを返します.配列の中身を順番に処理するときには,上記のような記法が用いられます.rubyでdo-loop内で使う値は'|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
[2000,2004,1999,1900].each do |year|
p year
leap?(year)
end
mainでloopしてpしています.
>2000
>true
>2004
>true
>1999
>false
>1900
>false
case
caseを使って先ほどのコードをさらに短くすることが出来ます.caseの使い方は以下の通りです.
case [式]
[when 式 [, 式] ...[, `*' 式] [then]
式..]..
[when `*' 式 [then]
式..]..
[else
式..]
end
これを用いてコードを作っていきます.
def leap?(year)
case
when year % 400 ==0 ; true
when year % 100 ==0 ; false
when year % 4 ==0 ; true
else ; false
end
end
[2000, 2004, 1999, 1900].each do |year|
p year
p leap?(year)
end
参考にしたサイト
この記事を書くために以下のサイトを参考にしました.チャート式ruby-III(if, case, Array.each by leap year)
- source ~/grad_members_20f/members/Takahiro-Nishikawa/ruby_leap_year.org