Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
1

Подсчет количества каждого слова в строке и вывод по порядку

19.11.2016, 11:59. Показов 1206. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Задание заключается в том, чтоб разделить строку на слова, посчитать количество каждого слова в строке и вывести в порядке убывания (от max до min) количества.
EXAMPLE:
Input:
I live in Moscow . Moscow is my hometown . I love my hometown .

Output:
. 3
Moscow 2
I 2
hometown 2
my 2
in 1
is 1
live 1
love 1
Написал такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
 
using namespace std;
 
int main()
{
    char sentence[10000];
    cin.getline(sentence, 10000,'\n');
    string str(sentence);
    vector<string> words;
    map<string, int> wscount;
    istringstream iss(str);
    string word;
    while (iss >> word)
    {
        words.push_back(word);
        wscount.insert(pair<string, int>(word, 0));
    }
    map<string,int>::iterator it;
    map<string,int> wsscount;
    for (it = wscount.begin(); it != wscount.end(); it++)
    {
        int count = count_if(words.begin(), words.end(), [it](string s) { return s == it->first; });
        wsscount.insert(pair<string, int>(it->first, count));
    }
    for(it = wsscount.begin(); it != wsscount.end(); it++)
    {
        cout << it -> first << ' ' << it -> second << endl;
    }
    cin.get();
    return 0;
}
Он все выводит, но не в порядке убывания по количеству.
Помогите с решением этой проблемы, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2016, 11:59
Ответы с готовыми решениями:

Подсчёт количества каждого символа в строке
Программа подсчитывает сколько каких символов, хочу сделать чтобы он мне не считал пробел и не...

Подсчет количества слов и длины каждого слова в тексте
Добрый день, Киберфорум! Только начал изучать с++, поэтому не кидайтесь тапками) Учу по книге....

Подсчёт количества чисел, удаление каждого второго слова и слов из латинских букв
Я новичок в програмировании, сказать больше Чайник, но всё-же очень хочу развивать в этом...

Подсчет количества символов в строке и поиск самого длинного слова
Здравствуйте) У меня возникла прблемка не знаю как и решить задали написать программку с...

6
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
19.11.2016, 12:19 2
Sultik_Zaka,
C++
1
2
3
4
for(auto it = wsscount.crbegin(); it != wsscount.crend(); it++)
    {
        cout << it -> first << ' ' << it -> second << endl;
    }
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
19.11.2016, 13:13  [ТС] 3
Вывод по Вашему коду:
my 2
love 1
live 1
is 1
in 1
hometown 2
I 2
Moscow 2
. 3
И код нужен на C++98

Добавлено через 50 минут
Также появилась такая проблема (в Code::Blocks):
int count = count_if(words.begin(), words.end(), [it](string s) { return s == it->first; });

Solution.cpp:28: error: expected primary-expression before '[' token
Solution.cpp:28: error: expected primary-expression before "s"
В Apple Xcode все окей...
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
19.11.2016, 13:23 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <sstream>
#include <string>
#include <iterator>
#include <map>
#include <iostream>
 
using namespace std;
 
int main()
{
    string input;
    getline(cin, input);
    istringstream isstrm(input);
    
    map<string, size_t> strMap;
    
    istream_iterator<string> isIter(isstrm);
    while (isIter != istream_iterator<string>())
        ++strMap[*isIter++];
        
    multimap<size_t, string> countMap;
    map<string, size_t>::const_iterator beg(strMap.begin());
    for (; beg != strMap.end(); ++beg)
        countMap.insert(make_pair(beg -> second, beg -> first));
        
    multimap<size_t, string>::const_reverse_iterator rbeg(countMap.rbegin());
    for (; rbeg != countMap.rend(); ++rbeg)
        cout << rbeg -> first << ' ' << rbeg -> second << endl;
    
    //system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
20.11.2016, 10:36  [ТС] 5
Огромное спасибо, вывод по цифрам отличный, но нужно слова в лексикографическом порядке.

Добавлено через 20 часов 51 минуту
Перевел в вектор и отсортировал по значениям, теперь бы по лексикографии (алфавиту).
На выходе получил
C++
1
 vector<pair<string, int> > v
Нашел bool и функцию для сортировки по алфавиту:
C++
1
2
3
4
5
sort(v.begin(), v.end(), compareString);
bool compareString(const pair<string,int> &lhs, const pair<string,int> &rhs)
{
    return rhs.first > lhs.first;
}
Но вот незадача, он сортирует не смотря на второе значение (int), можете помочь, чтоб он сортировал только если второе значение первого равно второму значению второго
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
20.11.2016, 11:31 6
Sultik_Zaka, может это поможет
http://www.cplusplus.com/refer... able_sort/
0
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
20.11.2016, 12:07  [ТС] 7
Спасибо! Уже сделал, вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <sstream>
#include <string>
#include <iterator>
#include <map>
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
bool sortbysec(const pair<string,int> &a, const pair<string,int> &b)
{
    return (b.second < a.second);
}
bool compareString(const pair<string,int> &lhs, const pair<string,int> &rhs)
{
    if(lhs.second == rhs.second)
    {
        return lhs.first < rhs.first;
    }
    return lhs.second > rhs.second;
}
int main()
{
    string input;
    getline(cin, input);
    istringstream isstrm(input);
    map<string, size_t> strMap;
    istream_iterator<string> isIter(isstrm);
    while (isIter != istream_iterator<string>())
    {
        ++strMap[*isIter++];
    }
    multimap<string, size_t> countMap;
    map<string, size_t>::iterator beg;
    for (beg = strMap.begin(); beg != strMap.end(); ++beg)
    {
        countMap.insert(make_pair(beg -> first, beg -> second));
    }
    vector<pair<string,int> >::iterator rbeg;
    vector<pair<string,int> > v(countMap.begin(), countMap.end());
    sort(v.begin(), v.end(), sortbysec);
    sort(v.begin(), v.end(), compareString);
    for (rbeg = v.begin(); rbeg != v.end(); rbeg++)
    {
        cout << rbeg -> first << ' ' << rbeg -> second << endl;
    }
    return 0;
}
Но проверяльщик выдает ошибку в одном из тестов (типа ответ неверный), может есть какие-то предположения у кого?)
0
20.11.2016, 12:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2016, 12:07
Помогаю со студенческими работами здесь

Предусмотреть подсчет общего количества перестановок и вывод промежуточного массива после каждого цикла сортировки
Нужно предусмотреть подсчет общего количества перестановок и вывод промежуточного массива после...

В строке подсчитать сумму кодов символов каждого слова. Слова в строке разделены пробелами
нашел функцию для вычисления суммы кодов символов на форуме, но как переделать её под динамический...

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

Подсчет количества предложений каждого абзаца
Как посчитать количество предложений каждого абзаца после этого же абзаца?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru