hibikousinnkibouのブログ

駆け出しプログラマーによる足跡ブログ

ポイント付与、誕生日ポイント付与の問題(ruby)

999円以下の買い物には3%

1000円以上の買い物には5%

誕生日には5倍ポイントとなるような記述の問題。

calculate_points(amount, is_birthday)を使用して呼び出すこと。

(出力例)calculate_points(500, false) → ポイントは15点です

 

if文を利用することは考えたが、パターンは4つ(「999円以下で誕生日以外」「999円以下で誕生日」「1000円以上で誕生日以外」「1000円以上で誕生日」)あるので記述がやたら冗長になると感じた。

def calculate_points(amount, is_birthday)
  if amount < 1000 && is_birthday == false
    puts "ポイントは#{(amount * 0.03).floor}点です"
  elsif amount < 1000 && is_birthday == true
    puts "ポイントは#{(amount * 0.03 * 5).floor}点です"
  elsif amount > 1000 && is_birthday == false
    puts "ポイントは#{(amount * 0.05).floor}点です"
  else
    puts "ポイントは#{(amount * 0.05 * 5).floor}点です"
  end
end

とりあえず出力はされたが、冗長である。

模範回答は以下

def calculate_points(amount, is_birthday)
  if amount <= 999
    point = amount * 0.03
  else
    point = amount * 0.05
  end
  if is_birthday
    point = point * 5
  end
  puts "ポイントは#{point.floor}点です"
end

分岐を作るが、どちらも point を定義。

 is_birthday が true か false なので、 if is_birthday とすることで条件分岐ができる。

point = point * 5

で amount で分岐した point を代入。

point *= 5

とすることも可。

if 文を連続使用すること、定義する変数を少なくすることでスッキリした記述になっている。