条件分岐

ここでは条件分岐について説明します。

条件分岐とは、何かしらの条件に応じて処理を変更する仕組みです。例えば、AならばCを実行し、BならばDを実行するというようなことができます。

プログラムにおいて条件分岐は非常に重要ですので、しっかりと覚えましょう。

if

条件分岐の代表的なものとして、if式があります。

if式の使い方は次のようになります。

in = gets.to_i
if in < 100
  puts '100未満の数字が入力されました'
else
  puts '100以上の数字が入力されました'
end

if式では、ifと書いた後に条件式を記述します。条件式については後述しますが、この条件式が正しいとき(真、Trueともいう)、そのすぐ下の行が実行されます。

if式にはelseというものを記述でき、条件式が正しくないとき(偽、Falseともいう)、elseの下の行が実行されます。

if式の最後には、endを記述し、これによってif式の最後を表します。

if式ではelseを記述しないということもできます。

in = gets.to_i
if in < 100
  puts '100未満の数字が入力されました'
end

if in >= 100
  puts '100以上の数字が入力されました'
end

また、elsifというものを使って、さらに細かい条件で条件分岐を行うこともできます。

in = gets.to_i
if in < 100
  puts '100未満の数字が入力されました'
elsif in < 200
  puts '100以上200未満数字が入力されました'
elsif in < 300
  puts '200以上300未満の数字が入力されました'
else
  puts '300以上の数字が入力されました'
end

このようにif式を使えば条件に応じて処理を分けることができます。

条件式

条件式では、次のものを書くことができます。

a = 10
b = 20

# 等しい
a == 10 # True
a == b # False

# 等しくない
a != 10 # False
a != b # True

# より大きい
a > 10 # False
a > 9 # True

# 以上
a >= 10 # True
a >= b # False

# 未満
a < 10 # False
a < 11 # True

# 以下
a <= 10 # True
a <= b # True

# 条件を同時に満たす
# aが10かつbが20以外
a == 10 && b != 20 # False
# aが5以上かつ15以下
a >= 5 && a <= 15 # True
# aが5以上かつ15以下かつbが20
a >= 5 && a <= 15 && b== 20

# どれかの条件を満たす
# aが10またはbが20以外
a == 10 || b != 20 # True
# aが5以上かつ15以下
a >= 5 || a <= 15 # True
# aが5以上かつ15以下かつbが20
a >= 5 || a <= 15 || b== 20

# 複数の組み合わせ
# aが5またはbが15以上20以下、
a == 5 || b >= 15 && b <= 20 # True

基本的に、数学で使用する記号を同じような意味で使用することができます。注意する点としては、以上や以下を表す際には>=<=のようにイコールを一緒に記述する必要があります。

&&や||をつかうことで、条件式をつなげることができます。&&は&&の左右の条件式が両方とも真であるときに真となります。||は||の左右の条件式のうちどちらかが真であるときに真となります。

&&や||の注意点としては、優先順位として&&が先に計算されると言うことです。例えばa == 5 || b >= 15 && b <= 20は、a == 5 || (b >= 15 && b <= 20)と同じということで、&&から先に計算されます。

プログラムでは、このような条件式をたくさん使うため、しっかりと覚えましょう。

unless

unless式は、if式の逆となります。どういうことかというと、条件式の真と偽が逆となります。

in = gets.to_i
unless in >= 100
  puts '100未満の数字が入力されました'
else
  puts '100以上の数字が入力されました'
end

if式の際の例をunless式で書き換えました。

unless式は、if式と同じように書くことができるのですが、unlessの後ろに書く条件式が偽の時にすぐ下の処理が実行され、真の時にelseの処理が実行されます。

unless式の処理は、人間の直感から少々ずれているため、特別な理由なくunlessを使用することは、プログラムの可読性を下げるため推奨されません。unless式を使用する場合は、if式で書いた場合よりも読みやすいかということで判断するとよいでしょう。

後置記法

if式やunless式は、後置記法という書き方で書くことにより簡潔に書くこともできます。

a = 10
b = 20

# 条件を満たすため出力されます
puts 'aは10です' if a == 10
puts 'aは10です' unless a != 10

# 条件を満たさないため出力されません
puts 'bは10です' if b == 10
puts 'bは10です' unless b != 10

後置記法の場合、実行したい処理の後ろにifまたはunlessを書き、その後に条件式を記述します。

こうすることで、ifやunlessの条件式が満たされるときに、その前に記述された処理が実行されます。

case

ifやunlessの他のものとして、用途は限られますがcase式があります。

case式では、条件式としてa == 10のような等しいものを複数列挙したいときなどに役立ちます。

次にcaseを使った例を示します。

in = gets.to_i

case in
when 1, 2, 3, 4, 5
  puts '入力された値は1, 2, 3, 4, 5'
when 6
  puts '入力された値は6'
when 7..10
  puts '入力された値は10'
else
  puts '入力された値は1~10以外'
end

caseでは、caseの後に条件式で言うところの左側の値を設定します。

その後にwhenを一つ以上書き、whenの後には、等しいか比較するための値を書きます。このとき、カンマを使用して複数書くこともできます。

whenを書いたら、最後にelseを書くことができます。elseはwhenで条件が真とならなかったときに実行されます。elseについては、書かなくてもかまいせん。

case式は、使いどころが限られますが、それぞれの値でたくさんの条件分岐をするときなどには弁rにです。

三項演算子

最後に、三項演算子について紹介します。

三項演算子は、あまり可読性が高くないため嫌われることも多いのですが、使っている人もそれなりにいることと、いざという時に使えると便利なため覚えておきましょう。

三項演算子を使うことを次のようなif式を置き換えることができます。

in = gets.to_i

if in < 10
  puts '入力された値は10未満です'
else
  puts '入力された値は10以上です'
end

puts '入力された値は10' + (in < 10 ? '未満' : '以上') + 'です'

三項演算子を使うと次のようにかけます。

puts '入力された値は10' + (in < 10 ? '未満' : '以上') + 'です'

三項演算子では、?と:を使用します。?は条件式を書いた直後に書きます。?の後には、条件式が真の時の処理を書きます。その後には、:を書き、最後に条件式が偽のときの処理を書きます。

見てわかるように、三項演算子は少々複雑なもので、基本的にはif式を使って書いた方がよいと言われています。

まとめ

条件分岐を使うことで、少しだけですがプログラムっぽくなってきました。

条件分岐は、プログラムの根幹をなす概念ですので、ちゃんと使えるようになっておきましょう。