Форум программистов, компьютерный форум CyberForum.ru

Вывести только те слова сообщения, которые встречаются в нем более n раз - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Shato
2 / 2 / 0
Регистрация: 16.03.2011
Сообщений: 82
16.03.2011, 23:41     Вывести только те слова сообщения, которые встречаются в нем более n раз #1
Нужно выполнить эту задчку используя только библиотеки string и iostream.
Буду очень благодарен, если вам не трудно.

Дано осмысленное текствовое сообщение (т.е. алфавитно-цифровая информация, разделенная
пробелами и знаками препинания, в конце которого ставится точка.

Вывести только те слова сообщения, которые встречаются в нем более n раз.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2011, 23:41     Вывести только те слова сообщения, которые встречаются в нем более n раз
Посмотрите здесь:

Нужно из строки символов удалить символы которые встречаются в нем только один раз C++
Вывести только те слова сообщения, которые содержат не более чем n букв C++
Вывести только те слова сообщения, которые встречаются в тексте один раз C++
Вывести только те слова сообщения, которые встречаются в нем ровно один раз C++
C++ Дана символьная строка. Вывести на экран только те символы, которые встречаются в ней более трех раз, для каждого из эти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
16.03.2011, 23:48     Вывести только те слова сообщения, которые встречаются в нем более n раз #2
Насколько осмысленным есть текствовое сообщение ? Анализировать ли это?
Shato
2 / 2 / 0
Регистрация: 16.03.2011
Сообщений: 82
17.03.2011, 06:46  [ТС]     Вывести только те слова сообщения, которые встречаются в нем более n раз #3
осмысленное т.е используются пробелы и знаки препинания :
например string razdel =".,;:?!";

Добавлено через 6 часов 56 минут
Посмотрите , кто может, плиз
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
17.03.2011, 11:53     Вывести только те слова сообщения, которые встречаются в нем более n раз #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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/////////////////////////////////////////////////////////////////////////////////////////
//Дано осмысленное текствовое сообщение (т.е. алфавитно-цифровая информация, разделенная
//пробелами и знаками препинания, в конце которого ставится точка.
//
//Вывести только те слова сообщения, которые встречаются в нем более n раз. 
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <locale>
#include <set>
#include <sstream>
#include <string>
#include <windows.h> 
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string           T_str;
typedef std::set<T_str>       T_words_set;
typedef std::multiset<T_str>  T_words_multiset;
/////////////////////////////////////////////////////////////////////////////////////////
T_str  from_DOS(const T_str&  DOS_string)
{   
    char*  p_buf = new char[DOS_string.length() + 1];
    OemToCharA(DOS_string.c_str(), p_buf);
    T_str  res(p_buf);
    delete[] p_buf;
    return res;
}
/////////////////////////////////////////////////////////////////////////////////////////
void  remove_puncts(T_str&  s)
{
    struct  T_is_rus_punct
    {
        bool  operator() (char  c)
        {
            return  std::ispunct(c, std::locale(""));
        }
    };
    std::replace_if(s.begin(), s.end(), T_is_rus_punct(), ' ');
}
/////////////////////////////////////////////////////////////////////////////////////////
T_words_set  get_words_with_count_greater
    (
        int           n, 
        const T_str&  s
    )
{   
    std::istringstream  ssin(s);
    T_words_multiset  words_multiset(
                                        (std::istream_iterator<T_str>(ssin)),
                                        (std::istream_iterator<T_str>())
                                    );
 
    struct T_count_is_less_eq_in
    {
        size_t                   n_;
        const T_words_multiset&  words_multiset_;    
        //-------------------------------------------------------------------------------
        T_count_is_less_eq_in
            (
                size_t                   n,
                const T_words_multiset&  words_multiset            
            )
            : n_               (n),
              words_multiset_  (words_multiset)
        {}
        //-------------------------------------------------------------------------------
        bool  operator() (T_words_multiset::value_type  words_multiset_elem)
        {
            return  words_multiset_.count(words_multiset_elem) <= n_;
        }
    };
 
    T_words_set  words_set_res;
 
    std::remove_copy_if(
                           words_multiset.begin(),
                           words_multiset.end(),
                           std::inserter(words_set_res, words_set_res.begin()),
                           T_count_is_less_eq_in(n, words_multiset)
                       );
 
    return  words_set_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите предложение:"
              << std::endl;
    
    T_str  DOS_s;
    getline(std::cin, DOS_s);
    T_str  s = from_DOS(DOS_s);
    remove_puncts(s);
 
    int  n = 0;
    do
    {
        std::cout << "n >= 0: ";
        std::cin >> n;
    }while(n < 0);        
    
    T_words_set  words_set = get_words_with_count_greater(n, s); 
    if(words_set.empty())
    {
        std::cout << "В заданном предложении нет слов, встречающихся более "
                  << n
                  << " раз."
                  << std::endl;
    }
    else
    {
        std::cout << "В заданном предложении более "
                  << n
                  << " раз встречаются следующие слова:"
                  << std::endl;
 
        std::copy(words_set.begin(), words_set.end(), 
                  std::ostream_iterator<T_str>(std::cout, "\n"));    
    }
}
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
17.03.2011, 11:58     Вывести только те слова сообщения, которые встречаются в нем более n раз #5
Цитата Сообщение от Mr.X Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
T_str from_DOS(const T_str& DOS_string)
{ 
 char* p_buf = new char[DOS_string.length() + 1];
 OemToCharA(DOS_string.c_str(), p_buf);
 T_str res(p_buf);
 delete[] p_buf;
 return res;
}
а зачем это?
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
17.03.2011, 12:10     Вывести только те слова сообщения, которые встречаются в нем более n раз #6
Цитата Сообщение от Mayonez Посмотреть сообщение
а зачем это?
Может я конечно ошыбаюсь, но мне кажется ета функция позволяет вводить строку русской раскладкой.
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
17.03.2011, 12:19     Вывести только те слова сообщения, которые встречаются в нем более n раз #7
Цитата Сообщение от Mayonez Посмотреть сообщение
а зачем это?
Без этого введенные с консоли символы кириллицы при выводе обратно на консоль превратятся в кракозябры.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
17.03.2011, 14:09     Вывести только те слова сообщения, которые встречаются в нем более n раз #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
#include <iostream>
#include <locale>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <map>
 
int main()
{
    typedef std::ctype<char> StdFacet;
    typedef unsigned char uchar;
 
    //--------
 
    std::cout << "Input string: ";
    std::string line;
    std::getline(std::cin, line);    
 
    std::vector<StdFacet::mask> masks(StdFacet::table_size, StdFacet::mask());
 
    const std::string delim = "!?., ";
    for(std::string::const_iterator it = delim.begin(); it != delim.end(); ++it)
        masks[static_cast<uchar>(*it)] = StdFacet::space;
 
    std::istringstream iss(line);
    std::locale loc(iss.getloc(), new StdFacet(&masks[0]));
    iss.imbue(loc);
 
    std::map<std::string, int> m;
    std::string t;
    while(iss >> t) ++m[t];
 
    std::cout << "input n: ";
    int n;
    std::cin >> n;
 
    for(std::map<std::string, int>::iterator it = m.begin(); it != m.end(); ++it)
        if(it->second > n) std::cout << it->first << '\n';
 
    return 0;
}
Shato
2 / 2 / 0
Регистрация: 16.03.2011
Сообщений: 82
17.03.2011, 16:49  [ТС]     Вывести только те слова сообщения, которые встречаются в нем более n раз #9
Спасибо огромное!
НО, нужно сделаь было используя только библиотеки string и iostream. Если это невозможно спасибо и на этом, а если возможно очень прошу сделать кто может.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
18.03.2011, 00:58     Вывести только те слова сообщения, которые встречаются в нем более n раз #10
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <string>
 
//-------------
 
struct Item
{
    std::string word;
    int occurences;
    Item* next;
 
    Item(const std::string& s)
        : word(s), occurences(1), next(NULL)
    {
    }
};
 
//-------------
 
Item* add(Item* pointerTo1stItem, const std::string& str)
{
    if(pointerTo1stItem == NULL) return new Item(str);
 
    Item* last;
    for(Item* item = pointerTo1stItem; item != NULL; item = item->next)
    {
        if(item->word == str)
        {
            ++item->occurences;
            return pointerTo1stItem;
        }
 
        last = item;
    }
 
    last->next = new Item(str);
 
    return pointerTo1stItem;
}
 
//------------
 
void cleanUp(Item* item)
{
    Item* next;
    while(item != NULL)
    {
        next = item->next;
        delete item;
        item = next;
    }
}
 
//-------------
 
int main()
{
    std::cout << "input sentence: ";
    std::string s;
    std::getline(std::cin, s, '.');
    s+= '.';
 
    const std::string delim = "\n\t,.!? ";
 
    std::string::size_type first = 0;
    std::string::size_type last = 0;
 
    Item* item = NULL;
 
    while(s[last] != '.' && (first = s.find_first_not_of(delim, last)) != std::string::npos)
    {
        last = s.find_first_of(delim, first);
        item = add(item, s.substr(first, last - first));
    }
 
    std::cout << "input n: ";
    int n;
    std::cin >> n;
 
    for(Item* p = item; p != NULL; p = p->next)
        if(p->occurences > n) std::cout << p->word << '\n';
 
    cleanUp(item);
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2011, 15:53     Вывести только те слова сообщения, которые встречаются в нем более n раз
Еще ссылки по теме:

C++ Вывести только те слова сообщения, которые содержат не более чем n букв
C++ Выбрать из файла те символы, которые встречаются в нем только один раз
Вывести только те слова сообщения, которые встречаются в нем ровно один раз C++

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
18.03.2011, 15:53     Вывести только те слова сообщения, которые встречаются в нем более n раз #11
rangerx, оригинально! Только почему у вас двоеточие не считается знаком препинания?
Yandex
Объявления
18.03.2011, 15:53     Вывести только те слова сообщения, которые встречаются в нем более n раз
Ответ Создать тему
Опции темы

Текущее время: 22:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru