基本的な制御構造を知っておこう
コンピュータは、プログラムに記述された手順通りに動作します。
そのため、プログラムを作成する際には「どのように処理を実行させるか」といった処理手順(アルゴリズム)をしっかり考えて組み立てます。
「処理手順」というと難しく感じるかもしれませんが、基本的には以下の3つの制御構造を組み合わせて作ることができます。

制御構造とは、プログラムの実行手順を体系化したものです。その中でも「順次構造」「選択構造」「反復構造」は最も基本的な制御構造です。
この章では、図の中央に位置する「選択構造(条件分岐)」について学びます。
条件分岐について理解しよう
条件分岐とは、プログラムの中である条件が成り立つかによって、次に実行する処理を変えることです。
以下のフローチャートでは、条件が成り立つときはYesの矢印の先に進み「処理①」を実行します。条件が成り立たないときは、Noの矢印の先に進み「処理②」が実行されます。

具体的な例として、「テストの点数が70以上なら合格と出力する、そうでなければ処理を終了する」で考えてみましょう。
この手順をフローチャートにすると、以下のように記述することができます。

点数の定義後に「点数が70以上」という条件が成り立てば、Yesの矢印に進み「合格」と出力されます。条件が成り立たなければ、Noの矢印に進み、そのまま処理が終了します。
次に条件が成り立たないときに「不合格」と出力には、以下のように追記します。

このように条件分岐は「条件が成り立つか、成り立たないか」によって、次に行う処理を変えることができます。
Rubyでは、if・unless・caseを使うことで条件分岐させることができます。
この中でも条件分岐によく使われるifについて学んでいくよ
ifの基本的な使い方を学ぼう
ifは「ある条件が成り立つときは処理①の処理を行い、成り立たないときは処理②を行う」など指定した条件に従って処理を分岐させたいときに使われます。

また、ifは複数の条件を追加して、さらに処理を分岐させることもできます。
ifの基本的な使い方や処理の流れについて、具体例とフローチャートを使いながら学んでいきます。
ifの基本構文
ifの基本的な書き方は、以下の通りです。
1
2
3
if 条件式 then
#条件が成り立つときに実行する処理
end
条件式には、比較演算子などを使って条件を記述し、then~endの間には、条件が成り立つときに実行したい処理を記述します。
条件式が評価(式を実行して値を得ること)されて、条件が成り立つときにthen以下の処理が実行されます。
それでは、実際に手を動かしながらifの使い方を学ぼう!
ifを使って条件分岐してみよう
前述の例を使ってifでプログラムの処理を条件分岐してみましょう。
以下のフローチャートのように「テストの点数が70以上なら合格と出力、そうでなければ処理を終了」させます。
※ 実際のテストの点数は90点とします。点数にはscoreという変数を定義します。

上記のフローチャートはifを使って記述すると、以下の通りになります。
以前作成したsample.rbに記述しておきましょう。
1
2
3
4
5
score = 90
if score >= 70 then
puts "合格"
end
最初にテストの点数を定義します。
テストの点数は、90点なのでscoreに90を代入します。
次に「点数は70以上か」という条件をRubyで表現するために、比較演算子を使って「条件式」を指定します。「70以上」は70も含まれるので、>=を使います。
比較演算子で学んだa >= bは、「aはb以上」の意味だったよね
その通り!だからscore >= 70は、「score(点数)は70以上」の意味だと理解できるよね
プログラムを実行して処理の流れを確認してみよう
続いて、rubyコマンドでプログラムを実行して処理の流れを確認します。
動画のようにrubyコマンドでプログラムを実行してみましょう。

実行すると、ターミナルに「合格」と出力されましたね。
以下の画像で処理の流れを確認してみます。

条件式はscore >= 70で、scoreは90なので「条件式は正しい」と判定されます。
つまり条件は成り立つので、then~end間のputs "合格"が実行され、「合格」と出力されます。
scoreを70未満にして処理の流れを確認してみよう
それでは、scoreを70未満にした場合はどのような処理の流れになるでしょうか。
以下のハイライト箇所のように、scoreを90から50に変更してみましょう。
1
2
3
4
5
score = 50
if score >= 70 then
puts "合格"
end
続いて、動画のようにrubyコマンドでプログラムを実行してみましょう。

実行すると、ターミナルには何も表示されません。
以下の画像で処理の流れを確認してみます。

条件式はscore >= 70のままですが、scoreは50に変更したので「条件式は正しくない」と判定されます。
つまり条件は成り立たないので、puts "合格"は実行されず、ifの実行を終了します。そのため、ターミナルには何も出力されません。
条件が成り立たないときに何か処理させたい場合は、どうすれば良いの?
条件が成り立たないときの処理は、elseを使って実現できるよ
条件が成り立たないときの処理
条件が成り立たないときに何かしら処理を行うには、以下のようにelseを使います。
1
2
3
4
5
if 条件式 then
#条件が成り立つ時に実行したい処理
else
#条件が成り立たない時に実行したい処理
end
else~endの間には、条件が成り立たないときに実行したい処理を記述します。
条件が成り立たないときの処理を書いてみよう
それでは、elseを使って条件が成り立たないときの処理を書いていきましょう。
以下のフローチャートのように「点数が70以上か」の条件が成り立たなければ、「不合格」と出力されるようにソースコードを変更していきます。

以下のハイライト箇所のようにsample.rbの内容を変更しましょう。
1
2
3
4
5
6
7
score = 50
if score >= 70 then
puts "合格"
else
puts "不合格"
end
条件が成り立たないときに実行したい処理はputs "不合格"なので、else~endの間に記述します。
sample.rbを変更したら、動画のようにrubyコマンドでプログラムを実行してください。

実行すると、ターミナルに「不合格」と出力されましたね。
以下の画像で処理の流れを確認してみます。

条件式はscore >= 70でscoreは50なので「条件式は正しくない」と判定されます。
つまり条件は成り立たないので、else~end間のputs "不合格"が実行され、「不合格」と出力されます。
これだけだと「条件が成り立つか、成り立たないか」の2択しか分岐できないよね
さらに分岐が必要な場合はelsifを使うことで実現が可能だよ
複数条件を指定して分岐させる場合
さらに条件を付け加える場合は、以下のようにelsifを使います。
1
2
3
4
5
6
7
if 条件式1 then
#条件式1が成り立つ時に実行したい処理
elsif 条件式2 then
#条件式2が成り立つ時に実行したい処理
else
#全ての条件が成り立たない時に実行したい処理
end
elseは1つだけしか使うことができませんが、elsifであれば以下のように必要な数だけ使うことができます。
1
2
3
4
5
6
7
8
9
10
11
if 条件式1 then
#条件式1が成り立つ時に実行したい処理
elsif 条件式2 then
#条件式2が成り立つ時に実行したい処理
elsif 条件式3 then
#条件式3が成り立つ時に実行したい処理
elsif 条件式4 then
#条件式4が成り立つ時に実行したい処理
else
#全ての条件が成り立たない時に実行したい処理
end
条件式1から順番に判定されて、いずれかの条件が成り立つ時点でその箇所の処理が実行されて、ifの実行が終了します。
else以下に記述する処理は、「全ての条件が成り立たない場合」に実行されます。
まずはフローチャートを使って、複数条件を指定した場合の処理の流れを整理していこう
フローチャートで処理の流れを整理しよう
elsifで条件を付け加えた場合の処理の流れを整理してみます。
フローチャートにすると、以下のように記述することができます。

処理開始後、最初に「条件式1」が成り立つか判断されます。成り立てば「処理①」が実行されて、ifの実行が終了します。
「条件式1」が成り立たないときは、次に「条件式2」が成り立つか判断されます。成り立てば「処理②」が実行されて、ifの実行が終了します。
「条件式2」も成り立たないときは「処理③」が実行されて、ifの実行が終了します。
elsifで条件を付け加えてみよう
それでは、実際にelsifを使って条件を付け加えてみましょう。
付け加える条件は「点数が60以上70未満」です。この条件が成り立てば、「不合格、もう少し!」と出力させます。
以下のハイライト箇所を編集してください。
1
2
3
4
5
6
7
8
9
score = 65
if score >= 70 then
puts "合格"
elsif score >= 60 then
puts "不合格、もう少し!"
else
puts "不合格"
end
編集後、動画のようにrubyコマンドでプログラムを実行すると、ターミナルに「不合格、もう少し!」と出力されます。

最初に処理される条件式1はscore >= 70でscoreは65なので「条件式は正しくない」と判定されます。つまり条件は成り立たないので「条件式2」へ処理が移ります。
条件式2はscore >= 60で条件が成り立つので、「不合格、もう少し!」と出力され、ifの実行も終了します。
elsifの注意点
elsifを使う場合は、条件式の順番に注意する必要があります。
なぜなら、条件式1から順番に処理され、条件が成立した時点でその節の処理が実行されて、ifが終了するからです。
実際に手を動かして確認してみましょう。以下のハイライト箇所を編集してください。
1
2
3
4
5
6
7
8
9
score = 90
if score >= 60 then
puts "不合格、もう少し!"
elsif score >= 70 then
puts "合格"
else
puts "不合格"
end
動画のようにrubyコマンドでプログラムを実行してみましょう。

実行すると、「不合格、もう少し!」と出力されてしまいます。
本来でしたらscoreが90なので「合格」と出力されて欲しいところですが、scoreは60以上でもあるので、最初のscore >= 60が成り立つと判断されます。

この場合はscore >= 60ではなく、score >= 70の方を最初に処理される条件式1として記述する必要があります。
このようにelsifを使う場合は、条件式を記述する順番に気をつけましょう。
条件式の評価について理解しよう
ここまでifの使い方について説明してきましたが、次は「条件式」の部分を詳しくみていきましょう。

条件式が評価(式を実行して値を得ること)されると、正しいか、正しくないかを示す値が返ります。この値は、条件式の評価結果です。
ifは条件式の評価結果によって、どの処理を実行するかが決まります。
条件が成り立つかどうかは、条件式の評価結果で判定されていたんだね
条件式の評価については、ifをより理解するために必要だよ!
条件式の評価結果を確かめてみよう
以下のサンプルコードを使って、条件式の評価結果を確かめてみます。
※scoreの値は、その都度変更するものとします。
1
2
3
if score >= 70 then
puts "合格"
end
条件式が評価されて「条件式は正しい」ことを示す値のtrueが返ると、puts "合格"が実行されます。「条件式は正しくない」ことを示す値のfalseが返ると、ifの実行は終了します。
それでは、実際にtrueやfalseという値が返るのかを確かめよう
正しいを示す値(true)の場合
まずは、正しいを示す値(true)を返す条件式を実行してみます。
以下の例では、条件式がscore >= 70、scoreは90なので「条件式は正しい」と判定されます。

上記の条件式の部分をirbで実行してみます。
動画のようにscoreに90を代入した後、score >= 70を実行してみましょう。

score >= 70を実行すると、trueという値が返ります。
このことから、条件式が正しいと判定される(条件が成り立つ)と、trueという値が返ることがわかりますね。

以下の画像のように、条件式の部分はtrueに置き換わります。
条件式の部分がtrueであれば、then以下の処理が実行されます。

そのため、条件式の部分をtrueに置き換えても、「合格」と出力されます。
1
2
3
if true then
puts "合格"
end
動画のように上記をsample.rbに記述して、rubyコマンドで実行してみましょう。

条件式の部分をtrueに置き換えて実行しても、then以下の処理が実行されますね。
ifは「条件式」がtrueであれば、処理が実行されるってことだね
あとで説明するけど、正しいを示す値は、true以外にもあるからね
正しくないを示す値(false)の場合
次に、正しくないを示す値(false)を返す条件式を実行してみます。
以下の例では、条件式がscore >= 70、scoreは60なので「条件式は正しくない」と判定されます。

上記の条件式の部分をirbで実行してみます。
動画のようにscoreに60を代入した後、score >= 70を実行してみましょう。

score >= 70を実行すると、falseという値が返ります。
このことから、条件式が正しくないと判定される(条件が成り立たない)と、falseが返ることがわかりますね。

以下の画像のように、条件式の部分はfalseに置き換わります。
条件式の部分がfalseであれば、処理は実行されず、ifの実行を終了します。

以下のように条件式の部分をfalseに置き換えても、処理は実行されません。
1
2
3
if false then
puts "合格"
end
動画のように上記をsample.rbに記述して、rubyコマンドで実行してみましょう。

条件式の部分をfalseに置き換えると、処理は実行されずにifは終了します。
このようにifは、条件式が正しいを示す値(true)であれば処理を実行し、正しくないを示す値(false)であれば処理が実行されません。
「true」と「false」ってなんなんだろう。。。
「true」と「false」は真偽値と呼ばれる値だよ
真偽値とは
真偽値とは簡単に説明すると「ある条件が正しい(真)か正しくない(偽)か示すための値」のことです。
Rubyでは偽になる値はnilとfalseだけで、偽以外の値はすべて真になります。

ifの条件式の判定
ifの条件式はtrueかfalseかではなく、正確には真偽値で判定されます。
Rubyでは、nilとfalse以外は真になる値です。
以下のように10(真になる値)を条件式に指定すると、処理は実行されます。
1
2
3
if 10 then
puts "真です"
end
以下のようにnil(偽になる値)を条件式に指定すると、処理が実行されません。
1
2
3
if nil then
puts "真です"
end
条件式を10とnilにして実行すると、以下のようになります。

このようにifは条件式の真偽値によって、処理の流れが変わります。
後置if(if修飾子)
Rubyのifは、以下のように文の後ろに置くことができます。
1
2
3
score = 90
puts "合格" if score >= 70
このような書き方を「後置if」や「if修飾子」と呼びます。
以下の元コードと比べると、後置ifを利用すれば3行を1行で書けています。
後置ifを利用する方が簡潔に書くことができますね。
1
2
3
4
5
score = 90
if score >= 70 then
puts "合格"
end
とても便利なものですが、非常に長い文の後にifを追加すると、かえって読みづらいコードになってしまう可能性があります。
1
2
3
score = 90
puts "今回のテストは例年よりも非常に難しく設定されていましたが、あなたは合格しました。" if score >= 70
一番右までスクロールすることで、やっとif score >= 70という条件が読めます。
このような場合は、後置ifを使わない方が可読性が高くなります。
1
2
3
4
5
score = 90
if score >= 70 then
puts "今回のテストは例年よりも非常に難しく設定されていましたが、あなたは合格しました。"
end
条件式のネスト(入れ子)
ifの条件式は「ネスト(入れ子)」して書くことができます。
例えば、「年齢が18歳以上の場合は、〇〇と処理をする。さらに年齢が20歳以上の場合は、□□の処理をする」という処理を行いたい場合は、 if を入れ子にすることによって条件を追加できます。
コードで書く場合は、以下のようなイメージです。
1
2
3
4
5
6
7
8
if あなたの年齢が18歳以上ならば
車の免許が取れます。
if あなたの年齢が20歳以上ならば
お酒も飲めます。
end
else
車の免許は取れません。
end
これを実際の動くコードに書き換えると、以下のようになります。
1
2
3
4
5
6
7
8
9
10
age = 21
if age > 18
puts '車の免許が取れます。'
if age > 20
puts 'お酒も飲めます。'
end
else
puts '車の免許は取れません。'
end
このようにifの条件式は、ネストして書くことができます。
Rubyの条件分岐
Rubyの条件分岐には、ifだけではなくunlessやcaseがあります。
ifは条件式が「真」のときに処理を実行しましたが、unlessは「偽」のときに処理を実行します。
1
2
3
4
if true then
puts "真です" #条件式が真のとき処理は実行される
end
#=> 真です
1
2
3
4
if false then
puts "偽です" #条件式が偽のとき処理は実行される
end
#=> 偽です
また、分岐が多くなる場合や比較するオブジェクトが1つだけの場合は、ifよりもcaseを使う方が可読性が上がります。
1
2
3
4
5
6
7
8
9
10
11
subject = "Science"
if subject == "Mathematics" then
puts 98
elsif subject == "Science" then
puts 86
elsif subject == "Japanese" then
puts 60
else
puts "?"
end
1
2
3
4
5
6
7
8
9
10
11
12
subject = "Science"
case subject
when "Mathematics" then
puts 98
when "Science" then
puts 86
when "Japanese" then
puts 60
else
puts "?"
end
unlessやcaseの使い方については、以下の表のリンク先を参考にしてみてください。
| 条件分岐 | 説明 | リンク |
|---|---|---|
| if | 条件式の真偽値で処理が分岐される (真の時にthen以下の式を評価) |
|
| unless | 条件式の真偽値で処理が分岐される (偽の時にthen以下の式を評価) |
unlessの使い方 |
| case | 1つの式に対する一致判定によって処理が分岐される | caseの使い方 |
この記事のまとめ
- 条件分岐とは、プログラムの中である条件が成り立つかによって、次に実行する処理を変えること
- Rubyの条件分岐には、if・unless・caseがある
- ifは条件式の真偽値によって、処理を変えることができる
この記事で学んだことをTwitterに投稿して、アウトプットしよう!
Twitterの投稿画面に遷移します