条件分岐
条件分岐
条件はユーザーから入力された値で、分岐は以下。
入力された値 | 処理 |
---|---|
0 | レビューを書く |
1 | レビューを読む |
2 | プログラムを終了させる |
それ以外 | 無効な値と教える |
if文で条件分岐
if文
条件分岐にはif(イフ)文という文法を使う。if文は条件式が正しいか正しくないかで処理を分岐させることができる。最も基本的なif文の書き方は以下。
1 2 3 |
if 条件式 then
# 条件式が真(true)のときに実行する処理
end
|
条件式とは基本文法で出てきた(3 > 0)などのような返り値がtrueかfalseの式のこと。if 条件式 then
とend
の間にはその条件式がtrueのときに実行する処理を書く。
このプログラムで条件式は「value > 0」で、valueは3なので条件式は真(true)となる。よってif 条件式 then
とend
の間の処理が実行され、画面に"値は正です"と表示される。
条件式が偽の場合に処理させる
値が正でないとき、つまり条件式が偽(false)のときに"値は負です"と表示させる。条件式が偽のときに処理を行うには以下のようにelseを使う。
1 2 3 4 5 |
if 条件式 then
# 条件式が真(true)のときに実行する処理
else
# 条件式が偽(false)のときに実行する処理
end
|
else
とend
の間には、条件式が偽のときに実行させる処理を書く。これを使って先ほどのプログラムに書き足して、値が負のときに"値は負です"と表示させるようにする。
今回は値を-3にしたので条件式は偽となり、"値は負です"と表示される。
複雑な条件分岐の実装
実は先ほどのプログラムは数学的には間違っている。'0'は正でも負でもないため。しかし今のプログラムで値を0にすると"値は負です"と表示されてしまう。よって条件分岐を以下のように3パターン考える。
条件 | 表示 |
---|---|
value > 0 | 値は正です |
value < 0 | 値は負です |
それ以外 | 値は0です |
このような複数の条件分岐を書くときはelsifという文法を使う。
1 2 3 4 5 6 7 8 |
if 条件式1 then
# 条件式1が真(true)のときに実行する処理
elsif 条件式2 then
# 条件式1が偽(false)のとき、かつ
# 条件式2が真(true)のときに実行する処理
else
# 条件式1と条件式2がどちらとも偽(false)のときに実行する処理
end
|
すなわち正か負か0かの条件分岐は以下のようになる。
これをソースコードに書き直す。
ユーザーから入力された値が'正'、'負'、'0'のどれかを判断するようにします。getsメソッドで得られるユーザーからの入力は文字列であるため、数値オブジェクトに変換しなければならない。
また if 条件式 thenの then は省略することができる。
to_iメソッド
文字列オブジェクトに対してto_iメソッドを使うとその文字列を数値オブジェクトに変換することができる。
数字以外の文字列オブジェクトは全て0
に変換されるので注意。
1 2 3 |
string = "30" # 文字列の30
number = string.to_i # 数値の30に変換
puts number + 20 # => 50が出力
|
1 2 3 4 5 6 7 8 9 |
gets
メソッドの返り値は「ユーザーが入力した値の文字列オブジェクト」。例えば、単純に数字で17と入力しても返り値は "17" という文字列オブジェクトになる。なので今回のようにgets.to_i
と書くことによって、文字列オブジェクトである返り値を数値オブジェクトに変換している。
メニュー画面の条件分岐
メニュー画面の実装の条件分岐。
入力された値 | 処理 |
---|---|
0 | レビューを書く |
1 | レビューを読む |
2 | プログラムを終了させる |
それ以外 | 無効な値と教える |
- 「レビューを書く」は今まで書いていたレビューを書く処理を行えば良い。
- 「レビューを読む」はまだ作っていないので何も処理はいらない。
- 「プログラムを終了する」も何も処理をしなくていい。
- 「それ以外」は"入力された値は無効な値です"と表示させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# メニューの表示
puts "レビュー数:0"
puts "[0]レビューを書く"
puts "[1]レビューを読む"
puts "[2]アプリを終了する"
input = gets.to_i
if input == 0 then # 「レビューを書く」
# 変数の定義
post = {}
puts "ジャンルを入力してください:"
post[:genre] = gets.chomp
puts "タイトルを入力してください:"
post[:title] = gets.chomp
puts "感想を入力してください:"
post[:review] = gets.chomp
line = "---------------------------"
# レビューの描画
puts "ジャンル : #{post[:genre]}\n#{line}"
puts "タイトル : #{post[:title]}\n#{line}"
puts "感想 :\n#{post[:review]}\n#{line}"
elsif input == 1 then # 「レビューを読む」
# レビューを読む
elsif input == 2 then # 「プログラムを終了する」
# プログラムを終了させる
else
puts "入力された値は無効な値です"
end
|
5 |
input = gets.to_i
|
と、to_iメソッドを使ってgetsメソッドで得た文字列オブジェクトを数値オブジェクトに変換している。
条件分岐は上の表の通りなのでif文を使って
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
if input == 0 then
# 変数の定義
post = {}
puts "ジャンルを入力してください:"
post[:genre] = gets.chomp
puts "タイトルを入力してください:"
post[:title] = gets.chomp
puts "感想を入力してください:"
post[:review] = gets.chomp
line = "---------------------------"
# レビューの描画
puts "ジャンル : #{post[:genre]}\n#{line}"
puts "タイトル : #{post[:title]}\n#{line}"
puts "感想 :\n#{post[:review]}\n#{line}"
|
と、0のときのif文if input == 0 then
の中に今まで書いていた「レビューを書く」処理を入れる。
その他の1(レビューを読む)と2(プログラムを終了させる)は今のところは何も書かない。
23 24 |
elsif input == 1 then
# レビューを読む
|
25 26 |
elsif input == 2 then
# プログラムを終了させる
|
入力された値が0でも1でも2でもない、すなわち全ての条件が偽のときはelse文
を使って
27 28 |
else
puts "入力された値は無効な値です"
|
となる。