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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

8回答

3108閲覧

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

H-JURI

総合スコア42

Ruby

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2015/10/22 06:54

編集2015/10/22 08:44

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

Ruby

1#配列のなかに3文字以上の数字が入っている時、三番目に大きい数字を返すメソッドを作れ。 2 3def third_greatest(nums) 4first = nil 5second = nil 6third = nil 7 8 idx = 0 9 while idx < nums.length 10 value = nums[idx] 11 if first == nil || value > first then 12 third = second 13 second = first 14 first = value 15 elsif second == nil || value > second then 16 third = second 17 second = value 18 elsif third == nil || value > third then 19 third = value 20 end 21 22 idx += 1 23 end 24 25 return third 26end 27 28# These are tests to check that your code is working. After writing 29# your solution, they should all print true. 30 31puts( 32 'third_greatest([5, 3, 7]) == 3: ' + 33 (third_greatest([5, 3, 7]) == 3).to_s 34) 35puts( 36 'third_greatest([5, 3, 7, 4]) == 4: ' + 37 (third_greatest([5, 3, 7, 4]) == 4).to_s 38) 39puts( 40 'third_greatest([2, 3, 7, 4]) == 3: ' + 41 (third_greatest([2, 3, 7, 4]) == 3).to_s 42)

これを実行すると

lang

1$ ruby 10-third-greatest.rb 210-third-greatest.rb:15: syntax error, unexpected keyword_then, expecting keyword_end 310-third-greatest.rb:19: syntax error, unexpected keyword_elsif, expecting keyword_end 4 elsif second == nil || value > second then 5 ^ 610-third-greatest.rb:19: syntax error, unexpected keyword_then, expecting keyword_end 710-third-greatest.rb:22: syntax error, unexpected keyword_elsif, expecting keyword_end 8 elsif third == nil || value > third then 9 ^ 1010-third-greatest.rb:22: syntax error, unexpected keyword_then, expecting keyword_end 1110-third-greatest.rb:30: syntax error, unexpected keyword_end, expecting end-of-input

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

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

イメージ説明

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

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

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

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

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

eripong

2015/10/22 09:17

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

2015/10/22 09:18

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

回答8

0

ベストアンサー

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

1.if ~ end までをざっくりと削除したらどうなるか?(他のコードには手を加えずに)

ruby

1def third_greatest(nums) 2 first = nil 3 second = nil 4 third = nil 5 6 idx = 0 7 while idx < nums.length 8 value = nums[idx] 9 idx += 1 10 end 11 12 return third 13end 14

2.elsif を使わないコードではどうなるか?

ruby

1def third_greatest(nums) 2 first = nil 3 second = nil 4 third = nil 5 6 idx = 0 7 while idx < nums.length 8 value = nums[idx] 9 if first == nil || value > first then 10 third = second 11 second = first 12 first = value 13 else 14 if second == nil || value > second then 15 third = second 16 second = value 17 else 18 if third == nil || value > third then 19 third = value 20 end 21 end 22 end 23 idx += 1 24 end 25 26 return third 27end 28

3.空行やインデントを無くしてみたらどうなるか?

ruby

1def third_greatest(nums) 2first = nil 3second = nil 4third = nil 5idx = 0 6while idx < nums.length 7value = nums[idx] 8if first == nil || value > first then 9third = second 10second = first 11first = value 12elsif second == nil || value > second then 13third = second 14second = value 15elsif third == nil || value > third then 16third = value 17end 18idx += 1 19end 20return third 21end 22

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

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

投稿2015/10/22 08:45

takito

総合スコア3111

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

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

H-JURI

2015/10/22 09:04

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

2015/10/22 09:29

あら、動きましたってことは・・・3もですよね? ということは、3のパターンをベースにして少しずつ問題のカタチに近づけてみてはどうでしょう? 3のコードをベースに 1.third = nil の下に空行(改行)をいれる うまくいったら 2.if first == nil || value > first then の行だけインデントを入れてみる みたいな感じに
guest

0

質問者様のコードを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 07:15

編集2015/10/22 07:21
K_T_T_K

総合スコア231

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

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

H-JURI

2015/10/22 07:45

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

2015/10/22 07:51

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

2015/10/22 08:45

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

0

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

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

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

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

bash

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

ruby

1$ ruby test.rb

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

bash

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

という感じです。

投稿2015/10/22 13:11

編集2015/10/22 13:12
SKYYFISH

総合スコア654

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

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

H-JURI

2015/10/23 06:43

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

0

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

投稿2015/10/22 11:53

編集2015/10/22 11:54
pi-chan

総合スコア5936

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

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

H-JURI

2015/10/23 06:45

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

2015/10/23 07:28

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

0

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

投稿2015/10/22 10:54

shiena

総合スコア1825

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

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

H-JURI

2015/10/23 06:39

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

2015/10/23 06:44

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

0

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

投稿2015/10/22 09:24

rossi46hiro

総合スコア992

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

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

H-JURI

2015/10/23 06:35

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

0

then を消したらどうなりますか?省略できます。

ruby

1def third_greatest2(nums) 2 if nums.class == Array && nums.length >= 3 3 nums.sort! {|a, b| b <=> a} 4 return nums[2] 5 end 6end 7大きい順にソートしてインデックス2(3番目)

投稿2015/10/22 09:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

H-JURI

2015/10/22 09:05

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

0

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

投稿2015/10/22 08:23

otn

総合スコア84423

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

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

H-JURI

2015/10/22 08:47

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問