問題
以下の配列から任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドを、each_with_index
を用いて作成するという問題。
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
出力例
search(5, input) → 2番目にあります
search(12, input) → 4番目にあります
search(7, input) → その数は含まれていません
まず、each_with_index
がわからないので理解します。
each_with_indexメソッドとは
配列名.each_with_index do |item, i|
end
例
fruits = ["メロン", "バナナ", "アップル"]
fruits.each_with_index do |item, i|
puts "#{i}番目のフルーツは、#{item}です。"
end
出力結果
0番目のフルーツは、メロンです。
1番目のフルーツは、バナナです。
2番目のフルーツは、アップルです。
とりあえず、書いてみる。
def search(target_num, input)
input.each_with_index do |num, i|
puts "#{i}番目にあります。"
end
end
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(5, input)
出力結果
0番目にあります。
1番目にあります。
2番目にあります。
3番目にあります。
4番目にあります。
5番目にあります。
6番目にあります。
7番目にあります。
8番目にあります。
9番目にあります。
10番目にあります。
11番目にあります。
12番目にあります。
13番目にあります。
14番目にあります。
15番目にあります。
意図した結果とかなり違います。
失敗を分析して次に活かします。
- 数値がない場合は「ありません」を返すのでif文を使ってみる。
-
each do
で配列を全部表示してしまっているのでreturn
で止めてみる。
書いてみる。(2回目)
こういうこと?
def search(target_num, input)
input.each_with_index do |num, i|
if num == input[i]
puts "#{i + 1}番目にあります。"
return
else
puts "その数は含まれていません。"
end
end
end
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(5, input)
出力結果
1番目にあります。
1番目にはないんです。
ということは if num == input[i]がまずそうです。
returnで止まったのはよかった。
”5”と”num”が同じになったところで表示してほしい・・・
また書いてみる
・仮引数と実引数の値の受け渡しがよくわからないので、困ったらbinding.pry
。
・・・エラー。どうやらrailsでしか使えない?
-
binding.pry
が使えないなら、puts
で直接出力してみる。
結果
puts target_num → 5
puts num → 3
なるほど、target_num
は仮引数からの引き継ぎ?でメソッドの中でも”5”、num
は配列の一つ目の値”3”ということ。
ということは num
とtarget_num
がイコールでif文を作ればいいんですかね。
def search(target_num, input)
input.each_with_index do |num, i|
if num == target_num
puts "#{i + 1}番目にあります。"
return
else
puts "その数は含まれていません。"
end
end
end
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(5, input)
出力結果
その数は含まれていません。
2番目にあります。
余計な表示が出てる・・・
else
がいらない?
配列の中を探してもイコールの値が見つからなかった結果が”含まれていない”だからeach分の外に表記?
def search(target_num, input)
input.each_with_index do |num, i|
if num == target_num
puts "#{i + 1}番目にあります。"
return
end
end
puts "その数は含まれていません。"
end
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
search(5, input)
出力結果
2番目にあります。
こういうことですね!
スッキリしました!