FizzBuzz問題(Ruby)(「each文」編)


コメントいただいております通り、
訂正予定記事ですご注意くださいませ。
私の理解不足でございます。申し訳ございません。

この記事でわかること

FizzBuzz問題をRubyで解く方法
Ruby以外での回答はないのでご注意下さい。

前提

解答方法:Ruby、each文

  

FizzBuzz問題の問題文

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

<ヒント>

問題を読んで何をしていいのか思いつかなかった人は先ずToDoリストができればオッケー

問題文を分かりやすく分解したもの
・3で割り切れる数値    を引数に渡すと、「Fizz」を返す。
・5で割り切れる数値    を引数に渡すと、「Buzz」を返す。
・3と5両方で割り切れる数値を引数に渡すと、「FizzBuzz」を返す。
さらに、
・それ以外の数値は、数値を文字列にして返す。
 ※これらを条件文に直していくことがポイントになる。>>「if文についてに」戻る

  
  
  

  

解答コード

each文での解答

Ruby
(1..30).each do |i|

    if i%15==0
        puts "FizzBuzz!"
    elsif i%3==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end

end

正直、私は初学者なので複数解答がある中でこれがRubyで一番分かりやすいのではないかと思う。

  
  
  

解釈

<ポイント>

  • eachメソッド
  • if文
  • 1..30というソースコード。ピリオドを2つ連続で付ける(..)と、数字の範囲を指定することができる。   

これらが理解できていると解けなくとも問題が分かってくる。
  
  
  

eachメソッドについて

eachメソッド
(1..30).each do |i|
  //ここに処理を記述
end

「(1..30)」には繰り返したい範囲のものをかく。
iはiである理由は無いがeach do |i|からendの間で使える変数として命名されたもの他の文字でも良い。
今回の場合iは(1..30)の記述通り1から30の間の数字をいれる箱になっている。
each doなので1から30までの数字を繰り返しiに入れながら処理の部分を繰り返している。
今回は「//ここに処理を記述」の中にiという変数(箱)が使われる。
  
  

if文について

if文

if 条件文1
  puts "出力したい文字列a"
elsif 条件文2
  puts "出力したい文字列b"
elsif 条件文3
  puts "出力したい文字列c"
else
  puts each文で繰り返し処理されている数字iを出力
end

冒頭にあるヒントであげた3項目が条件になる。
また、条件をどの順番からif文の中に書いてくかも課題。
というのも「3と5両方で割り切れる数値(i%15==0)」という条件を先に記述せず、
条件の「3で割り切れる数値(i%3==0)」を先に持ってきてしまうと「3と5両方で割り切れる数値(i%15==0)」が意味の無いものになる。

条件文を実際に入れ替えて成立しない時の例は左の▶︎をクリック
<例>間違い

#「3で割り切れる数値(i%3==0)」を先にし、引数iが30の時

(1..30).each do |i|
    #条件1に30が当てはまるので puts "FizzBuzz!"が処理される。
    if  i%3==0
        puts "FizzBuzz!"
    #ここにも当てはまるが条件1で処理されてしまうので、この処理が行われることが無い。
    elsif i%15==0
        puts "Fizz!"
    elsif i%5==0 
        puts "Buzz!"
    else
        puts i
    end

end

条件の並びは十分に考えて、
実際に数字を入れて確認するのがベスト!


  
  
  

ひとことMemo

正直、初見は問題みて分からなかった。
でも、繰り返しやってみたりこうして自分で解説してみると理解しやすい。
初学者からすれば不明点が重なるので余計に挫折してしまう。
もっと解説できるところを増やして編集するので懲りずに記事を読んでやってほしい。
特に問題の場合使用できる言語がRubyだけではなくで他にもある。
ということは解答は複数ある。
また、Rubyだけでも複数ある。
今回みたいにeach文ではなくfor文での解答もあるようだ。
それもまた勉強して記事にしたい。
  
  

最後まで読んでくださって、ありがとうございます
そして、お疲れ様です✨
頭を使ったら甘いもの食べちゃいましょう!
ではまた

参考リンク

[Ruby 2.3.1でFizzBuzz問題を解く。]
URL(https://qiita.com/Fendo181/items/425293e8e638d7fd7cea)