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