Я пытаюсь создать программу, которая подсчитывает количество слов в предложении (предложениях), но когда я нахожу пробел или пунктуацию (?,!,:,; Или.), Я не могу предположить, что следующий символ будет письмо. Если я ищу письмо, мне нужно пропустить ВСЕ пробелы и знаки препинания, пока я не найду что-то, что не является ни пробелом, ни пунктуацией. Я также должен принять во внимание, что между словами может быть несколько пробелов. Я написал функцию пунктуации:
bool is_punctuation (string character)
{
if (character == "!")
return true;
else if (character == "?")
return true;
else if (character == ";")
return true;
else if (character == ":")
return true;
else if (character == ".")
return true;
else
return false;
}
Я использовал его для определения количества предложений, которые вводит пользователь. Теперь мне нужно найти количество слов, и мне трудно найти способ сделать это без использования пробелов. Я получил это далеко с функцией, но нужна помощь! Любые советы высоко ценится 🙂
void num_sentence (string phrase)
{
int num_sentence = 0;
for (int i = 0; i < phrase.length(); i++)
{
if (is_punctuation(phrase.substr(i,1))== true)
num_sentence++;
}
Прежде всего, нет смысла использовать std::string
для одного персонажа. Это то что char
для.
Теперь будет гораздо проще сделать это наоборот: проверить, является ли символ буквой, а не пунктуацией. Это легко: находится ли персонаж в диапазоне a-z или A-Z. Для этой ситуации также хорошая идея включить апостроф, так что «это», например, выглядит как одно слово:
bool is_letter(char c)
{
return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '\'')
? true:false;
}
Другая проблема, с которой вы столкнулись, заключается в том, как определить слово. Посмотрите на любое предложение. Где вы видите каждое слово начинается? Когда вы видите письмо. Когда заканчивается каждое слово? Когда вы видите что-то еще, кроме письма.
Вы не считаете количество знаков препинания. Вам все равно, если между отдельными словами один, два, три или более не буквенных символов.
Когда вы сканируете предложение, от начала до конца, вы сканируете его по одному символу за раз. Как только вы видите письмо, это начало следующего слова. Когда вы больше не видите букву, это конец слова, тогда вы просто продолжаете искать, пока не увидите следующую букву. Это будет следующее слово.
Другими словами, если предыдущий символ, который вы видели, был не буквой, а текущий символ — буквой, вы только что увидели начало другого слова.
Теперь все, что вам нужно сделать, это перевести это в код:
size_t num_words(const std::string &sentence)
{
bool previous_char_was_letter=false;
size_t n=0;
for (char c:sentence)
{
bool this_char_is_letter=is_letter(c);
if (!previous_char_was_letter && this_char_is_letter)
++n;
previous_char_was_letter=this_char_is_letter;
}
return n;
}
Разве это не читается так же, как мое предыдущее описание, переведенное в код?
Других решений пока нет …