2016-06-28 44 views
0

我有這個代碼,我輸入三角形的邊的輸入。根據數值,它會打印出三角形是等邊的,等邊的或斜角。它正在執行數字值,但我如何指定輸入只能是整數?例如,如果我輸入「w」,它應該表示無效或錯誤,但在這種情況下,它會執行。我該如何解決這個問題?如何檢查輸入是一個整數? - Ruby

基本上,我正在尋找一種方式來寫,如果一個字符串被輸入,它應該顯示爲一個錯誤(然後我會寫一個打印語句,說它是無效的)。那麼我可以把它放到另一個語句中嗎?

示例代碼(以下提到的那些前):

puts "Enter the triangle length" 
    x = gets.chomp 

    puts "Enter the triangle width" 
    y = gets.chomp 


    puts "Enter the triangle height" 
    z = gets.chomp 


    if x == y and y == z 
     puts "This triangle is equilateral" 
     else if 
     x==y or y == z or x==z 
      puts "This triangle is isoceles" 
     else if 
      x!=y and y!=z and x!=z 
      puts "this triangle is scalene" 
     end 
     end 
    end 
+0

哪裏Java的一部分嗎? – shmosel

+0

你確定你不是指'elsif'而不是'else if'嗎? –

+0

elseif和else之間的區別是什麼? – small5

回答

0

有這樣做的幾種方法。如果你允許領先標誌,

x =~ /^[+-]?\d+$/ 

將是一種可能性。

您還必須考慮是否允許圍繞或嵌入空格(例如,符號和第一個數字之間的空格)。

0

如果你正在處理整數,你可以用ruby檢查一下。

請注意,這不像正則表達式那樣健壯,但它覆蓋了大多數情況。

if (input != '0') && (input.to_i.to_s != input.strip) 
    # input is not a number 
else 
    # input is a number 
end 

strip是那裏,如果你想接受開頭或結尾的空格輸入,否則你可以不管它。

+0

所以這個if語句基本上是說只要輸入仍然是一個數字,如果一個字符串可以轉換爲整數,它應該接受和執行? – small5

+0

我建議你打開'irb'並用'to_i'玩,這可能會讓你感到驚訝,特別是當你在字符串上調用'to_i'時。總之,在字符串上調用'to_i'會返回'0'。我的情況現在有意義嗎? –

+0

我最初寫在每個變量下(X = x.to_i等),但是我注意到,即使我輸入了一個字母,它也會以某種方式輸入,如果循環因爲它被識別爲整數。正則表達式會做什麼? – small5

0

雖然所有其他的答案可能或多或少強大,我會去與另一個。既然你有一個三角形邊長,他們應該大於零,對吧?然後可以使用String#to_i方法的副作用:對於不轉換爲整數的所有內容,它返回零。因此:

x = gets.chomp.to_i 
y = gets.chomp.to_i 
z = gets.chomp.to_i 

raise "Wrong input" unless x > 0 && y > 0 && z > 0 

# ... 
+0

我嘗試了提升命令併爲我工作。但是,我能否提交印刷聲明? I.E提出「無效輸入」(沒有錯誤來自編譯器?) – small5

+0

當然,只要將'raise'改爲'puts'或其他。 – mudasobwa

0

你可以做這樣的事情:

x = x.to_i 

puts "Please enter an integer" if x == 0 

爲什麼?

因爲:

"ABC".to_i # returns 0 

你可能會更好調用的代替格格

gets.strip.to_i 

一個例子:

## ruby user_age.rb 

# input variables 
name = "" 
years = 0 
MONTHS_PER_YEAR = 12 # a constant 

# output variable 
months = 0 

# processing 
print "What is your name? " 
name = gets.strip 

print "How many years old are you? " 
years = gets.strip.to_i 

puts "please enter an integer" if years == 0 

months = years * MONTHS_PER_YEAR 

puts "#{name}, at #{years} years old, "\ 
"you are #{months} months old." 
0

我假定任何字符串值那個時候轉換成一個float等於一個整數將被接受,並返回整數值。此外,我假設可以用"xen"(或"xEn")表示法輸入整數,其中x是整數或浮點數,n是整數。

def integer(str) 
    x = Float(str) rescue nil 
    return nil if x==nil || x%1 > 0 
    x.to_i 
end 

integer("3")  #=> 3 
integer("-3")  #=> -3 
integer("3.0")  #=> 3 
integer("3.1")  #=> nil 
integer("9lives") #=> nil 
integer("3e2")  #=> 300 
integer("-3.1e4") #=> -31000 
integer("-30e-1") #=> -3 
integer("3.0e-1") #=> nil 
0

你可以使用Integer()檢查一個字符串包含一個整數:

Integer('1234') 
#=> 1234 

Integer('foo') 
#=> ArgumentError: invalid value for Integer() 

這可以通過結合一個retry

begin 
    number = Integer(gets) rescue retry 
end 
相關問題