5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

条件分岐 (if, case), Array.each

Last updated at Posted at 2020-12-29

条件分岐 (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
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?