8
0

More than 3 years have passed since last update.

leap_year

Last updated at Posted at 2020-12-09

目標

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
8
0
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
8
0