記憶の外付けHDD

切実に頭にUSBのコネクターがほしいです。なるべくtype-cでお願いしたいです。(忘れないように、プログラミング学習で学んだことを投稿してます)

2019/09/11_case文の使い方(fizzbuzz問題)

はじめに

rubyアルゴリズム問題で、苦戦してしまったので、その解説をしようと思います。
その問題とは、rubyifを使わず、fizzbuzz問題を解くと言うものです。

はまった点

条件分岐だけど、if使えないってことは…
case文を使えばいいのかってなったんですけど、そもそものcaseの使い方があやふやなため、このあと 、ドツボにハマりました。

実際に書いたコード

for num in 1..100 do
  case num
  when num % 15 == 0
    puts "fizzbuzz"
  when num % 5 == 0
    puts "fizz"
  when num % 3 == 0
    puts "buzz"
  else
    puts num
  end
end

結果、1から100までの数字が素直に出力されました…

case文について理解する

case文はif文と同じ条件分岐の仲間なので、使い慣れているif文をcase文で書き直してみたいと思います。

例題プログラム

変数hospitalに

  • "takasu"が入っていたら、YES!
  • "shonan"が入っていたらpassion!
    を返すプログラムを作ってみます。
    (考えてるとき、湘南美容外科クリニックの広告が目の前にあったもんで…)

if文

hospital = "takasu"

if hospital == "takasu"
  puts "YES!"
elsif hospital == "shonan"
  puts "PASSION!"
end

=> "YES!"が出力

んー、しっくり!
ドバイあたりをヘリコプターで飛んでいる光景が目に浮かんできます。

case文

さっきの美容外科プロクラムをcaseで書いてみると

hospital = "shonan"

case hospital
when "takasu" then
  puts "YES!"
when "shonan" then
  puts "PASSION!"  
end

=> "PASSION!"が出力

ちゃんと、相川先生の好きな言葉が返ってきました。

ポイント

  • caseの後ろに比較の対象となるオブジェクトを指定する
  • whenのあとには、一致しているか検査する値&実行する処理を記載する。

変数に入った値が一致しているかどうかはイメージつくけど、
fizzbuzz問題みたいに、計算結果を比較したい場合はどうすればいいのか…?

考察

開き直って、case文の特徴を抜き出してみると…

  • 「caseの後ろ」と「whenの後ろ」が一致している
    → 処理が開始する

  • 「case」には、不変の値を書く

ってことだから…

  • caseの後ろに0を書く(条件分岐の中で不変の部分だから)
  • whenの後ろnum % ◯(式の部分)を配置

したらどうか…?

 # コードは以下のとおり
 
for num in 1..100 do
  case 0
  when num % 15 then
    puts "fizzbuzz"
  when num % 5 then
    puts "fizz"
  when num % 3 then
    puts "buzz"
  else
    puts num
  end
end

考察結果

実行できました!

f:id:daawwaa:20190911195446j:plain
結果

参考

- case文 - 条件分岐 - Ruby入門

感想

  • 解決できてうれしかった!四角い頭が丸くなった感じです!
  • ただ、公式リファレンスとか見ず、推論だけでいろいろ試してみただけなので、プログラミングの学習方法として正しかったのか自信ないっす…

以上