2015-08-14 79 views
-1

爲什麼不能正常工作?計算字符串中元音的函數

所有的
def count_vowels(string) 
    result = 0 
    i = 0 
    while i < string.length 
    if string[i] == "a" ||"e" || "i" || "o" || "u" 
     result = result + 1 
     i += 1 
    end 
    return result 
    end 
+0

爲什麼反對票? – jgozal

回答

1

首先,你有一個end缺少你if。我想你想這樣做(這不會給你,雖然正確答案):

def count_vowels(string) 
    result = 0 
    i = 0 
    while i < string.length 
     if string[i] == "a" ||"e" || "i" || "o" || "u" 
      result = result + 1 
      i += 1 
     end 
    end 

    return result 
end 

嘗試使用正則表達式是這樣做的:

def count_vowels(string) 
    string.scan(/[aeouiAEIOU]/).count 
end 

/[aeouiAEIOU]/是一個正則表達式,基本上意味着任何這些字符:a, e, o, u, i, A, E, I, O, U

String#scan方法返回字符串中該正則表達式的所有匹配項,這意味着您獲得元音的數量!

+0

我錯過了最後。感謝您指出了這一點。但是這個功能不起作用 – jgozal

+0

好吧,剛剛看到更新的答案 – jgozal

+0

@jgozal是的,更新後的答案有效。 –

3

它不起作用,因爲它永遠是真的。 您的當前表達式評估爲(用文字表示)這個字母是否等於?如果這是錯誤的,那麼「e」它不評估等於「e」的第一個字母,它簡單地評估爲「e」。作爲一個if語句就相當於:

if string[i] == "a" 
    result += 1 
    i += 1 
else 
    "e" 
    result += 1 
    i += 1 
end 

試試這個

%w(a e i o u).include?(string[i]) 

話雖這麼說,這將是更容易做到

string.scan(/[aeiou]/i).count 

,然後你不需要循環在所有

+1

...或'string.count'aeiouAEIOU''(或者應該是''aeiouAEIOUandsomtimesYY'')。 –

+0

@CarySwoveland你是正確的(除了面露第二部分),但我寧願正則表達式或者'string.downcase.count(「AEIOU」)'因爲我不喜歡的需求如果你要解決輸入這兩種情況下 – engineersmnky

1

首先,除非您使用的是if的後綴版本,否則應該用end。又名:

if condition 
    action 
end 

所有第二,

string[i] == "a" ||"e" || "i" || "o" || "u" 

翻譯什麼的是:string[i] == "a""e""i""o""u"。在Ruby中,nilfalse被認爲是falsey值,其他所有是truthy

你在這裏的真正用意是什麼

if ['a', 'e', 'i', 'o',' u'].include? string[i] 
    result += 1 
end 


然而,這種代碼的,現在是非常 Ç喜歡。 Ruby爲這些任務提供了更好的抽象級別。我會建議尋找 String methods找到一個更簡單的解決方案。

0

剛剛看到了所有的解決方案。我相信其中一些和我想象中的一樣好。其中一個答案中提到的問題之一是我錯過了我的if語句的結尾。這就是我所做的:

def count_vowels(string) 
    result = 0 

    i = 0 
    while i < string.length 
     if (string[i] == "a" || string[i] == "e" || string[i] == "i" || string[i] == "o" || string[i] == "u") 
     result = result + 1 

     end 
    i += 1 
    end 

    return result 

end 
+0

你自己的問題,並將其作爲答案張貼,而忽略更多的慣用和更簡單的解決方案爲什麼然後你問這個問題?還有一些注意事項1)幾乎總是有一種更好的方式來循環使用ruby,而不是使用'for',''while','until'等循環(參見['String#chars']](http:// ruby -doc.org/core-2.2.0/String.html#method-i-chars))2)result = result + 1可能會導致+ = 1,就像您對i所做的一樣。 – engineersmnky

+0

我無法自己解決它。我仍然會努力去理解爲什麼這樣做(string [i] ==「a」|| string [i] ==「e」|| string [i] ==「i」|| string [i] == 「o」|| string [i] ==「u」)與字符串[i] ==「a」||「e」||不同「我」|| 「o」|| 「U」。你們都幫助我理解它。 – jgozal

+2

公平的學習是最重要的部分:) – engineersmnky

相關問題