У меня есть функция, которая должна считать количество слогов в файле с учетом этих ограничений:
1) Каждая группа смежных гласных (a, e, i, o, u, y) считается какодин слог (например, «ea» в «real» считается одним слогом, а «e..a» в «regal» считается как два слога
2) «e» в концеслова не считается слогом
3) Каждое слово имеет хотя бы один слог, даже если предыдущие правила дают счет ноль.
Учитывая это, я сделал (хотя и довольноcrummy) функция для подсчета количества слогов в файле
Я пытался создать эту функцию многими различными способами, но этот способ имеет для меня смысл, а также дает мне разумный (не совсем, но вбольшая схема вещей, которые он делает) оценка истинного ответа.
int syllableCount(char **str)
{
int i = 0;
int q = 0;
int syllableCounter = 0;
for (i = 0; i < lineCount; i++)
{
for (q = 0; q <= strlen(str[i]); q++)
{
if (str[i][q] == 'A' || str[i][q] == 'a' ||
str[i][q] == 'E' || str[i][q] == 'e' ||
str[i][q] == 'I' || str[i][q] == 'i' ||
str[i][q] == 'O' || str[i][q] == 'o' ||
str[i][q] == 'U' || str[i][q] == 'u' ||
str[i][q] == 'Y' || str[i][q] == 'y')
{
syllableCounter++;
}
if ((str[i][q] == 'E' && str[i][q + 1] == ' ') ||
(str[i][q] == 'e' && str[i][q + 1] == ' ') ||
(str[i][q] == 'E' && str[i][q + 1] == '\n') ||
(str[i][q] == 'e' && str[i][q + 1] == '\n') ||
(str[i][q] == 'E' && str[i][q + 1] == '.') ||
(str[i][q] == 'e' && str[i][q + 1] == '.') ||
(str[i][q] == 'E' && str[i][q + 1] == ';') ||
(str[i][q] == 'e' && str[i][q + 1] == ';') ||
(str[i][q] == 'E' && str[i][q + 1] == ':') ||
(str[i][q] == 'e' && str[i][q + 1] == ':') ||
(str[i][q] == 'E' && str[i][q + 1] == '!') ||
(str[i][q] == 'e' && str[i][q + 1] == '!') ||
(str[i][q] == 'E' && str[i][q + 1] == '?') ||
(str[i][q] == 'e' && str[i][q + 1] == '?'))
{
syllableCounter--;
}
if ((str[i][q] == 'A' || str[i][q] == 'a' ||
str[i][q] == 'E' || str[i][q] == 'e' ||
str[i][q] == 'I' || str[i][q] == 'i' ||
str[i][q] == 'O' || str[i][q] == 'o' ||
str[i][q] == 'U' || str[i][q] == 'u' ||
str[i][q] == 'Y' || str[i][q] == 'y') &&
(str[i][q + 1] == 'A' || str[i][q + 1] == 'a' ||
str[i][q + 1] == 'E' || str[i][q + 1] == 'e' ||
str[i][q + 1] == 'I' || str[i][q + 1] == 'i' ||
str[i][q + 1] == 'O' || str[i][q + 1] == 'o' ||
str[i][q + 1] == 'U' || str[i][q + 1] == 'u' ||
str[i][q + 1] == 'Y' || str[i][q + 1] == 'y'))
{
syllableCounter--;
}
if ((str[i][q] != 'A' || str[i][q] != 'a' ||
str[i][q] != 'E' || str[i][q] != 'e' ||
str[i][q] != 'I' || str[i][q] != 'i' ||
str[i][q] != 'O' || str[i][q] != 'o' ||
str[i][q] != 'U' || str[i][q] != 'u' ||
str[i][q] != 'Y' || str[i][q] != 'y') &&
(str[i][q + 1] == ' ' || str[i][q + 1] == '\n'))
{
syllableCounter++;
}
}
}
return syllableCounter;
}
С моим тестовым файлом я получил 54 слога, а реальный ответ - 32. Что заставляет меня отключиться на 22!?
PS: вот текст в файле, который я использовал:
"Красное готовое платье было сделано для вас!Это должно было быть готово завтра.Какого цвета был платье?О, это было красным! "
Все ошибки в написании и пробелах сделаны специально