条件分岐 (if)
if-elsif-else文の記述方法
if 式 [then]
式 ...
[elsif 式 [then]
式 ... ]
...
[else
式 ... ]
end
C 言語とは違って else if ではなく elsif であることに注意
then は省略可
お題 (うるう年の判定)
うるう年を判定する check_leap_year.rb を作成する.
うるう年とは
1. 4で割り切れる年
2. 100で割り切れる年はうるう年ではなく, 400で割り切れる年はうるう年
解説:if-elsif-else-if
まずは簡単に2004年はうるう年か
p year = ARGV[0].to_i
if year % 4 == 0
p true
end
のように書ける
> ruby check_leap_year.rb 2004
2004
true
次に1999年はうるう年でないのでfalseを返すようにする
p year = ARGV[0].to_i
if year % 4 == 0
p true
else
p false
end
これでfalseが出力されるようになったが, 1900年はどうだろうか
> ruby check_leap_year.rb 2004
1900
true
1900年は100で割り切れるのでうるう年でないから条件式を追加する
p year = ARGV[0].to_i
if year % 100 == 0
p false
elsif year % 4 == 0
p true
else
p false
end
> ruby check_leap_year.rb 2004
1900
false
このままだと400で割り切れる年もfalseとなってしまうのでもう一つ条件式を追加する
p year = ARGV[0].to_i
if year % 400 == 0
p true
end
elsif year % 100 == 0
p false
elsif year % 4 == 0
p true
else
p false
end
> ruby check_leap_year.rb 2004
2000
true
これでOK
しかし引数でいちいち打ち込むのはめんどくさい
そこで次のArray.eachを使う
Array.each
お題:テストの自動化
配列にしてループで回すだけ
[2000, 1900, 2004, 1999].each do |year|
p year
if year % 400 == 0
p true
end
elsif year % 100 == 0
p false
elsif year % 4 == 0
p true
else
p false
end
このように書くと
> ruby check_leap_year.rb 2004
2000
true
1900
false
2004
true
1999
false
と出力される
メソッドにしよう
関数名を leap? とする
def leap?(year)
if year % 400 == 0
p true
end
elsif year % 100 == 0
p false
elsif year % 4 == 0
p true
else
p false
end
end
[2000, 1900, 2004, 1999].each do |year|
p year
leap?(year)
end
このように書くと
> ruby check_leap_year.rb 2004
2000
true
1900
false
2004
true
1999
false
同じ出力になることを確認
条件分岐 (case)
case を使うともっと綺麗になる
case 文の記述方法
case [式]
[when 式 [, 式] ...[, `*' 式] [then]
式..]..
[when `*' 式 [then]
式..]..
[else
式..]
end
お題:case
先程のifのプログラムをcaseのプログラムに変更すると
def leap?(year)
return case
when year % 400 ==0 ; true
when year % 100 ==0 ; false
when year % 4 ==0 ; true
else ; false
end
end
[2000, 1900, 2004, 1999].each do |year|
p year
p leap?(year)
end
となり, 出力を確認すると
> ruby check_leap_year.rb
2000
true
1900
false
2004
true
1999
false
おまけ (三項演算子)
三項演算子は if をもう少しスマートに書ける.
条件式 ? (真の場合) : (偽の場合)
という風に書く
def leap?(year)
return (year % 400 == 0) ? true :
(year % 100 == 0) ? false :
(year % 4 == 0) ? true : false
end
[2000, 1900, 2004, 1999].each do |year|
p year
p leap?(year)
end
参考ページ
チャート式ruby-III(if, case, Array.each by leap year)
- source ~/grad_members_20f/members/djj31370/c3_if_case_leap_year.org