Ruby新手求助:如何统计输入文本中各元音的出现次数
解决Ruby统计每个元音出现次数的问题
先看你代码里的几个问题:
- 变量名写错了:
vocals应该是你定义的vowels,但就算改了,循环对象也错了——你应该遍历输入文本的每个字符,而不是元音数组。 - 只定义了
a_count,没法统计e、i等其他元音。 return a_count放在for循环里,第一次循环就直接返回了,根本跑不完整个循环。- 方法参数
phrase被你重新赋值成输入内容,传入的ARGV根本没用到,逻辑混乱。
要分别统计每个元音的数量,用哈希来存每个元音的计数最方便,直接看修正后的代码:
def count_vowels puts 'Enter a text:' phrase = $stdin.gets.downcase.chomp # 初始化哈希,每个元音初始计数为0 vowel_counts = { 'a' => 0, 'e' => 0, 'i' => 0, 'o' => 0, 'u' => 0 } phrase.each_char do |char| # 如果当前字符是元音,对应计数+1 vowel_counts[char] += 1 if vowel_counts.key?(char) end # 输出每个元音的统计结果 vowel_counts.each do |vowel, count| puts "#{vowel} = #{count}" end end count_vowels
代码说明:
- 用哈希
vowel_counts预先定义好所有元音的初始计数为0,这样能直接对应每个元音的统计结果。 - 遍历输入文本的每个字符,判断是否是哈希里的键(也就是元音),是的话对应计数加1。
- 最后遍历哈希,输出每个元音和它的出现次数。
如果你想保留从参数传入文本的逻辑(比如用ARGV),可以改成这样:
def count_vowels(phrase) phrase = phrase.downcase vowel_counts = { 'a' => 0, 'e' => 0, 'i' => 0, 'o' => 0, 'u' => 0 } phrase.each_char do |char| vowel_counts[char] += 1 if vowel_counts.key?(char) end vowel_counts.each do |vowel, count| puts "#{vowel} = #{count}" end end # 如果ARGV有传入参数,就用参数;否则提示输入 if ARGV.empty? puts 'Enter a text:' input_phrase = $stdin.gets.chomp count_vowels(input_phrase) else count_vowels(ARGV.join(' ')) end
这样既支持命令行传参,也支持手动输入,灵活度更高。
内容的提问来源于stack exchange,提问作者Alexandroskw
相关产品推荐
相关产品推荐

