質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

371閲覧

配列の要素の計算を条件分岐に使えない

pi_neko

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2019/05/28 07:38

編集2019/05/28 08:51

前提・実現したいこと

プログラミング初心者です。

配列がいくつも与えられた条件で、配列2以降から配列Xを作成し、Xの要素の引き算の結果を配列1の要素と比較して条件分岐に使おうと試みました。

イメージ
配列1[10, 20, 30] ←これの[1]以上かどうかを条件分岐に使いたい
配列2 [2, 35, 40]← これ以降の配列の[2]から新しい配列を作成
配列3 [40, 50, 80]

配列X [40, 80] ←新しい配列。これの[n+1] 番目から[n]番目を引く

計算結果 80 - 40 = 40
この計算結果、40が配列1の[1]である20以上かどうかで条件分岐をしようとした感じです。

一応引き算まではできていまして、クラスを判定してもIntegerでしたし、条件分岐内で配列1の数字を呼び出して表示してみても表示されます。
ところが、引き算の結果が配列1[1]以上なら~とやっている文がメソッドエラー判定になります。

なにか良くないことをしているのはわかるのですが、上記の通り表示をしてもクラスを調べても不明点が出てこないので自力では限界です。

ご教授いただけるとありがたいです。

※できればこの件自体の解決策と、そもそもの発想自体(配列を作り直して引き算をしていますが、そういう発想)の別案のヒントがいただけるとありがたいです。

発生している問題・エラーメッセージ

エラーメッセージ

undefined method -' for nil:NilClass (NoMethodError) from Main.rb:16:in times'
from Main.rb:16:in `<main>'

該当のソースコード

Ruby

arr[0].times do
hikaku = (newary[n+1] - newary[n])
if hikaku > arr[1]
flag = 1
end
n = n +1
end

試したこと

はじめは(newary[n+1] - newary[n])をそのまま条件文に入れていましたが動かないので変数にしました。
(newary[n+1] - newary[n])自体は動いていて、printすると回数分の表示もされます。

補足情報(FW/ツールのバージョンなど)

見ていただきありがとうございます。実際は与えられた配列はもっとありまして、配列Xは[40, 80, 90, 100, 120]のようになります(必ずn+1番の方が大きくなります)

また、ソースコードは途中のものでイメージでいうと配列1にあたるのがarrで、与えられた配列から新しく作った配列に当たるのがnewaryです。(与えられた配列を処理するコードは省いています。またarr[0]で与えられた数字の数だけ配列が与えられるので、newaryの要素数はこの場合ですと10になっているはずです)
説明不足で申し訳ありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2019/05/28 07:56

例に出していただいている配列ですと n = 0のときは 80 - 40 n = 1 のときは [?] - 80 と、なりますが、[?]の部分はどうしましょうか?
torisan

2019/05/28 08:03

例では4つの配列が登場していますが、 ソース内では2つしか宣言されていません。 1~3とXが、ソースのどの配列に対応しているか教えてください。
guest

回答2

0

ruby

1$ irb 2irb(main):001:0> newary = [40, 70, 81, 82, 81] 3=> [40, 70, 81, 82, 81] 4irb(main):002:0> diff_ary = newary.each_cons(2).map{|a, b| b - a } 5=> [30, 11, 1, -1]

その各陽さが a[] より大きいかの判定結果を配列で得ることもできます。

ruby

1irb(main):003:0> a = [10, 20, 30] 2=> [10, 20, 30] 3irb(main):004:0> diff_ary.map{|x| x > a[1]} 4=> [true, false, false, false]

投稿2019/05/28 22:09

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pi_neko

2019/05/29 16:49 編集

>each_cons 不勉強で今知りましたが、こういう時にぴったりなモジュールですね。今後積極的に使っていきたいです。 また、判定結果自体を配列にする(今回はこちらをやってみてtureがあるかどうかを判定した方がすっきりしている気がします)という発想もなかったので、とても勉強になりました。ありがとうございます!!
guest

0

ベストアンサー

undefined method -' for nil:NilClass (NoMethodError)

これは-の左辺がnilなので-演算できない。という意味です。
つまり、newary[n+1]nilが返ってくるnが存在しています。

気になるのは2点、

  1. n+1の最大値がnewary.size-1より小さいのか
  2. nの初期化がどこで行われているか?です。

ruby

1n = 0 2arr[0].times do 3 n += 1 4end

ならばいいのですが、

ruby

1n = 0 2loop{ 3arr[0].times do 4 n += 1 5end 6}

ですと、narr[0]よりも大きくなります。


nの増え方が特殊でない限りは
timesメソッドのブロックパラメーターを用いて

ruby

1arr[0].times do |n| 2 hikaku = (newary[n+1] - newary[n]) 3 if hikaku > arr[1] 4 flag = 1 5 end 6end

とした方がよいでしょう。

投稿2019/05/28 09:25

編集2019/05/28 09:26
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pi_neko

2019/05/28 15:30

ありがとうございます。 配列の数をそのまま回して引き算していたので、確かに存在しないn +1番めが出てきます。 ご教授いただいたsize-1を使い、回す回数を減らしたら動きました! ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問