Подсчет количества слогов в слове, но с учетом того, что любые гласные рядом друг с другом в слове считаются одним слогом - PullRequest
0 голосов
/ 04 октября 2018

Мне удалось подсчитать количество слогов в слове, создав простой вложенный цикл for, но я не могу понять, как переписать такой алгоритм, который гарантирует наличие нескольких гласных рядом друг с другом при подсчете словкак один слог.Я только сталкивался с еще одним примером использования указателей, мой вопрос: есть ли какой-то другой подход, так как я только начал изучать указатели на этой неделе и не уверен, как правильно их использовать.

Пока это моя программа:

#include <iostream>
#include <string>


using namespace std;

void indexfx(string sentence);

int main(void)
{
   string user;
   cout << "\n\nPlease Enter a Sentence: ";

   getline(cin, user);

   indexfx(user);




   return 0;
}


void indexfx(string sentence)
{
   string vowels = "aeiouy";
   int syllables = 0;

   for(unsigned int i = 0; i < sentence.size(); i++)
   {
      for(unsigned int j = 0; j < vowels.size(); j++)
      {  
         if(sentence[i] == vowels[j]
         {
            syllables++;
         }
      }
   }

   cout << syllables;
}

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Используя std::string методы, вы можете сделать:

void indexfx(const std::string& sentence)
{
    const std::string vowels = "aeiouy";
    int syllables = 0;

    std::string::size_type offset = 0;
    while (offset != std::string::npos) {
        offset = sentence.find_first_of(vowels, offset);
        if (offset == std::string::npos) { break; }
        ++syllables;
        offset = sentence.find_first_not_of(vowels, offset);
    }
    std::cout << syllables << std::endl;
}
0 голосов
/ 04 октября 2018

Это конечный автомат.

       Vowel  Consonant EndOfWord
C        V       C         End
V        V       C*        End*

, где * означает «увеличить количество слогов».Начало в состоянии C.

Тесты:

a*da*m
ma*da*m
he*llo*
chi*cke*n

Мы можем реализовать этот конечный автомат напрямую:

int count_syllables( std::string s ) {
  int count = 0;
  char state = 'c';
  for (auto c : s ) {
    switch(state) {
      case 'c': {
        break;
      }
      case 'v': {
        if (!IsVowel(c)) ++count;
        break;
      }
    }
    state = IsVowel(c)?'v':'c';
  }
  if (state == 'v') ++count;
  return count;
}

теперь мы простонужно написать IsVowel.

bool IsVowel(char c) {
  static const std::string vowels = "aeiouy";
  return vowels.find(c) != std::string::npos;
}
0 голосов
/ 04 октября 2018

Если вы найдете гласную, не сразу переходите к увеличению числа слогов.Вместо этого имейте флаг, что вы нашли гласный.Он начинается как ложный, так как у вас еще не было времени искать;если вы найдете его, переключите его на true и вырвитесь из цикла гласных.

Есть еще один флаг, который помнит, была ли предыдущая буква гласной.Теперь увеличивайте количество слогов только в том случае, если текущая буква является гласной, а предыдущая не была.

Перед возобновлением цикла письма, в самом низу, помните, что гласность последней буквы в следующем циклеэто гласность текущей буквы в текущем цикле.

Обратите внимание, что этот ответ просто приводит ваш код к тому, что вы заявляете, что вы хотите, чтобы он делал: игнорируйте последовательные гласные.Сам алгоритм не является надежным способом определения количества слогов, так как английский немного сумасшедший в этом отношении.Подробнее см. Подсчет слогов в слове .

...