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

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

ただいまの
回答率

89.63%

プログラミング超初心者の質問です。

解決済

回答 8

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,669

H-JURI

score 40

Rubyをベースにプログラミングを学んでいる超初心者です。どうしてもエラーが解決しないので、皆さんの力をかりたいです。

#配列のなかに3文字以上の数字が入っている時、三番目に大きい数字を返すメソッドを作れ。

def third_greatest(nums)
first = nil
second = nil
third = nil
 
  idx = 0
 while idx < nums.length
   value = nums[idx]
  if first == nil || value > first then
     third = second
     second = first
     first = value
    elsif second == nil || value > second then
     third = second
     second = value
   elsif third == nil || value > third then
     third = value
   end
   
   idx += 1
 end
 
 return third
end

# These are tests to check that your code is working. After writing
# your solution, they should all print true.

puts(
  'third_greatest([5, 3, 7]) == 3: ' +
  (third_greatest([5, 3, 7]) == 3).to_s
)
puts(
  'third_greatest([5, 3, 7, 4]) == 4: ' +
  (third_greatest([5, 3, 7, 4]) == 4).to_s
)
puts(
  'third_greatest([2, 3, 7, 4]) == 3: ' +
  (third_greatest([2, 3, 7, 4]) == 3).to_s
)

これを実行すると

$ ruby 10-third-greatest.rb
10-third-greatest.rb:15: syntax error, unexpected keyword_then, expecting keyword_end
10-third-greatest.rb:19: syntax error, unexpected keyword_elsif, expecting keyword_end
    elsif second == nil || value > second then
         ^
10-third-greatest.rb:19: syntax error, unexpected keyword_then, expecting keyword_end
10-third-greatest.rb:22: syntax error, unexpected keyword_elsif, expecting keyword_end
   elsif third == nil || value > third then
          ^
10-third-greatest.rb:22: syntax error, unexpected keyword_then, expecting keyword_end
10-third-greatest.rb:30: syntax error, unexpected keyword_end, expecting end-of-input

のようなエラーがでます。
ifのところに全角を使っている部分があるのではないか、というような指摘もいただき全角、半角に気をつけて書き直してもみたのですが解決できませんでした。どこが間違えているかわからないです。

誰か頭脳明晰な方、ご教授願います。
ちなみに使っているIDEはcloud9というものです。
このような状態になっています。

イメージ説明
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • eripong

    2015/10/22 18:17

    次回からでも良いのですが、「プログラミング超初心者の質問です。」というタイトルでなく、質問の内容が分かるタイトルにした方が良いと思います。同じタイトルで3つの別の質問があると、見ている側が混乱します。

    キャンセル

  • H-JURI

    2015/10/22 18:18

    わかりました!混乱させてしまい申し訳ないです。

    キャンセル

回答 8

checkベストアンサー

+1

少し問題を切り分けた方がよさそうですね・・・

1.if ~ end までをざっくりと削除したらどうなるか?(他のコードには手を加えずに)
def third_greatest(nums)
  first = nil
  second = nil
  third = nil
 
  idx = 0
  while idx < nums.length
    value = nums[idx]
    idx += 1
  end

  return third
end

2.elsif を使わないコードではどうなるか?
def third_greatest(nums)
  first = nil
  second = nil
  third = nil
 
  idx = 0
  while idx < nums.length
    value = nums[idx]
    if first == nil || value > first then
      third = second
      second = first
      first = value
    else
      if second == nil || value > second then
        third = second
        second = value
      else
        if third == nil || value > third then
          third = value
        end
      end
    end
    idx += 1
  end

 return third
end

3.空行やインデントを無くしてみたらどうなるか?
def third_greatest(nums)
first = nil
second = nil
third = nil
idx = 0
while idx < nums.length
value = nums[idx]
if first == nil || value > first then
third = second
second = first
first = value
elsif second == nil || value > second then
third = second
second = value
elsif third == nil || value > third then
third = value
end
idx += 1
end
return third
end

どうにもならないとき、例えくだらないことでもやってつぶしておけば確認点が消えていきますし、唸って考えて時間だけ過ぎていくよりも、やれることがあると前向きになれるので

この3パターンだけでも試してエラーが残るなら、コードの問題でなく環境の問題の可能性が高まるかなと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/22 18:04

    すべてきっちり動きました。。。
    そこで今までの動かないものを動くものの形と全く同じにしましたが以前エラーが出ます。
    これはもうバグだと割り切ったほうがよいですか?

    キャンセル

  • 2015/10/22 18:29

    あら、動きましたってことは・・・3もですよね?
    ということは、3のパターンをベースにして少しずつ問題のカタチに近づけてみてはどうでしょう?

    3のコードをベースに
    1.third = nil の下に空行(改行)をいれる

    うまくいったら
    2.if first == nil || value > first then の行だけインデントを入れてみる

    みたいな感じに

    キャンセル

+1

質問者様のコードをVim Editorに貼付けて実行してみました。

third_greatest([5, 3, 7]) == 3: true
third_greatest([5, 3, 7, 4]) == 4: true
third_greatest([2, 3, 7, 4]) == 3: true
動いている様です。

また、cloud9でも実行してみましたが、同様に動きました。
根本的な解決策ではなくなりますが、teratailにあげた、質問者様のコードを再度コピーして
coloud9に新たに別名で作って実行してみてはいかがでしょう。

追記:
こちらのコードを試してみてください。

#配列のなかに3文字以上の数字が入っている時、三番目に大きい数字を返すメソッドを作れ。
def third_greatest(nums)
  first = nil
  second = nil
  third = nil
 
  idx = 0
  while idx < nums.length
    value = nums[idx]
    if first == nil || value > first then
      third = second
      second = first
      first = value
    elsif second == nil || value > second then
      third = second
      second = value
    elsif third == nil || value > third then
      third = value
    end
   
    idx += 1
  end

 return third
end

# These are tests to check that your code is working. After writing
# your solution, they should all print true.

puts(
  'third_greatest([5, 3, 7]) == 3: ' +
  (third_greatest([5, 3, 7]) == 3).to_s
)
puts(
  'third_greatest([5, 3, 7, 4]) == 4: ' +
  (third_greatest([5, 3, 7, 4]) == 4).to_s
)
puts(
  'third_greatest([2, 3, 7, 4]) == 3: ' +
  (third_greatest([2, 3, 7, 4]) == 3).to_s
)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/22 16:45

    やはりパソコンを再起動しても質問と同様のエラーが出てしまいます。
    コードを書いているところではif, elsif,elsifの行そして最後のendにバツマークが付けられます。

    キャンセル

  • 2015/10/22 16:51

    H-JURIさん
    cloud9でコードを開いている画面キャプチャを載せていただくと何か分かるかもしれません。

    キャンセル

  • 2015/10/22 17:45

    キャプチャをのせました。
    どうでようか。

    キャンセル

0

原因としては、先の質問の回答に書きましたように、ifをRubyがif文のifと認識していないことです。
IDEをお使いと言うことで、これ以上はRubyプログラムの問題というより、IDEの使い方と言うことになるかと思います。
とにかく、質問文に書かれているプログラムは何の問題もありませんので、IDE上のプログラムがおかしいと言うことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/22 17:47

    そうですか。。。
    今まではちゃんと動いていたので再起動をしても状況が変わらないということは、今回は諦めるしかないということですよね。一応画像ものせさせていただきました。

    キャンセル

0

then を消したらどうなりますか?省略できます。
def third_greatest2(nums)
  if nums.class == Array && nums.length >= 3
    nums.sort! {|a, b| b <=> a}
    return nums[2]
  end
end
大きい順にソートしてインデックス2(3番目)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/22 18:05

    それは試したのですが、うまくいきませんでした。。。

    キャンセル

0

Macをお使いだと思うのですが、ターミナルから実行するとどういう結果になるでしょうか?
多分、正常に動作するんじゃないでしょうか?
私も、似たような問題がありました、IDEの方の問題なような気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/23 15:35

    回答ありがとうございます。
    ターミナルですか。。。それがよくわかりませんが、どうやらIDEの問題だったようです。今は普通に実行できます。
    惑わしてしまい大変失礼いたしました。

    キャンセル

0

エディタの9, 13, 16, 24行目のエラーを再現できないか試行錯誤するとifの手前を全角スペースにすると再現しました。
まだ全角スペースを疑っています。
お手数ですがコピペではなく日本語変換を確実に切って全部入力し直し、その際にインデントはエディタに任せて自分で入力しないようにするとどうなるでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/23 15:39

    回答ありがとうございました。
    確かにifの前だけ動きがおかしいので、さいど半角で入力しても勝手に全角の幅をとってしまいます。IDEの問題だと結論づけて新しいワークスペースで実行するとうまくいきました。惑わしてしまい大変申し訳ありませんでした。

    キャンセル

  • 2015/10/23 15:44

    無事に動いたんですね。おめでとうございます。
    利用されているブラウザがChromeやFirefoxなら拡張機能も疑ったのですが、新規ワークスペースで問題ないのなら違いそうです。
    結局、原因は分からずじまいでちょっと気持ち悪いですね。

    キャンセル

0

Cloud9 で実行してみましたが、エラー無く実行できました。
全角スペース なのか タブ なのか分かりませんが、単純にコピペしたところ不正なコードが混入してしまっていました。
(目視では分かりませんが、カーソル移動キーでカーソルを動かしてみると、その部分だけ動き方が違うので分かります。)
もしかしたら、コピペする際に変なコードが混入してしまう場合があるのかもしれません…

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/23 15:45

    回答ありがとうございました。
    確かにカーソルをうごかしてみると、ifあたりの動き方が違っいました。一旦消して再度半角で入力しても同じ状況になるので、IDEの問題だと結論ずけました。考えてくださり大変ありがとうございました!

    キャンセル

  • 2015/10/23 16:28

    行の先頭だけでなく、行の途中や末尾など、スペースのように見える箇所は全て確かめましたか?
    おかしな箇所はいくつもあったので、自分は空白を基本的には全て入力し直しました。

    ついでにコメントしておくと、コピーしたソースを貼り付けようとしたところ、初回のみワーニング(詳しい文面は忘れた)が表示され、了解する旨のボタンをクリックしたところ改行なしで全てが一行になってしまいました。
    やむなくマニュアル作業で整形している最中に怪しいコードの混入に気づいたという次第です。
    ですので、IDEそのもののバグというよりもクリップボードとの連携に不備があるのかもしれません。
    ちなみに、このとき自分はMac版のFirefoxを使用していました。
    Cloud9が学習用途のお試し的使用を想定しているなら、ソースのコピペではなくて参考書の写経(手入力)を想定しており、そのあたりのテストは不十分なのかもしれませんね。
    いずれにしても、環境の不備が原因で学習が止まっては勿体ないので、先ずはPC上に学習用の環境を整える事をオススメ致します。

    キャンセル

0

cloud9 はLinux環境ごと提供しているクラウド開発環境のようですね。
環境設定などされましたか? gem install など、、
その気になれば開発環境ごと壊せるようですね。

そうなったら都度で直すよりも新しくプロジェクト作った方が良いと思います。
新しくプロジェクトを作って実行されると、そのコードでエラーなく実行できます。

私が実行してうまくいった手順は以下のとおり

1. ダッシュボードに移動
2. Create a new workspace
3. Workspace name を入力 > Custom を選択 > Create workspace
4. 画面下のコンソールで入力

$ >> test.rb

5. IDEの左に出てくるtest.rbをダブルクリック
6. ソースコードを貼り付け > 保存
7. 下のターミナルからrubyを実行

$ ruby test.rb

すると、下記のような結果が得られました。
ちゃんとコード描けてますね。

skyyfish@test_cloud9:~/workspace $ ruby test.rb                                                                               
third_greatest([5, 3, 7]) == 3: true
third_greatest([5, 3, 7, 4]) == 4: true
third_greatest([2, 3, 7, 4]) == 3: true

という感じです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/23 15:43

    回答ありがとうございます。
    どうやら、IDEの問題だったようです。
    無意識のうちに何か変なことをしてしまったのでしょうか。。。
    しかし、コードミスの他にもこのような事でエラーがでることもある、ということを知れてよかったです。

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる