Ruby プログラミング

[Ruby]条件分岐 if・unless・case

if

こんにちは!じゃいごテックのあつしです。

プログラムは基本的に上から順番に実行されていきますが、条件によって実行する処理を分けたいときがありますよね。例えば「水族館の入場料金を年齢によって自動で計算する」とか。

そんな時に使われる、プログラミングの基本構造のひとつ「分岐」をご紹介します。

if・unless (制御構文)

if・unless

if (もし、~なら) は、条件式を評価した結果が true の時、then 以下の処理を行い、条件式が false であれば次の elsif の条件を評価します。
elsif は複数指定でき、全ての if・eilsiffalse だったとき else 以降の処理が行われます。
そして、行った処理の結果を返します。全ての条件式が false で、かつ else の処理もなかった場合は nil が返ります。

unless(もし、~でなければ) は条件式を評価した結果が false の時に then 以下の処理を行います。
unless が便利な時もありますが、基本的に if だけでも問題ないと思いますので、今回は if の解説を行います。

条件式が true の時だけ処理を行う場合

if 条件式 [then]
  処理
end

例:
整数 pts が 0~100で与えられ、p が 70 以上なら "pass" と表示する。
70未満なら何も表示しない。

then を省略しない書き方

# then を省略しない if 文の書き方

pts = 69
if pts >= 70 then
  p "pass"
end

pts = 70
if pts >= 70 then
  p "pass"
end
# > "pass"

then を省略しない場合、 if 文を1行で書くことが出来ます。
(文が長いと読みづらくなるので注意。)

if 条件式 then 処理 end
if 条件式1 then 処理1 elsif 条件式2 then 処理2 else 処理その他 end

# then があれば if 文を1行で書ける

pts = 69
if pts >= 70 then p "pass" end

t = 70
if pts >= 70 then p "pass" end
# > "pass"

then を省略する書き方

通常 then を省略して書くことがことが殆どなので、今後は then を省略した書き方で進めます

# then を省略した if 文の書き方

pts = 69
if pts >= 70
  p "pass"
end

pts = 70
if pts >= 70
  p "pass"
end
# > "pass"

1行で書きたい場合は、後置 if という書き方があります。
(文が長いと読みづらくなるので注意。)

処理 if 条件式

# 後置 if 文の書き方

pts = 69
p "pass" if pts >= 70

pts = 70
p "pass" if pts >= 70
# > "pass"
条件式が true と false とで異なる処理を行う場合

if 条件式
  true の処理
else
  false の処理
end

例:
整数 pts が 0~100で与えられます。pts が 70 以上なら "pass"と表示し、70未満なら"failure"と表示する。

# true と false で異なる処理を行う

pts = 69
if pts >= 70
  p "pass"
else
  p "failure"
end
# > "failure"

pts = 70
if pts >= 70
  p "pass"
else
  p "failure"
end
# > "pass"

1行で書きたい場合は、三項演算子を使った書き方があります。
(文が長いと読みづらくなるので注意。)

条件式 ? true時に返す式 : false時に返す式

# true と false で異なる処理を行う
# 三項演算子を使った書き方

pts = 69
p pts >= 70 ? "pass" : "failure"
# > "failure"
条件が複数ある場合

if 条件式1
  処理1
elsif 条件式2
  処理2
  ...
elsif 条件式n
処理n
else
  処理その他
end

例:
整数 pts が 0~100で与えられ、下記の表示を行う。
pts が 90 以上なら "A” と表示する。"
pts が 80 以上 90 未満なら "B" と表示する。
pts が 70 以上 80 未満なら "C" と表示する。
pts が 60 以上 70 未満なら "D" と表示する。
pts が 60 未満なら "E" と表示する。

# 分岐が複数ある場合の if 文の書き方

pts = 59
if pts >= 90
  p "A"
elsif pts >= 80
  p "B"
elsif pts >= 70
  p "C"
elsif pts >= 60
  p "D"
else
  p "E"
end
# > "E"

pts = 75
if pts >= 90
  p "A"
elsif pts >= 80
  p "B"
elsif pts >= 70
  p "C"
elsif pts >= 60
  p "D"
else
  p "E"
end
# > "C"
if文を使ってpaiza練習問題を解いてみる
単純な条件分岐 (paizaランク D 相当)

※ paiza レベルアップ問題集 条件分岐メニューより

問題:

文字列Sが与えられます。Sがpaizaと一致する場合はYESを、一致しない場合はNOを出力してください。

入力される値

S

期待する出力

YESまたはNOを出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・ Sは英小文字からなる文字列
・ Sの長さは 1 以上 20 未満

入力例1
paiza
出力例1
YES

入力例2
pizza
出力例2
NO

入力例3
abc
出力例3
NO

解答例:

# [解答例1]
# 文字列 S を受け取る
S = gets.chomp
# S が "paiza" かを判定
if S == "paiza"
  # true なら YES を出力
  puts "YES"
else
  # false なら NO を出力
  puts "NO"
end

# [解答例2]
# 文字列 S を受け取る
S = gets.chomp
# 三項演算子で判定・出力
puts S == "paiza" ? "YES" : "NO"

case (制御構文)

case 評価対象
when 値1, 値2 [then]
  値1,又は値2と一致する場合に行う処理
when 値3 [then]
  値3と一致する場合に行う処理
when 値4 [then]
  値4と一致する場合に行う処理
else
  どの値にも一致しない場合に行う処理
end

評価対象が 条件に一致するかを判定して、一致した場合は対応した処理を行います。
値をカンマ区切りや、範囲オブジェクトとすることで複数の値を指定できます。
どの条件にも一致しなかった場合、else 以降の処理が行われ、 else がなかった場合は nil が返ります。
casethen を省略して記述することができます。

例:
整数 pts が 0~100で与えられ、下記の表示を行う。
pts が 90 以上なら "A" と表示する。"
pts が 80 以上 90 未満なら "B" と表示する。
pts が 70 以上 80 未満なら "C" と表示する。
pts が 60 以上 70 未満なら "D" と表示する。
pts が 60 未満なら "E" と表示する。

# case 文の書き方

pts = 59
case pts
when 90..100
  p "A"
when 80..89
  p "B"
when 70..79
  p "C"
when 60..69
  p "D"
else
  p "E"
end
# > "E"

参考: 0から100まで確認してみる

# case 文の動作確認
# 0~100まで全部の確認をしてみる
(0..100).each do |pts|
  p case pts
    when 90..100
      # pts が 90~100 の場合
      [pts, "A"]
    when 80..89
      # pts が 88~89 の場合
      [pts, "B"]
    when 70..79
      # pts が 70~79 の場合
      [pts, "C"]
    when 60..69
      # pts が 60~69 の場合
      [pts, "D"]
    else
      # pts が 0~59 の場合
      [pts, "E"]
    end
end
case文を使ってpaiza練習問題を解いてみる
曜日の判定 (paizaランク D 相当)

※ paiza レベルアップ問題集 条件分岐メニューより

問題:

ある月の 1 日は日曜日、 2 日は月曜日...です。X日は何曜日でしょう。

入力される値

X

期待する出力

期待する出力

答えとなる曜日Sを短縮した表記で出力してください。
具体的に、

  • 日曜日の場合はSun
  • 月曜日の場合はMon
  • 火曜日の場合はTue
  • 水曜日の場合はWed
  • 木曜日の場合はThu
  • 金曜日の場合はFri
  • 土曜日の場合はSat

を出力してください。末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

  • X は 1 以上 31 以下の整数

入力例1
1
出力例1
Sun

入力例2
11
出力例2
Wed

解答例:

# [解答例]

# 日付 X を受け取る
X = gets.to_i

# 曜日は7日サイクルなので日付を7で割った余りで判定する
# 1日: 1 % 7 -> 1 , output -> Sun
# 2日: 2 % 7 -> 2 , output -> Mon
# 3日: 3 % 7 -> 3 , output -> Tue
# 4日: 4 % 7 -> 3 , output -> Wed
# 5日: 5 % 7 -> 5 , output -> Thu
# 6日: 6 % 7 -> 6 , output -> Fri
# 7日: 7 % 7 -> 0 , output -> Sat
# 8日: 8 % 7 -> 1 , output -> Sun に戻る
dow = case X % 7
  when 0
    "Sat"
  when 1
    "Sun"
  when 2
    "Mon"
  when 3
    "Tue"
  when 4
    "Wed"
  when 5
    "Thu"
  when 6
    "Fri"
  end

puts dow

# [参考]
# 条件分岐を使わずに曜日を求める

# Sun ~ Sat までの配列を作る
DOW = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
# 日付 X を受け取る
X = gets.to_i
# 計算で曜日のインデックスを求めて DOW から曜日を取得する
puts DOW[(X - 1) % 7]

今回のまとめ

今回は if・unless・case をご紹介しました。
if・case の使い分けですが、私の場合は分岐条件が複雑な場合や、3分岐程度までのときは if を使い、分岐条件が単純で4分岐以上のときは case を使っています。慣れるまでは if を使ってみて、慣れたら case などに挑戦してみる感じでOKかと思います!unless は知ってるだけでもOK!!

  • if は true のとき、 unless は false のときに実行する条件分岐である
  • case は 分岐条件が単純で分岐が複数あるときに便利
  • if、unless、case があるけど最初のうちは if だけ使ってても問題なし!
プログラムの基本、「順次」「分岐」「繰り返し」のうちの「分岐」をご紹介しました。
paizaに条件分岐の問題集がありますので、是非やってみて下さい!

【PR】Ruby学習でお世話になった本




【PR】アルゴリズム学習でお世話になった本


アルゴリズム関連の技術書は大抵C/C++で書かれていますが、ある程度プログラムが出来れば、処理の流れは理解することが出来ます。






通称: 螺旋本。C++で解説されています。AOJ(Aizu Online Judge)を運営している会津大学の渡辺准教授が書いた本です。データ構造や計算量の内容から丁寧に書いてありますのでアルゴリズム学習の最初の参考書としてオススメです。







通称: 蟻本。C++で解説されています。競技プログラミング中級者の定番書と言われていて、競技プログラミングで利用できる色々なアルゴリズムを学ぶことが出来ます。かなり高度な内容も含まれているので1冊分を完全に理解するのにはかなりの時間がかかりそうですが、手元に置いて何度も読み返しています。







通称: チーター本。C#, C++, JAVAでTopcoderの問題を解説しています。初心者~中級者向けに書かれているので解説が非常に丁寧です。







Python3でアルゴリズムを解説している本です。講義スタイルの本で、図やフローチャートを使ってアルゴリズムとデータ構造についてしっかりと説明されています。代わりにコードは少なめです。Pythonコードが読めなくても十分理解できると思います。


-Ruby, プログラミング
-, , ,

© 2024 じゃいごテック