Здравствуйте! Задача такая: в строке нужно подсчитать сколько раз встречается каждое слово. К примеру, строка: «one two three».
Результат: one встречается один раз
two встречается один раз
three встречается один раз
Строку на слова я разделил, но как дальше сделать не знаю. Если можно, то нужно написать как можно проще, используя просто стандратные функции работы со строками. Заранее спасибо за помощь!
Вот моя программа:
void main()
{
setlocale(LC_ALL, "Russian");
char string[256], *p;
int i;
cout << "Введите строку: ";
cin.getline(string, sizeof(string));
p = strtok(string, " .,/!?");
while (p != 0) {
cout << p << endl;
p = strtok(0, " .,/!?");
}
system("pause");
}
Возьмите
map<string, int> m;
и просто добавляйте все слова как
m[p]++;
По окончании работы для каждого слова получите нужное значение, скажем,
for(auto i: m) cout << i.first << " : " << i.second << endl;
Если, как Сухову - "лучше, конечно, помучиться" (с), то
struct item { char * name, int count; }
item ii[МНОГО]; int size = 0;
Дальше для каждого слова проверять, есть ли оно в ii[0]
-- ii[size-1]
, если нет - заносить в ii[size]
, счетчик сбрасывать в 1, size
увеличивать. Если есть - увеличивать соответствующий счетчик...
Как вы просили - с помощью стандартных функций. Например:
using namespace std;
vector<string> v;
int k = 0;
// если вводите с консоли
copy(istream_iterator<string>(cin), istream_iterator<string>(),
back_inserter(v));
auto P = v.begin();
while(!v.empty()) {
k = count(P, v.end(), *P);
cout << *P << " ... " << k << endl;
string s = *P;
v.erase(std::remove(P, v.end(), s), v.end());
}
Можете также переделать свой код. Та же логика на языке 'C' будет выглядеть например так:
char string[256], *p;
char* m[100];
int i = 0, k = 1;
std::cout << "..." << std::endl;
std::cin.getline(string, sizeof(string));
p = strtok(string, " .,/!?");
while (p != 0) {
m[i] = new char[strlen(p) + 1];
std::cout << p << std::endl;
strcpy(m[i], p);
p = strtok(0, " .,/!?");
++i;
}
const char* q = "-";
std::cout << i << std::endl;
for (int j = 0; j < i; ++j) {
if(!strcmp(m[j], q)) continue;
// при равенстве strcmp возвращает 0
for (int n = j + 1; n < i; ++n)
if (!strcmp(m[j], m[n])) {
++k;
delete m[n];
m[n] = new char[2];
strcpy(m[n], q);
}
std::cout << m[j] << "..." << k <<"..." <<std::endl;
delete m[j];
k = 1;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем приветИзучая книгу Бьярне Страуструпа, я наткнулся на интересный, по моему мнению, пример:
Не понимаю, что не так с моим алгоритмом, но на сайте выдает что ошибка на одном из тестов проверкиОшибка в реализации алгоритма или в самом...