2017-05-15 63 views
0

我需要循環幫助。如何循環並要求用戶輸入

我試圖捕捉用戶的輸入並確定計劃度假的酒店成本。

我有一個循環輸入問題,以便用戶可以選擇另一家酒店,並結束該程序,如果用戶不選擇任何擊鍵(「A」,「a」,「B」,「b」,「 C「,」c「,」D「或」d「),然後計算酒店的總成本。

我想出了這個至今:

puts choice = gets.chomp.downcase 
puts "For how many nights?" 
num=gets.chomp.to_i 
puts "Okay...any other hotels?" 
puts choice = gets.chomp.downcase 

#Hotel Prices 

#Hotel A 
if (choice== "a" or choice=="A") 
cost_2= (num/3)*500 + (num%3)*200 
end 

#Hotel B 
if (choice=="b" or choice=="B") 
cost_3= num*250 
end 

#Hotel C 
if (choice=="c" or choice=="C") 
cost_4 = (num/3)*700 + (num%3)*300 
end 

#Hotel D 
if (choice== "d" or choice=="D") 
    cost_5= num*500 
    end 

Hotel Program

+3

看看['Kernel#loop'](http://ruby-doc.org/core-2.4.1/Kernel.html#method-i-loop)。 –

+0

「[如何提出問題的智能方式](http://catb.org/esr/faqs/smart-questions.html)」對你來說是個好消息。 –

+0

請勿對圖像使用鏈接,以獲取對於該問題重要的信息。相反,將其複製/粘貼到問題中並進行適當的格式化。鏈接腐爛然後中斷,如果鏈接中的信息是必不可少的,那麼你的問題對別人來說就毫無價值。請記住,你的問題是一篇幫助他人解決同樣問題的文章。 –

回答

2

有你的代碼幾種可能的改進,但我會保持這個答案簡單而直接的,我可以。

使用loop,和一個if ... else if ... else ... end塊的代碼,而不是幾個獨立if聲明:

loop do 
    if (choice== "a" or choice=="A") 
    cost_2= (num/3)*500 + (num%3)*200 
    #Hotel B 
    elsif (choice=="b" or choice=="B") 
    cost_3= num*250 
    #Hotel C 
    elsif (choice=="c" or choice=="C") 
    cost_4 = (num/3)*700 + (num%3)*300 
    #Hotel D 
    elsif (choice== "d" or choice=="D") 
    cost_5= num*500 
    else 
    puts "Final cost is: [...]" 
    break 
    end 
end 

你也可以考慮,就像這樣,"Type 'done' when you have finished"實施更爲明確的退出 - 和「忽略」的任何其他輸入不是a/b/c/d/done。換句話說,沿着線的東西:

# ... 
elsif (choice== "d" or choice=="D") 
    cost_5= num*500 
elsif choice == 'done' 
    puts "Final cost is: [...]" 
    break 
else 
    puts 'Unknown option' 
end 
# ... 
+0

不要將其作爲評論添加,編輯您的答案。 –

+0

@TheTinMan完成。 –

2

包裝你的代碼在一個while循環,

continue = true 
while continue 
    ... 
    if choice == "done" 
    continue = false 
    end 
end 

顯然端部盒可以是任何東西,而不僅僅是「完成」。

完成的緣故,一個優雅的解決這個問題會是這樣的:

loop do 
    puts choice = gets.chomp.downcase 
    puts "For how many nights?" 
    num=gets.chomp.to_i 
    puts "Okay...any other hotels?" 
    puts choice = gets.chomp.downcase 

    selections = { 
    a: (num/3)*500 + (num%3)*200, 
    b: num*250, 
    c: (num/3)*700 + (num%3)*300, 
    d: (num*500) 
    } 

    if selections[choice.to_sym] 
    cost += selections[choice.to_sym] 
    else 
    break 
    end 
end 
+1

國際海事組織它更清潔''打破'而不是有這樣的布爾變量浮動。 –

+0

這是一個很好的改進,但代碼仍然需要一些重構。有重複的代碼,這種方法太瞭解我們如何提出問題以及如何計算成本。該方法本身應該只關心他需要什麼,並相信其他對象來完成他們的任務。那些關於成本的部分可以從這裏被提取出來,並且它們中的每一個都可以作爲依賴注入。只是一個想法。代碼將更加穩定,並且僅取決於那些可以實現代碼更穩定的類的公共方法(可以實現相同的接口)。 –

+0

不要使用'while',使用'loop'。 Ruby的習慣。 –

-1

這是未經測試,但它是我想要的使用的基本思想:

loop do 

    cost = nil 
    loop do 

    puts 'Which hotel? (A, B, C, D)' 
    hotel = gets.chomp.downcase 

    puts 'For how many nights?' 
    days = gets.to_i 

    cost = if hotel == 'a' 
      (days/3) * 500 + (days % 3) * 200 
      elsif hotel == 'b' 
      days * 250 
      elsif hotel == 'c' 
      (days/3) * 700 + (days % 3) * 300 
      elsif hotel == 'd' 
      days * 500 
      else 
      puts 'Unknown hotel.' 
      end 

    break if cost 

    end 

    puts cost 

    puts 'Okay...any other hotels? (y/n)' 

    break unless gets.downcase.start_with?('y')  
end 

而不是鏈接if/elsif/else/end我會使用一個case聲明:

cost = case hotel 
     when 'a' 
     (days/3) * 500 + (days % 3) * 200 
     when 'b' 
     days * 250 
     when 'c' 
     (days/3) * 700 + (days % 3) * 300 
     when 'd' 
     days * 500 
     else 
     puts 'Unknown hotel.' 
     end 
相關問題