コンピュータリテラシー演習のページへ
Rubyによるはじめてのプログラミング

条件判断 - ある場合のみ行う

今までは、プログラムを上から下に順番に書いてきました。 書いたプログラムは、どの行も実行されたわけです。 ここでは、ある条件のときだけ実行する方法を紹介します。

世の中の条件判断

世間は条件判断だらけです。「腹が減ったらご飯を食べる」「夜ならば寝る」「雨が降っていたら傘をさす」 「信号が赤なら止まる」…。

言うまでもないことですが、「腹が減ったらご飯を」の場合は、「腹が減ったら」が条件で、 その条件が成り立つときに、「ご飯を食べる」を実行するわけです。

Rubyの条件判断

まずは、簡単にコンピュータで扱いやすい数値を使った条件判断をやってみます。 2つの数値を比較してみましょう。例えば、10と15を比較したのが以下のプログラムです。

if1.rb : 2つの数値を比較するプログラム
1: # 2つの数値を比較するプログラム
2: if (10 < 15) then
3:   print "10は15より小さい\n"
4: end
左端の1: 2: 3: 4:を行番号といいます。 プログラムの説明をしやすくするために入れてあります。 プログラムではないので、プログラムを打ち込む時には行番号を入れないでください。

1行目はコメントです。プログラムの動きには影響しません。 2行目で 10 < 15 とあるのがif文の条件です。 Rubyで条件判断をする場合は、通常このif文を使います。 この場合、10 < 15 が成り立つ場合には、then以下の3行目を実行します。 4行目にはif文の終わりを示す end が書かれています。 この場合、10 < 15 が成り立つので 10は15より小さい が表示されるはずです。

Rubyの場合、条件を囲っているカッコは省略できます。つまり2行目は、 if 10 < 15 then と書いても構いません。 ただし、カッコを取ると意味が変わってしまう場合には省略できません。 またさらに、thenも省略できます。 つまり2行目は、if 10 < 15と書けます。

次に、2行目の条件を 10 > 15に変えてみましょう。

if2.rb : 2つの数値を比較するプログラム
1: # 2つの数値を比較するプログラム
2: if (10 > 15) then
3:   print "10は15より大きい\n"
4: end

実行しても何も表示されません。 if文の条件である 10 > 15が成り立たないため、3行目が実行されなかったからです。

他に数値の比較の仕方には以下のようなものがあります。色々試してみてください。 特に注意しないといけないのは、等式です。 数学では、等式を = と書きますが、Rubyでは == と書きます。 Rubyの場合 = は、代入を意味するからです。ここは良く間違うところなので、常に気をつけてください。また、<=, >==<, => と書いてはいけません。

書き方意味備考
a == ba と b が等しいかどうか = と書き間違わないよう注意
a != ba と b が等しくないかどうか
a < ba が b より小さい(未満)かどうか
a <= ba が b 以下かどうか =< と書き間違わないよう注意
a > ba が b より大きいかどうか
a >= ba が b 以上かどうか => と書き間違わないよう注意

表のaやbには数値や数値が入っている変数の名前を入れてください。以下に例を示します。

if3.rb : 得点が赤点か調べるプログラム
a = 25
if (a < 50) then
  print "赤点です!\n"
end
if4.rb : 得点が満点か調べるプログラム
1: score = 100
2: if (score == 100) then
3:   print "100点満点。"
4:   print "アンタはエライ!\n"
5: end

下側の例(if4.rb)のように、if文の中に複数の行を書くこともできます。 この例だと、scoreが100の場合は、3行目と4行目を実行します。

条件が成り立たないときは…

以上は、条件が成り立つときに何か実行する、という形ですが、成り立たないときも 何か実行することができます。以下の例を見てください。

if5.rb : 得点が赤点か合格点かを調べるプログラム
1: a = 60
2: if (a < 50) then
3:   print "赤点です!"
4: else
5:   print "合格点です"
6: end

この場合、a < 50 が成り立つときは、3行目(then から else の間)を実行し、 成り立たないときは、5行目(else から end の間)を実行します。

if6.rb : 2つの整数値のうち値の大きいほうを表示するプログラム
# 2つの整数値のうち値の大きいほうを表示するプログラム
a = 100
b = 50
if (a < b) then
  print b, "\n"
else
  print a, "\n"
end

文字列の比較

以上は数値の比較をしましたが、文字列を比較するということもできます。 2つの文字列が同じかどうかを比較するのに、==(等しい)と !=(等しくない)が使えます。

if7.rb : Billさんかどうかを調べるプログラム
name = "Bill"
if (name == "Bill") then
  print "Billさんに間違いありません\n"
end
if8.rb : Billさんでないかどうかを調べるプログラム
name = "Steve"
if (name != "Bill") then
  print "Billさんではないようです\n"
end

いくつかの条件を組み合わせてみよう

二つの条件がどちらも成り立つときに何か実行したい場合は、以下の2つの方法があります。

if文の中にif文を書く

例えば、mathに数学の点数、englishに英語の点数を入れておき、 両方とも50点以上なら 進級決定と表示するプログラムは以下のように書けます。

if9.rb : 数学と英語の両方が合格点なら進級決定
math = 75
english = 45
if (math >= 50) then
  if (english >= 50) then
    print "進級決定\n"
  end
end

print文に辿り着くには、math >= 50english >= 50 の両方が成り立たないといけないからです。

論理演算子 && を使う

&& を使うと、以上のプログラムは以下のように書けます。

if10.rb : 数学と英語の両方が合格点なら進級決定
math = 75
english = 45
if (math >= 50 && english >= 50) then
  print "進級決定\n"
end

&& を使うと、2つの条件のどちらも成り立つ場合のみ成り立ちます(上記の場合print文が実行されます)。 例えば、math >= 50 は成り立つが、english >= 50 が 成り立たない場合、 math >= 50 && english >= 50 は成り立ちません。

以下の表を見て理解してください。表の中の○はその項目が「成り立つ」こと、×は「成り立たない」ことを示します。このような表を真理値表といいます。

math >= 50 english >= 50 math >= 50 && english >= 50
× ×
× ×
× × ×

このような「成り立つ」、「成り立たない」ということを扱う学問を論理学といいます。 論理学の中で一番基本的な命題論理では、「成り立つ」ことをtrue(真)、「成り立たない」 ことをfalse(偽)といいます。上の表であれば、○がtrue、×がfalseです。

Rubyも以上の命題論理に基づいた論理型というデータ型で条件判断をするのが基本です。 論理型はtrueとfalseの2つの値しか取りません。今までの例でいうと、math >= 50 や english >= 50 という式は結果としてtrueかfalseのどちらかの値になります。 もちろん math >= 50 && english >= 50 も同様です。

Rubyの場合、条件判断の条件がtrueとfalse以外でもエラーにはなりません。 falseもしくはnilという値は「成り立たない」、それ以外(もちろんtrueも含む)は 「成り立つ」と解釈されます。以下の2つの例では、必ずprint文が実行されます。
# 絶対に成り立つif文
if (true) then
  print "成り立つ\n"
end
# 0 はfalseでもnilでもないので成り立つ
if (0) then
  print "成り立つ\n"
end
逆に以下の例では絶対にprint文は実行されません。
# 絶対に成り立たないif文
if (false) then
  print "成り立つ\n"
end

論理演算子 || を使う

&& とは対象的に、2つの条件のどちらかが成り立てば、成り立つという表現もあります。

if11.rb : 数学と英語のどちらかが満点なら許す
math = 100
english = 45
if (math == 100 || english == 100) then
  print "とりあえず満点があるから許してやろう\n"
end

この場合、数学か英語のどちらかでも100点であれば、print文が実行されます。

これも真理値表を見て理解してください。

math == 100 english == 100 math == 100 || english == 100
true true true
true false true
false true true
false false false

論理演算子 ! を使う

「成り立つ」「成り立たない」をあべこべにする ! という表現もあります。

if12.rb : 50点以上でなければ赤点
math = 100
if (!(math >= 50)) then
  print "赤点です!\n"
end

この例の場合、点数が50点以上でない場合にprint文が実行されます。

表にまとめると以下のようになります。

math >= 50 !(math >= 50)
true false
false true

この場合 !(math >= 50)という風にカッコをつけないといけないことに注意してください。 カッコをつけない、つまり !math >= 50 と書くと、(!math) >= 50 という意味になってしまいます。

勘のいい人なら、!(math >= 50)math < 50 と同じ結果になることに気づくでしょう。

課題

  1. 以下のそれぞれ式と等しい式を書け。ただし、!をつけない式を答えよ。
    !(math == 50)    !(math != 50)    !(math > 50)

東京情報大学情報システム学科
大見 嘉弘(Yoshihiro OHMI)
<ohmi@rsch.tuis.ac.jp>