2017-11-12 18 views
0

人が'BYE'を3回連続して実行するまで実行するコードを作成しようとしています。次のコードでwhileループのイテレータは、予想よりももう1回実行されます

は:

ask = gets.chomp 
count = 0 
while (count != 3) 
    if (ask == 'BYE') 
    puts 'HUH?! SPEAK UP, SONNY!' 
    count = count + 1 
    ask = gets.chomp 
    elsif (ask != ask.upcase) 
    puts 'HUH?! SPEAK UP, SONNY!' 
    count = 0 
    ask = gets.chomp 
    else 
    puts 'NO, NOT SINCE ' + rand(1930..1950).to_s + '!' 
    count = 0 
    ask = gets.chomp 
    end 
end 
puts 'Goodbye for now' 

私は実際に'BYE' 4回入力する必要があります。誰かがそれを修正する方法を指すことができますか?

+0

あなたは0ということを理解して、 1,2,3は4回c orrect? – engineersmnky

答えて

1

実際にBYEを4回入力する必要はありません。 3つで十分です。 4番目の入力は何でもかまいません。

BYE # input 1 
HUH?! SPEAK UP, SONNY! 
BYE # input 2 
HUH?! SPEAK UP, SONNY! 
BYE # input 3 
HUH?! SPEAK UP, SONNY! 
nah, I give up # input 4 
Goodbye for now 

コードの問題は、ハンドラを選択した直後に次の入力を要求することです。あなたのロジックによって、あなたはその入力を必要としない場合でも。だから、この部分を再加工する必要があります。

0

あなたのwhile (count != 3)はRubishqueの解決策を書くのに抵抗することができないほどJavaに似ています(Rubyの括弧は不要です)。もっと短くはありませんが、DRYは、Rubyプログラムで見られる可能性の高いコードが多く、Rubyで同じことをする方法は常にたくさんあります。

class Strange 
    def initialize(wanted) 
     @answer = true 
     @count = 0 
     @wanted = wanted # desired number of correct consecutive answers 
    end 

     # Increment @count if true, else reset to zero. 
    def answer(boolean) 
     @answer = boolean 

     if boolean 
     then # then is optional, but I like it 
      @count = @count + 1 
     else 
      @count = 0 
     end 
    end 

     # Write a message. 
    def message(number) 
     puts case number 
     when 1 then 'HUH?! SPEAK UP, SONNY!' 
     when 2 then "NO, NOT SINCE #{rand(1930..1950)} !" 
     else 'WHAT ?' 
     end 
    end 

    def prompt 
     print @answer ? 'Talk please > ' : 'Wrong answer, retry > ' 
     @ask = gets.chomp 
    end 

     # Recursively loop until the number of correct consecutive answers 
     # corresponds to the desired number. 
    def run 
     prompt 

     case 
     when @ask == 'BYE' 
      message 1 
      answer(true) 
     when @ask != @ask.upcase 
      message 1 
      answer(false) 
     else 
      message 2 
      answer(false) 
     end 

     run unless @count == @wanted # recursive loop 
    end 
end # class Strange 

Strange.new(3).run 

puts 'Goodbye for now' 

実行:

ループの先頭で一度だけ getsを置く
$ ruby -w t.rb 
Talk please > xyz 
HUH?! SPEAK UP, SONNY! 
Wrong answer, retry > XYZ 
NO, NOT SINCE 1935 ! 
Wrong answer, retry > BYE 
HUH?! SPEAK UP, SONNY! 
Talk please > what ? 
HUH?! SPEAK UP, SONNY! 
Wrong answer, retry > BYE 
HUH?! SPEAK UP, SONNY! 
Talk please > BYE 
HUH?! SPEAK UP, SONNY! 
Talk please > BYE 
HUH?! SPEAK UP, SONNY! 
Goodbye for now 
+0

制御フローに3値を使用しないでください。 :) –

+0

@SergioTulentsevどちらですか?それはコードのにおいですか? – BernardK

+0

私はコード匂いだと思っています(ルビースタイルのガイドでは見つかりませんが)。私の推論はこれです:三項演算子は "式"です。副作用を引き起こすことを第一の目的とする表現を持つことは異常です。はい、技術的には ''ルビーの 'if'も式ですが、コントロールフローステートメントのように"見える "ので、別のメッセージを伝えます。 –

1

はそれが修正されています。

count = 0 

while count != 3 
    ask = gets.chomp 

    if ask == 'BYE' 
     puts 'HUH?! SPEAK UP, SONNY!' 
     count = count + 1 
    elsif ask != ask.upcase 
     puts 'HUH?! SPEAK UP, SONNY!' 
     count = 0 
    else 
     puts 'NO, NOT SINCE ' + rand(1930..1950).to_s + '!' 
     count = 0 
    end 
end 

puts 'Goodbye for now' 

は、実行:

$ ruby -w topc.rb 
a 
HUH?! SPEAK UP, SONNY! 
A 
NO, NOT SINCE 1931! 
BYE 
HUH?! SPEAK UP, SONNY! 
BYE 
HUH?! SPEAK UP, SONNY! 
BYEE 
NO, NOT SINCE 1939! 
BYE 
HUH?! SPEAK UP, SONNY! 
BYE 
HUH?! SPEAK UP, SONNY! 
BYE 
HUH?! SPEAK UP, SONNY! 
Goodbye for now 
関連する問題