05.条件分岐(if文)


ここから徐々にプログラムっぽいことをやっていきますわ(`・ω・´)

プログラムをやっていると、
特定の条件にあてはまる時だけ実行させたい命令ってのが出てきますよね。
それが条件分岐でして、もっとも基本的なのがif文。
というわけで、今回はif文にチャレンジだッ!!(`・ω・´)

Rubyでのif文の書き方はこんな感じ。

if 条件式1 then
  (条件式1に当てはまった時に実行させたい命令1)
  (条件式1に当てはまった時に実行させたい命令2)
elsif 条件式2 then
  (条件式2に当てはまった時に実行させたい命令1)
  (条件式2に当てはまった時に実行させたい命令2)
elsif 条件式3 then
  (条件式3に当てはまった時に実行させたい命令1)
  (条件式3に当てはまった時に実行させたい命令2)
else
  (どの条件式にもあてはまらない時に実行させたい命令1)
  (どの条件式にもあてはまらない時に実行させたい命令2)
end

こんな感じ。まぁ習うより慣れろって感じでやってみましょうや。
まずは簡単に。

# encoding: utf-8

#変数に値を代入
tanaka_score=80
ossan_score=80

#二人の点数を出力
print "タナカの得点は",tanaka_score,"点です\n"
print "管理人の得点は",ossan_score,"点です\n\n"

#判定
if ossan_score == tanaka_score then
  	print "二人の得点は同じです。やったね!!"
end

こいつを実行させるとこんな感じになります。
01
これは、tanaka_scoreに代入された値と、
ossan_scoreに代入された値が等しい時に、
『二人の得点は同じです。やったね!!』と表示されるプログラムです。
このように、必要なければelsifとelseの部分は省略出来ます。

また、今回の条件式で『等しい』を表すのに、
『イコール(=)』の記号を2つ繋げて、『==』を使っています。
これは、通常プログラムでは『=』は変数への代入を意味するためです。
この辺は、次回あたりにでもシッカリ取り上げるつもりです。

次は、条件式に当てはまらない時の処理も付け加えます。

# encoding: utf-8

#変数に値を代入
tanaka_score=80
ossan_score=80

#二人の点数を出力
print "タナカの得点は",tanaka_score,"点です\n"
print "管理人の得点は",ossan_score,"点です\n\n"

#判定
if ossan_score == tanaka_score then
  print "二人の得点は同じです。やったね!!(・∀・)"
else
  print "二人の得点は違います。残念……(´・ω・`)"
end

こいつを、ossan_scoreに代入される値を色々と変えて走らせてみます。
すると~……
02-1
02-2
こんな感じの結果になります。

次は、一つ目の条件式に当てはまらなかった場合、
さらに次の条件にあてはまるか確認するようにしてみます。

# encoding: utf-8

#変数に値を代入
tanaka_score=80
ossan_score=80

#二人の点数を出力
print "タナカの得点は",tanaka_score,"点です\n"
print "管理人の得点は",ossan_score,"点です\n\n"

#判定
if ossan_score > tanaka_score then
  print "管理人がタナカに勝ったよ!! やったね!!(・∀・)"
elsif ossan_score == tanaka_score then
  print "管理人とタナカが並んだよ! スゴい!!(`・ω・´)"
else
  print "管理人はタナカに負けました……残念(´・ω・`)"
end

こんな感じ。
最初の条件式に使われている『>』は、『左側の数より右側の数が大きい』の意味です。
算数や数学の時に使う『大なり』のことですよ。
似た仲間で『<(小なり)』がありますね。

こいつをossan_scoreを色々変えて実行してあげると、こんな感じ。
03-1 03-2 03-3
こんな感じで、最初の条件式にあてはまらなかったら、
『elsif』を使って、さらに条件式を追加することが出来ます。

他の言語ですでにプログラミングの経験がある人への注意ですが、
『else if』でもなければ『elseif』でもなく、『elsif』です。
よく見ていただけるとわかりますが、『e』がありません。
この辺よくご注意下さいまし。おれは10分ほどハマりました(;・∀・)
最初はね、手打ちでプログラムを組む主義なのよ、ワタクシ(´・ω・`)

さて、ここまでは数による条件分岐をやってきましたけど、
やっぱり……というか何というか、文字列の比較でも条件分岐が可能です。
たとえば~……

# encoding: utf-8

#変数に値を代入
name = "管理人"
favorite = "歌丸師匠"

#変数の値を出力
print "彼の名前は ",name," です\n"
print "favorite = ",favorite,"\n\n"
#条件分岐
if favorite == "歌丸師匠" then
  print name," は、笑点メンバーの中で、歌さんを神だと思っています(`・ω・´)\n"
elsif favorite == "圓楽師匠" then
  print name," は、笑点メンバーの中では、腹黒な楽さんがお気に入りです(・∀・)\n"
else
  print name," は、笑点メンバーの中では ",favorite," が好きなようです。\n"
end

こんなプログラムを書いてみました。
これは、歌丸師匠が好きなのか園楽さんが好きなのかどちらでもないのかで、
表示するメッセージを変えるプログラムでして、
これを実行するとこんな感じです。
04-1 04-2 04-3
こんな感じで、文字列でも問題なく比較出来ます。

最後にちょっと実験として、rubyが融通を効かせてくれるか調べてみます。
以下の様なプログラムを書いてみました。

# encoding: utf-8

#変数に値を代入
number = 255
string = "100"

#2つの変数の中身を出力
print "number = ",number,"\n"
print "string = ",string,"\n\n"

#2つの値を比べてみる
if number > string then
  print "numberよりstringの方が、小さい数です!!(・∀・)"
else
  print "stringよりnumberの方が、小さい数です……(´・ω・`)"
end

このプログラム、見た感じだと、
『numberよりstringの方が、小さい数です!!(・∀・)』と表示されるはずですが……
結果はこうなります。
06
怒られてしまいました(;・∀・)
怒られた内容を見ると、
『数と文字列の大小比較なんか出来るかボケェエッ!!ヽ(`Д´#)ノ』
という感じでしょうか……。
ただ、こっちの気分としては、『両方とも数を入れてるやん!!ヽ(`Д´#)ノ』
と文句を言いたくなりますよねぇ……

ここでもう一度、プログラムの冒頭……変数への代入部分を見てみます。

#変数に値を代入
number = 255
string = "100"

numberへの代入とstringへの代入に違いがありますよね。
numberの方は生のまま代入してますが、
stringの方への代入は、いちいちダブルクォーテーション(””)で囲ってます。

これ、ダブルクォーテーションで囲った結果、
『100』というではなく、『100』という文字列として認識されているわけです。
要はデータの種類としては『歌丸師匠』や『おっぱい』とかと同じ仲間とRubyは思ってるわけです。
数と文字の大小の差なんてつけようが無いですから、
Rubyは『出来るかボケェエッ!!ヽ(`Д´#)ノ』とブチギレておいでなのです。

この辺のことがもっとよく分かるように、
以下のようなプログラムを組んでみました。

# encoding: utf-8

#変数に値を代入
number = 255
string = "255"

#2つの変数の中身を出力
print "number = ",number,"\n"
print "string = ",string,"\n\n"

#2つの値を比べてみる
if number == string then
  print "numberとstringの中身は、同じものです!!(・∀・)"
else
  print "numberとstringの中身は違いますよ……(´・ω・`)"
end

見た目は『255』と『255』なので、
恐らく結果としては
『numberとstringの中身は、同じものです!!(・∀・)』
と表示されそうですが……果たして……

結果はこちら。どすんっ
05
ほい。というわけで、rubyは『255』と『”255″』は明確に区別しています。

ちなみになぜこれをおれは『融通』と表現したかというと、
PHPをやってる人なんかはピンとくるとは思うのですが、
言語の中には、この辺のことがズルズルになってるものもあります。
件のPHPなんかは、おそらく、
『数と文字でしたけど、見た感じ同じだから同じものだと思っちゃいました!!(・∀・)』
と言わんばかりに『numberとstringの中身は、同じものです!!(・∀・)』と表示しそうです。
これは見ようによっては『PHPが気を利かせてくれた』とも受け取れるので、
おれはよくこの手のことを『融通』と表現します。

慣れてくればデータの種類がズルズルなものも便利で良いのですが、
少なくとも最初のうちは、データの種類は厳格に区別されてる方が勉強しやすくていいです。
実際何も知らないうちだと混乱しますし、データの種類に関して鈍感になっちゃうのもダメ。
データの種類に関しては敏感に反応するぐらいの方がいいです。
『くやしいッ でも分かっちゃうッ(ビクンビクンッ)』ぐらいの方がいいです。

if文だけでかなりの長さになってしまいました……(;・∀・)
次回はif文とは切っても切れない関係である、
論理演算でもやろうかなぁと思ってます(`・ω・´)

ちなみにデータの種類のことを、
プログラマの間では『型』といいます。
この辺はまた別の機会にじっくりとやろうと思ってます。