Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Sultik_Zaka
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 59
1

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

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

Всем привет!
Задание заключается в том, чтоб разделить строку на слова, посчитать количество каждого слова в строке и вывести в порядке убывания (от 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2016, 11:59
Ответы с готовыми решениями:

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

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

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

Подсчет количества символов в строке
программа должна считать кол-во символов в строке но выдает 0 #include &quot;stdafx.h&quot; #include...

Подсчет количества пробелов в строке
Подсчет количества пробелов в строке s. Для этого нужно использовать функцию: int Words (s). Нельзя...

6
Ferrari F1
795 / 525 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 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
Sultik_Zaka
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
Ferrari F1
795 / 525 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 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
Sultik_Zaka
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
Ferrari F1
795 / 525 / 157
Регистрация: 27.01.2015
Сообщений: 3,025
Записей в блоге: 1
Завершенные тесты: 1
20.11.2016, 11:31 6
Sultik_Zaka, может это поможет
http://www.cplusplus.com/reference/algorithm/stable_sort/
0
Sultik_Zaka
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
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2016, 12:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подсчет количества цифр в строке
typedef { int c, d; } Dec; Dec Add(Dec a, Dec b) { Dec r; int la, lb, pw, x; r.c = a.c + b.c;...

Подсчет количества слов в строке
Помогите пожалуйста написать программу для подсчета количества слов в строке

Подсчет количества слов в строке
Все привет. Помогите пожалуйста написать код на с++ С клавиатуры вводится текстовая строка....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.