さらなる高みへ -higher ground -

プログラミング学習の定着を狙いとしたアウトプット(独り言)をしてみるブログ

メニュー画面の作成

ここでは、プログラムを実行してから最初に表示されるメニュー画面を表示できるようにすることが目標である。

学習テーマは「条件分岐ができるようになる」である。

まずはメニューを表示させる。

メニューは
[0]レビューを書く
[1]レビューを読む
[2]アプリを終了する
の三項目を表示したあとユーザーの入力を待つ。

入力後は今まで通り、レビューを書く画面を表示させる。

# メニューの表示
puts "レビュー数:0"
puts "[0]レビューを書く"
puts "[1]レビューを読む"
puts "[2]アプリを終了する"
input = gets

# 変数の定義
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 レビューを書く
1 レビューを読む
2 プログラムを終了させる
それ以外 無効な値と教える

if文で条件分岐をする

条件分岐にはif文という文法を使う。
if文は条件式が正しいか正しくないかで処理を分岐させることができる。

最も基本的なif文の書き方は以下の通り。

if 条件式 then
  # 条件式が真(true)のときに実行する処理
end

条件式とは基本文法で出てきた(3 > 0)などのような返り値がtrueかfalseの式のことである。
if 条件式 thenとendの間にはその条件式がtrueのときに実行する処理を書く。

複雑な条件分岐の場合

例えば条件が3つに分かれるような場合、どのような考え方になるか。

条件 表示
value > 0 値は正です
value < 0 値は負です
それ以外 値は0です

このように複数の条件分岐を書くときはelsifという文法を使う。

if 条件式1 then
  # 条件式1が真(true)のときに実行する処理
elsif 条件式2 then
  # 条件式1が偽(false)のとき、かつ
  # 条件式2が真(true)のときに実行する処理
else
  # 条件式1と条件式2がどちらとも偽(false)のときに実行する処理
end

値が正か負か0か、ロジック的には以下のような形となる。

If

これをソースコードに書き直すと、

value = gets.to_i #※

if value > 0 then
  puts "値は正です"
elsif value < 0 then
  puts "値は負です"
else
  puts "値は0です"
end

このコードによりユーザーから入力された値が'正'、'負'、'0'のどれかを判断する。
getsメソッドで得られるユーザーからの入力は文字列であるため、数値オブジェクトに変換しなければならない。

※getsメソッドの返り値は「ユーザーが入力した値の文字列オブジェクト」となる。
例えば、単純に数字で17と入力しても返り値は "17" という文字列オブジェクトと判断されてしまう。
そのため今回のようにgets.to_iと書くことによって、文字列オブジェクトである返り値を数値オブジェクトに変換する。

なお、if 条件式 thenの then は省略可。

メニュー画面の条件分岐

さて、ここからようやく今回のメインテーマであるメニュー画面の条件分岐である。
ここでもう一度メニュー画面の条件分岐についてまとめてみる。

入力された値 処理
0 レビューを書く

1

レビューを読む
2 プログラムを終了させる
それ以外 無効な値と教える

これを踏まえてコードに表すと

# メニューの表示
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

となるが、コード量がやや多い。
複数の処理をメソッドにまとめると、

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

となる。