🗂

【Ruby学習記録】条件分岐と演算子

2022/09/06に公開

お題1:変数is_sunny が真なら"晴れです"と出力し、偽または nil なら"雨です”と出力せよ。

基本情報の試験とかで「構造化プログラミング」というキーワードが出てきたかと思うが、そこでのプログラムの基本要素は「順次」「選択」「繰り返し」と学習してきた。
Rubyのプログラミングであっても、この3つの組み合わせでさまざまなアルゴリズムを実現していくのは同じ。
ということで、このお題は「分岐」の処理を実装しよう、というもの。

q.rb
is_sunny = true

if is_sunny
  puts "晴れです"
else
  puts "雨です"
end

他の多くのプログラム言語と同様、RubyもYes/Noの単純な分岐は「if ~ else ~ end」で行う。

お題2:変数 score に0〜100の中で好きな数字を代入し、以下の条件に応じて出力が変わるように実装せよ。

90以上 なら"素晴らしい!"
70 以上かつ90 未満なら"いい感じ"
それ以外なら"まだまだこれから"

score = 100

if score >= 90
  puts "素晴らしい!"
elsif score >= 70
  puts "いい感じ!"
else
  puts "まだまだこれから"
end

「選択」の処理の派生系として、このお題のような「多肢選択」というパターンで処理を行いたい場合もある。
もちろん、多肢選択用の処理を書かなくても、ifを入れ子にしていくことで実現はできるが、ソースの可読性・要求されている仕様を踏まえた場合、多肢選択というのが明示的にわかる方が良い場合もある。

その際の1つのパターンとして、Rubyの場合は「if ~ elsif ~ else ~ end」という構文がある。
*他のプログラム言語だと「if ~ else if ~ else ~ endif (PHP)」といったように微妙に違うことが多いので注意。

お題3:下記の if 文で記述されたコードと同じ処理を三項演算子を使って実装せよ。

example.rb
age = 22

if age >= 20
  result = "成人です"
else
  result = "未成年です"
end

puts result
answer.rb
age = 22

result = age >= 20 ? '成人です' : '未成年です'

puts result
===
$ ruby answer.rb
成人です

Yes/Noの単純な分岐は「if ~ else ~ end」で行えば良いのだが、分岐した結果、変数に代入する値を変えるだけ、とか出力するメッセージが違うだけ、といったようにごく単純な処理を行うだけの場合は、三項演算子という表記方法が使える。

  [条件式] ? [真の場合] : [偽の場合]

この場合は、上記のように書ける。さらに、これが一連の式という扱いになるので、式の戻り値として[真の場合]/[偽の場合]の値を受け取ることができるので、このお題の解答のように変数に代入することもできる、といった具合。

お題4:下記のコードを拡張して出力例のように出力されるようなコードを実装してみましょう。

example.rb
attack_result = rand(6) # attack_result に 0〜6 のランダムな整数を代入する
puts "結果: #{attack_result}"

出力例

変数 attack_result が
0の場合"会心の一撃!モンスターを倒した!"、
1の場合"ミス!モンスターにダメージを与えられない!"、
2の場合"モンスターは素早く攻撃をかわした!"、
それ以外の場合"モンスターに◯のダメージをあたえた!"

attack_result = rand(6)

case attack_result
when 0
  puts '会心の一撃!モンスターを倒した!'
when 1
  puts 'ミス!モンスターにダメージを与えられない!'
when 2
  puts 'モンスターは素早く攻撃をかわした!'
else
  puts "モンスターに#{attack_result}のダメージをあたえた!"
end

多肢選択の別のパターンとして、Rubyの場合「case 変数 when 判定値 ~ end」という構文が用意されている。
他の言語の場合「switch 変数 case 判定値 ...」というパターンもよく見られるので、混乱しないように注意が必要。
なお、CやPHPが switch を使う言語の代表例。

「if ~ elsif ~ else ~ end」と「case 変数 when 判定値 ~ end」の2パターンがあると、どっちを使えば良いか慣れないと混乱しがちだが、case 文は「とあるひとつの変数の値」に着目して分岐していくという処理になる。

なので、今回みたいに乱数が入っている変数の値によって処理を分けたいような場合は case 文が直感的に記述出来るが、複数の変数が関与するようなちょっと複雑な条件になる場合は、「if ~ elsif ~ else ~ end」を使う必要がある。

深く突き詰めていけば、case 文を「if ~ elsif ~ else ~ end」のように記述するテクニックがあったり、「when 値の範囲」と記述して、範囲指定で条件分岐していくテクニックもあるようだが、どちらを使っていくかは好みで良いかと思う。
*2つあるとややこしいので、「switch文/case文」が用意されていないPythonみたいな言語もある。

GitHubで編集を提案

Discussion