こんにちは!じゃいごテックのあつしです。
プログラムは基本的に上から順番に実行されていきますが、条件によって実行する処理を分けたいときがありますよね。例えば「水族館の入場料金を年齢によって自動で計算する」とか。
そんな時に使われる、プログラミングの基本構造のひとつ「分岐」をご紹介します。
if・unless (制御構文)
if・unless
if
(もし、~なら) は、条件式を評価した結果が true
の時、then
以下の処理を行い、条件式が false
であれば次の elsif
の条件を評価します。
elsif
は複数指定でき、全ての if・eilsif
が false
だったとき 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
が返ります。
case
も then
を省略して記述することができます。
例:
整数 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に条件分岐の問題集がありますので、是非やってみて下さい!