2016-11-02 2 views
0

Мне нужно подсчитать количество гласных, слов, местоимений («он, она, их») в каждой строке строки, введенной пользователем. если вход «они играют», он изучает «ожидаемый результат: Sentence 1 имеет 3 слова, имеет 4 гласных, 1 местоимение. \ nSentence 2 имеет 3 слова, 4 гласных, 1 местоимение. Я написал следующий код, но получаю сообщение об ошибке с неожиданным завершением ввода.Подсчитайте количество гласных, местоимений в каждой строке строки?

string = gets 
string =string.chomp 


sentencecount = 0 
wordcount = 0 
pronouns={"He"=>0,"She"=>0,"They"=>0,"Them"=>0} 
procount=0; 
string.split(".").each do |sentence| 
    wordcount = 0 
    sentencecount += 1  #tracking number of sentences 
    vowels=sentence.scan(/[aeoui]/).count 
    procount=0 
    sentence.split(/\w+/).each do |word| 
    pronouns.each do|key,value| 
     if (key.eq word) 
      procount++ 

    wordcount += 1 # tracking number of words 
    end 

    puts "Sentence #{sentencecount} has #{wordcount} words, has #{vowels} vowels" 
end 

ответ

0
  • вам не нужна точка с запятой в конце строк
  • if требует end (если это не рядный форма)
  • ++ оператор не существует в Рубине
  • вы сравниваете две строки с оператором == (фактически это метод)

    string = gets.chomp 
    
    sentencecount = 0 
    wordcount = 0 
    pronouns = {"He"=>0, "She"=>0, "They"=>0, "Them"=>0} 
    procount = 0 
    string.split(".").each do |sentence| 
        wordcount = 0 
        sentencecount += 1  #tracking number of sentences 
        vowels = sentence.scan(/[aeoui]/).count 
        procount = 0 
        sentence.split(/\w+/).each do |word| 
        pronouns.each do|key, value| 
         if key == word 
         procount += 1 
         end 
         wordcount += 1 # tracking number of words 
        end 
        end 
    
        puts "Sentence #{sentencecount} has #{wordcount} words, has #{vowels} vowels" 
    end 
    
+0

дает 0 в качестве местоимения каждый раз, когда я запускаю –

+0

Да, в вашем коде вы их не обновляете. – Ursus

+0

после предоставления procount + = 1 также не обновляется. Не могли бы вы рассказать мне, как обновить –

0

Основываясь на вашей первоначальной попытке, я немного оптимизировал ее и сделал ее более читаемой с точки зрения кода.

string = gets.chomp 
pronouns = ['he', 'she', 'they', 'them'] 
total_word_count = 0 
total_procount = 0 
total_vowel_count = 0 

sentences = string.split(".") 
total_sentence_count = sentences.size 

sentences.each_with_index do |sentence, idx| 
    # VOWELS 
    vowel_count = sentence.scan(/[aeoui]/).count 
    total_vowel_count += vowel_count 

    # WORDS 
    words = sentence.split 
    sentence_word_count = words.size 
    total_word_count += sentence_word_count 

    # PRONOUNS 
    sentence_procount = 0 
    words.each do |word| 
    sentence_procount += 1 if pronouns.include?(word.downcase) 
    end 

    total_procount += sentence_procount 

    puts "Sentence #{idx + 1} has #{sentence_word_count} words, has #{vowel_count} vowels" 
end 

puts "Input has #{total_sentence_count} sentences, #{total_word_count} words, #{total_vowel_count} vowels, and #{total_procount} pronouns" 
0

Я предлагаю вам вернуть массив хешей, по одному для каждой строки, каждый хэш, содержащий статистику для соответствующей строки. Затем вы можете делать то, что хотите, с информацией в этом массиве.

VOWELS = 'aeiou' 
PRONOUNS = %w| he she they them | 
    #=> ["he", "she", "they", "them"] 
PRONOUN_REGEX = /\b#{Regexp.union(PRONOUNS)}\b/ 
    #=> /\b(?-mix:he|she|they|them)\b/ 

def count_em(str) 
    str.downcase.split(/\n/).map { |line| 
    { vowels: line.count(VOWELS), 
     words: line.scan(/[[:lower:]]+/).count, 
     pronouns: line.scan(PRONOUN_REGEX).size } } 
end 

a = count_em "He thought that she thought that he did not know the truth\n" + 
      "René knew she would torment them until they went bananas\n" 
    #=> [{:vowels=>14, :words=>12, :pronouns=>3}, 
    # {:vowels=>15, :words=>10, :pronouns=>3}] 

a.each.with_index(1) { |h,i| 
    puts "In line #{i} there are %d vowels, %d words and %d pronouns" % 
    h.values_at(:vowels, :words, :pronouns) } 
    # In line 1 there are 14 vowels, 12 words and 3 pronouns 
    # In line 2 there are 15 vowels, 10 words and 3 pronouns 

puts "The total number of vowels in all lines is %d" % 
    a.map { |h| h[:vowels] }.reduce(:+) 
    # The total number of vowels in all lines is 29 

Это решение является неполным в том, что он не имеет дела с сокращениями («не»), притяжательных («Мэри»), аббревиатур («1»), инициалов и цифровые частями имен (» J. Philip ('Phil') Sousa III ") и другие изгибы английского языка.

Смежные вопросы