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

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

新規登録して質問してみよう
ただいま回答率
85.49%
プログラミング言語

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

Q&A

解決済

5回答

1640閲覧

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

H-JURI

総合スコア42

プログラミング言語

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

0グッド

1クリップ

投稿2015/10/21 08:32

問題の解答例を実行するとエラーが出ることと、解答例で意味がよくわからないところがあるのでご教授願いたいです。

まず問題です。

lang

1# Write a method that takes an array of numbers in. Your method should 2# return the third greatest number in the array. You may assume that 3# the array has at least three numbers in it.

そして、それの解答例です。

lang

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 10 third = second 11 second = first 12 first = value 13 elsif second == nil || value > second 14 third = second 15 second = value 16 elsif third == nil || value > third 17 third = value 18 end 19 20 idx += 1 21 end 22 23 return third 24end

これを使って以下のことを実行するとコードが間違いがなければ、3つ"true"と返ってきます。

lang

1# These are tests to check that your code is working. After writing 2# your solution, they should all print true. 3 4puts( 5 'third_greatest([5, 3, 7]) == 3: ' + 6 (third_greatest([5, 3, 7]) == 3).to_s 7) 8puts( 9 'third_greatest([5, 3, 7, 4]) == 4: ' + 10 (third_greatest([5, 3, 7, 4]) == 4).to_s 11) 12puts( 13 'third_greatest([2, 3, 7, 4]) == 3: ' + 14 (third_greatest([2, 3, 7, 4]) == 3).to_s 15)

しかしこれを実際実行すると、

lang

110-third-greatest.rb:19: syntax error, unexpected keyword_elsif, expecting keyword_end 2 elsif second == nil || value > second 3 ^ 410-third-greatest.rb:22: syntax error, unexpected keyword_elsif, expecting keyword_end 5 elsif third == nil || value > third 6 ^ 710-third-greatest.rb:30: syntax error, unexpected keyword_end, expecting end-of-input 8```‘ 9のようにエラーが出てきます。質問が3つあります。 10 111.エラーが出るのは解答例に不備があると思うのですが、見つけられませんでした。どうか不備を教えてください。 12 132.最初のコードの 14```lang-言語名 15first = nil 16second = nil 17third = nil

の意味がわかりません。ご教授願います。

3.if文

lang

1if first == nil || value > first 2 third = second 3 second = first 4 first = value 5 elsif second == nil || value > second 6 third = second 7 second = value 8 elsif third == nil || value > third 9 third = value 10 end

がわかりません。一体何をしているのでしょうか。。。の

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

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

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

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

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

genovese

2015/10/21 13:44

回答とは関係ありませんが、Rubyのプログラムについての質問なので、タグはRubyにしたほうが、Rubyに詳しい回答者の方々に回答していただきやすくなります。
guest

回答5

0

ベストアンサー

タイプミスですね。ifが正しく認識されていません。前後の空白が全角だったりしませんか?
それ以外の原因かもしれませんが、とにかくifの周辺を見直してください。

しかし、そのエラーメッセージで、ifのところが原因だとは気づきにくいですね。

firstが今までに出てきた中で一番大きな数値、secondが今までに出てきた中で二番目に大きな数値、thirdが今までに出てきた中で三番目に大きな数値です。文字通りですね。
繰り返しを始めた最初では、まだ「今までに出てきた」がゼロ件なので、「今までに出てきた中で一番大きな数値」が存在しませんので、firstには代わりに、nil という値(別に数値で無ければ何でも良いのですが)をセットしておきます。
if文で、firstがその値のままであれば、繰り返しの初回だと分かるのでそのときはfirstにセットします。コンテストのトップバッターは暫定一位みたいな意味です。
second、thirdも同様。

firstが今までに出てきた中で一番大きな数値、secondが二番目、thirdが三番目。
になるように、しています。

なお、その問題に対しては、普通はこう書きます。

Ruby

1def third_greatest(nums) 2 nums.sort[2] 3end

投稿2015/10/21 13:40

編集2015/10/21 13:46
otn

総合スコア84491

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

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

H-JURI

2015/10/22 06:22

回答ありがとうございます! "if"のまわりを直してもエラーが以前なくならないので、また改めて質問させていただきます。 2、3の説明が一番わかりやすかったのでベストアンサーにさせていただきます。 なお、書いていただいた別解なのですが ```Ruby-言語名 def third_greatest(nums) nums.sort(2) end 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 ) ``` のようにし、実行すると ```bash-言語名 $ ruby 10-2-third-greatest.rb 10-2-third-greatest.rb:3:in `sort': wrong number of arguments (1 for 0) (ArgumentError) from 10-2-third-greatest.rb:3:in `third_greatest' from 10-2-third-greatest.rb:8:in `<main>' ``` のようにエラーが返ってきます。これはどういうことなのでしょうか。。。
otn

2015/10/22 08:06 編集

> "if"のまわりを直してもエラーが以前なくならないので、 エラーになるコードをそのままコピペしてください。 > エラーが返ってきます。 タイプミスですね。よく見比べてください。 また、エラーメッセージの見方、Rubyリファレンスの見方も学んでください。 Rubyリファレンス: http://docs.ruby-lang.org/ja/2.2.0/doc/
guest

0

調べてみましたが,Rubyでしょうか?

  1. if使う場合,thenが必要です→複数の条件分岐

thenがないため,単一のifと解釈され,endが来るであろう場所にelsifがあるためエラーになっていると思われます.
2.「値が何も入っていない状態」です.
3.
i.渡された配列の1番目から順に値を取り出す
ii.取り出した値をfirstから順に比較し(その場所が空ならそこに入れる),より小さな値を見つけたら,それ以下のランクの数値を1ランクずつ下げて入れる
例えばfirstに5,secondに3がある状態で7を取り出した場合,firstの5より大きいので,今ある5と3を1ランクずつ下げ,空いたfirstに7を入れます.

投稿2015/10/21 09:03

編集2015/10/21 09:04
swordone

総合スコア20649

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

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

H-JURI

2015/10/22 06:11

回答ありがとうございます。言語はRubyで間違いないです。次からは明記します。 "then"を入れてもエラーがなくならないので、再度改めて質問します!
guest

0

使われているプログラミング言語はRubyですよね、ファイルの拡張子が .rb ですから。(使っているプログラミング言語の種類は明記してください。言語ごとに文法が異なりますので)

だとすれば、thenが抜けているように見えます。
下記コードの"THEN"のところを、"then"に変更すれば、動くと思います。

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 elsif second == nil || value > second THEN 14 third = second 15 second = value 16 elsif third == nil || value > third THEN 17 third = value 18 end 19 20 idx += 1 21 end 22 23 return third 24end

回答例が不完全なのは、単なるミスか、回答者が文法エラーに気付くかどうかを試しているか、だと思います。

==
この質問は、本来ご自分で解決すべきものです。

判らなければ、Rubyに関する本を読んでください。

投稿2015/10/21 09:00

coco_bauer

総合スコア6915

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

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

H-JURI

2015/10/22 06:08

回答ありがとうございます! 確かにこの質問は基本的なことで自分で解決すべきものだと認識していましたが、完全な理解ができなかったので質問させていただきました。 ご指摘いただいたように"then"をくわえさせてもらったのですがエラーがなくならないので、再度改めて質問させていただきます!
guest

0

あれ、Rubyのif文のthenって省略可能ですよね?
実際、私の環境では正しくtrueが出力されてますし

投稿2015/10/21 09:53

rossi46hiro

総合スコア992

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

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

coco_bauer

2015/10/21 10:14

質問者が使っている環境では、syntax errorになっているので、最も考えられるのは then の省略に対応していないコンパイラが使われているのではないかと推測しました。私の回答は、この推測に基づくものです。
H-JURI

2015/10/22 06:12

IDEはcloud9というものを使っております。コンパイラはbash?というもののようです。 次からはこれも明記しようと思います!
guest

0

1.についてはどの言語を使用しているのかわからないので、わかりません。

2.については処理の中で使用する変数の初期化をしていると思います。
NULL値(空の値)を各変数にセットしています。

3.についてはこの関数に渡した引数を大きい順に並び替えています。
例えば「[5, 3, 7]」をこの関数に渡すと各変数に
first :7
secoud:5
third :3
がセットされ、
return third
としているので戻り値としてthirdの値(3)が返ってきます。
この関数は渡した引数の中で3番目に大きい値を返しています。

投稿2015/10/21 08:46

tomo.ina

総合スコア357

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

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

H-JURI

2015/10/22 06:09

回答ありがとうございます! ご指摘いただいたように次からは言語を明記しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問