Дано предложение, где есть знаки препинания. Нужно подсчитать количество слов, совпадающих с данным
Каким образом это сделать это задание, как его реализовать?
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
int main() {
setlocale(LC_ALL, "rus");
cout << "Введите предложение: "; string stroka; getline(cin, stroka); //вводим строку
cout << endl << endl;
cout << "Введите слово: "; string slovo; cin >> slovo; //вводим слово
cout << endl << endl;
//понятия не имею, что дальше писать
return 0;
}
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
Ну, можно сделать так -
int howMuch(const string& in, const string& what)
{
int count = 0;
for(size_t pos = 0; (pos = in.find(what,pos)) != in.npos; pos++)
{
if (pos > 0 && isalpha(in[pos-1])) continue;
if (isalpha(in[pos + what.size()])) continue;
count++;
}
return count;
}
Просто ищем вхождение как подстроки, и проверяем, что до и после букв нет.
Для русских букв надо использовать isalpha с локалью. Или написать свое...
Автор решения: Павел Ериков
→ Ссылка
Ну или так:
int i = 0;
int size = stroka.size();
int count = 0;
bool isEqual = true;
while (i < size) {
//Доходим до начала слова
while (i < size && !isLetter(stroka[i])) ++i;
int j = 0;
isEqual = true;
//Сверяем слова
for(; j < slovo.size(); ++j)
if (stroka[j + i] != slovo[j]) {
isEqual = false;
break;
}
i += j;
if (isEqual)
++count;
//Если слова не совпадают, то пропускаем его
else
while (i < size && isLetter(stroka[i])) ++i;
}
Функция isLetter:
bool isLetter(char s) {
return (s >= 'A' && s <= 'Z') ||
(s >= 'a' && s <= 'z');
}
Это если не использовать функции по типу find и т.д. Но если вы используете string, то конечно лучше не своё писать.