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

Вывести слова которые повторяются и количество их повторения - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.88
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
28.01.2012, 22:46     Вывести слова которые повторяются и количество их повторения #1
Ребят помогите реализовать следующую програмку: нужно чтоб когда на входе программы было например "мама мыла раму раму мыла мама".


программа вывела: слова которые повторяются и количество их повторения.

мама - 2раза
раму - 2раза
мыла - 2 раза


помогите
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2012, 22:46     Вывести слова которые повторяются и количество их повторения
Посмотрите здесь:

Найти и вывести на экран слова, которие повторяются C++
Удалить из сообщения слова (без учета регистра), которые повторяются. C++
C++ Вывести слова данного предложения, которые отличны от последнего слова
В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются. C++
C++ Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
28.01.2012, 23:23     Вывести слова которые повторяются и количество их повторения #2
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
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
 
//---------------------------------------------------------------------
typedef std::string              T_str;
typedef std::vector<T_str>       T_vec;
typedef std::map<T_str, int>     T_map;
typedef T_map::iterator          T_map_it;
typedef std::pair<T_str, int>    T_pair;
//---------------------------------------------------------------------
 
int split_str_to_vec(const T_str , const T_str, T_vec & );
 
int main()
{
   T_str str("Hi Hello world Hello Hi, Hi Hi Hello");
   T_map set;
   T_vec v;
 
   split_str_to_vec(str, " \t\n,.-", v);
   
   std::for_each(v.begin(), v.end(), [&] (T_str str) { ++set[str]; });
   
   for ( auto &i : set )
      std::cout << i.first << " - " << i.second << std::endl;
 
   return 0;
}
 
int split_str_to_vec(const T_str s, const T_str DELIM, T_vec &v)
{
   size_t l, r;
 
   for ( l = s.find_first_not_of(DELIM), r = s.find_first_of(DELIM, l) ; 
      l != std::string::npos ; l = s.find_first_not_of(DELIM, r), r = s.find_first_of(DELIM, l) )
      v.push_back(s.substr(l, r - l));
   return v.size();
}
http://liveworkspace.org/code/eb1795...a34710a4140ce3
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
28.01.2012, 23:44  [ТС]     Вывести слова которые повторяются и количество их повторения #3
Бро это конечно всё хорошо,даже очень.Но мне нужен [С] код а не плюсы я их не изучал обсалютно не понимаю что ты написал тут, я буду всёравно переделывать потому-что мой экзаменатор знает как я пишу проиги и мне ее нужо потом обьяснить!))
я хочу понять и сам ее написать а мне нужен образец

а эту я точно не обьясню, если не трудно и есть время - можещ как то её в СИ переделать и чтоб она была понятной)

или просто обьяснить мне алгоритм а я сам напишу, плз
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
28.01.2012, 23:48     Вывести слова которые повторяются и количество их повторения #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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct NODE {
    const char * word;
    size_t count;
    struct NODE * left;
    struct NODE * right;
} treenode_t;
 
int add_node(treenode_t ** t, const char * w){
    if ( ! *t ){
        if ( ! ( *t = malloc(sizeof(treenode_t)) ) )
            return -1;
        (*t)->word = w;
        (*t)->count = 1;
        (*t)->left = NULL;
        (*t)->right = NULL;
        return 0;
    }
    else {
        int cmp = strcmp((*t)->word, w);
        if ( cmp > 0 )
            return add_node(&(*t)->left, w);
        else if ( cmp < 0 )
            return add_node(&(*t)->right, w);
        else {
            (*t)->count += 1;
            return 0;
        }
    }
}
 
void kill_tree(treenode_t ** t){
    if ( *t ){
        kill_tree(&(*t)->left);
        kill_tree(&(*t)->right);
        free(*t);
        *t = NULL;
    }
}
 
void dump_tree(const treenode_t * t){
    if ( t->left )
        dump_tree(t->left);
    printf("%-20s%5u\n",t->word, t->count);
    if ( t->right )
        dump_tree(t->right);
}
 
#define DELIM " \t\n"
 
int main(void){
    char buf[BUFSIZ];
 
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ){
        treenode_t * tree = NULL;
        char * p;
 
        for ( p = strtok(buf, DELIM); p != NULL; p = strtok(NULL, DELIM) ){
            if ( add_node(&tree, p) ){
                fprintf(stderr, "Memory error!\n");
                exit(1);
            }
        }
 
        if ( ! tree ){
            printf("No one word in input string.\n\n");
            continue;
        }
 
        printf("-------------------------\n");
        printf("Word                Count\n");
        printf("-------------------------\n");
        dump_tree(tree);
        printf("-------------------------\n\n");
 
        kill_tree(&tree);
    }
 
    exit(0);
}
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
29.01.2012, 00:04  [ТС]     Вывести слова которые повторяются и количество их повторения #5
main.cpp: In function ‘int add_node(treenode_t**, const char*)’:
main.cpp:14:48: error: invalid conversion from ‘void*’ to ‘treenode_t*’
make[2]: *** [build/Debug/GNU-Linux-x86/main.o] Error 1

что с этим делать?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
29.01.2012, 00:09     Вывести слова которые повторяются и количество их повторения #6
Цитата Сообщение от 6blgJlo'KOgeP Посмотреть сообщение
что с этим делать?
Цитата Сообщение от 6blgJlo'KOgeP Посмотреть сообщение
main.cpp
А вот не нужно С-программы компилировать, как С++.
C
1
2
3
/*...*/
if ( ! ( *t = (treenode_t*)malloc(sizeof(treenode_t)) ) )
/*...*/
а лучше всё-таки с компилятором разберитесь.
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
29.01.2012, 00:17  [ТС]     Вывести слова которые повторяются и количество их повторения #7
спасибо большое))) всё отлично работает)) когданибудь я тоже стану таким как вы!)
суровым бородатым как Страуструм кодером)
-=ЮрА=-
Заблокирован
Автор FAQ
03.02.2012, 12:46     Вывести слова которые повторяются и количество их повторения #8
Цитата Сообщение от 6blgJlo'KOgeP Посмотреть сообщение
Ребят помогите реализовать следующую програмку: нужно чтоб когда на входе программы было например "мама мыла раму раму мыла мама".
программа вывела: слова которые повторяются и количество их повторения.
мама - 2раза
раму - 2раза
мыла - 2 раза
помогите
Попробуй вот этот код - он отличен от всех предложенных
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
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
 
char * getWord(char * word)
{
    //ГќГІГ® Г*Г* ñëó÷Г*Г© åñëè ñëîâî èä¸ò Г± Г§Г*ïÿòîé ГўГЄГ®Г*öå èëè ГҐГ№Вё Г·ГҐГ¬
    //ïðèìåð : ñëîâî, ïîñëå getWord âûéäåò ñëîâî
    long sLen = strlen(word);
    while(!isalpha(word[sLen - 1]) && !isdigit(word[sLen - 1]))
    {
        sLen = sLen - 1;
        word[sLen] = '\0';
    }
    return word;
}
 
long getWords(char * text, char ** WordArray)
{
    long nWord;//×èñëî ñëîâ
    long sLen;//ÄëèГ*Г*Г* ГІГҐГЄГ±ГІГ*
    long wLen;//ÄëèГ*Г*Г* ñëîâГ*
    char word[32];//ГЃГіГґГґГҐГ° äëÿ ñëîâГ*
    char *str;//ÓêГ*Г§Г*òåëü Г*Г* Г*Г*Г·Г*ëî ïîäñòðîêè Г±Г® ñëîâîì
    sLen = strlen(text);
    long i = (nWord = 0);
    while(i < sLen)
    {
        sscanf(text + i,"%s",word);
        str = strstr(text + i, word);
        wLen= strlen(word);
        i   = strlen(text) - strlen(str) + wLen;
        if(WordArray != NULL)//Åñëè WordArray òîëüêî Г±Г·ГЁГІГ*ГҐГ¬ ÷èñëî ñëîâ
        {
            WordArray[nWord] = (char *)malloc(wLen*sizeof(char));
            strcpy(WordArray[nWord],getWord(word));
        }
        nWord = nWord + 1;
    }
    return nWord;
}
 
int main()
{
    long i,j,n;
    long nWord;//×èñëî ñëîâ Гў ГІГҐГЄГ±ГІГҐ
    char text[1024] = {0};
    char ** WordArray;//ÓêГ*Г§Г*òåëü Г*Г* Г¬Г*Г±Г±ГЁГў ñëîâ ГЁГ§ ïðåäëîæåГ*ГЁГї
    long * flags;//ГЊГ*Г±Г±ГЁГў ГґГ«Г*ãîâ äëÿ ГЁГ*äåêñîâ WordArray
    while(true)//ÌîæГ*Г® áóäåò ââîäèòü ГІГҐГЄГ±ГІ õîòü äî ГЎГҐГ±ГЄГ®Г*ГҐГ·Г*îñòè
    {
        WordArray = NULL;
        flags     = NULL;
        printf("Enter text(less than 1024 chars)\n");
        scanf("%[^\n]",text);
        getchar();//ÓáðГ*ëè '\n' îò ââîäГ*
        if((nWord = getWords(text, WordArray)) < 1)
            printf("Error updating words\n");
        else
        {
            //Âûäåëèëè ГЇГ*ìÿòü ïîä ГіГЄГ*Г§Г*òåëè Г*Г* ñòðîêè Г±Г® ñëîâГ*ìè ГЁГ§ ГІГҐГЄГ±ГІГ*
            WordArray = (char **)malloc(nWord*sizeof(char *));
            //Òåïåðü óæå ïåðåïèñГ*ëè ñëîâГ* ГЁГ§ ñòðîêè Гў Г¬Г*Г±Г±ГЁГў
            nWord = getWords(text, WordArray);
            flags = (long *)malloc(nWord*sizeof(long));
        }
        printf("Number of words in string %d\n",nWord);
        for(i = 0; i < nWord; i++)
        {
            for(j = 0,n = 0; j < nWord; j++)
            {
                if(strcmp(WordArray[i],WordArray[j]) == 0)
                {
                    if(i != j)
                        flags[j] = 1;//Ïîìå÷Г*ГҐГ¬ ñëîâî óæå ïîñ÷èòГ*Г*Г*ûì
                    n = n + 1;
                }
            }
            if(flags[i] != 1)
                printf("%s chislo raz v stroke %d\n",WordArray[i],n);
        }
        //ГЌГі Г* òåïåðü âûñâîáîæäГ*ГҐГ¬ ГЇГ*ìÿòü
        for(i = nWord - 1; 0 <= i; i--)
            WordArray[i] = (char *)realloc((void *)WordArray[i],sizeof(char *));
        free((void *)WordArray);
        free((void *)flags);
    }
    system("pause");
    return 0;
}

Не по теме:

PS:easybudda, зачем strtok - он же небезопасный и строку гробит, почему за столько лет от него не откажешся???
Думаю выше нормальный Си-велосипед для парсинга слов...

Миниатюры
Вывести слова которые повторяются и количество их повторения  
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.02.2012, 12:49     Вывести слова которые повторяются и количество их повторения #9
-=ЮрА=-, Конечно... Куда проще написать новый велосипед, вместо того, чтобы заюзать strtok...
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 12:52     Вывести слова которые повторяются и количество их повторения #10
-=ЮрА=-, бегло просмотрел код. Где строка делителей?

Добавлено через 49 секунд
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
зачем strtok
А чем он плох?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
он же небезопасный
В каком смысле?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
строку гробит
Кто не дает Вам право сделать копию?
-=ЮрА=-
Заблокирован
Автор FAQ
03.02.2012, 12:56     Вывести слова которые повторяются и количество их повторения #11
Цитата Сообщение от go Посмотреть сообщение
А чем он плох?
Сообщение от -=ЮрА=-
он же небезопасный
В каком смысле?
- исходная строка исчезает

Цитата Сообщение от go Посмотреть сообщение
Кто не дает Вам право сделать копию?
- зачем делать копию всей если достаточно віделить память под слова, можно доработать механизм и не записывать в WordArray дублежи

Цитата Сообщение от ForEveR Посмотреть сообщение
-=ЮрА=-, Конечно... Куда проще написать новый велосипед, вместо того, чтобы заюзать strtok...
- как по мне данное решение даёт понять саму суть поиска числа слов, а не банальное чиканье строки на токены...

Добавлено через 25 секунд
Цитата Сообщение от go Посмотреть сообщение
Где строка делителей?
- что имелось в виду?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 12:59     Вывести слова которые повторяются и количество их повторения #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- что имелось в виду?
Бегло просмотрел Ваш код, и не заметил массив, в котором должна храниться строка символов, которые являются разделителями слов.
-=ЮрА=-
Заблокирован
Автор FAQ
03.02.2012, 13:04     Вывести слова которые повторяются и количество их повторения #13
Цитата Сообщение от go Посмотреть сообщение
Бегло просмотрел Ваш код, и не заметил массив, в котором должна храниться строка символов, которые являются разделителями слов.
- потому что sscanf выделяет токен - чаще всего єто слово, если уж вконце слова идёт запятая точка или любой другой разделитель, он отсекается здесь
C
1
2
3
4
5
6
7
8
9
10
11
12
char * getWord(char * word)
{
        //Это на случай если слово идёт с запятой вконце или ещё чем
        //пример : слово, после getWord выйдет слово
        long sLen = strlen(word);
        while(!isalpha(word[sLen - 1]) && !isdigit(word[sLen - 1]))
        {
                sLen = sLen - 1;
                word[sLen] = '\0';
        }
        return word;
}
Советую посмотреть код повнимательней
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.02.2012, 14:29     Вывести слова которые повторяются и количество их повторения #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Советую посмотреть код повнимательней
Ага... http://codepad.org/XSBdN5m5 присмотритесь...
-=ЮрА=-
Заблокирован
Автор FAQ
03.02.2012, 15:00     Вывести слова которые повторяются и количество их повторения #15
easybudda, это всё легко устранимо http://codepad.org/acBNoAdw - галвное же идея sscanf вместо strtok
PS:Благодарю за альфа-тестирование
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.02.2012, 16:14     Вывести слова которые повторяются и количество их повторения #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
easybudda, зачем strtok - он же небезопасный
В плане потоков? strtok_r() есть на такие случаи.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
и строку гробит
Да и чёрт бы с ней. Если нужна исходная строка, go прекрасный выход подсказал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
почему за столько лет от него не откажешся?
Когда я только появился на форуме, я просто не умел этой функцией пользоваться. Тоже знатные велосипеды сочинял по извлечению слов из строк (можно поискать при желании). Разобравшись же с ней просто не вижу смысла городить вот такие непонятные конструкции, да ещё и череватые ошибками вроде обнуления произвольного количества байт памяти...
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
это всё легко устранимо
Да само собой, только его ещё заметить надо... Короче, по моему скромному, нужен очень веский повод, чтобы отказываться от стандартных библиотечных функций, гораздо лучше научиться ими пользоваться.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(true)
Если на С, то
C
1
while ( 1 )
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Благодарю за альфа-тестирование
А попробуй в ответ на второй запрос просто enter нажать...
Да и само по себе решение с деревом как-то оптимистичнее выглядит, к тому же у меня в примере слова лишний раз вообще никуда не копируются...
-=ЮрА=-
Заблокирован
Автор FAQ
03.02.2012, 16:29     Вывести слова которые повторяются и количество их повторения #17
Цитата Сообщение от easybudda Посмотреть сообщение
к тому же у меня в примере слова лишний раз вообще никуда не копируются
- ну это не аргумент переделать под такое довольно таки просто
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
можно доработать механизм и не записывать в WordArray дублежи
Цитата Сообщение от easybudda Посмотреть сообщение
А попробуй в ответ на второй запрос просто enter нажать...
- всмысле, 2-й ввод, или что имелось ввиду?
Ниже отработка для 2-го ввода
2 теста
Enter text(less than 1024 chars)
test test test
Number of words in string 3
test chislo raz v stroke 3
Enter text(less than 1024 chars)
test2 test2 test2
Number of words in string 3
test2 chislo raz v stroke 3
Enter text(less than 1024 chars)


Добавлено через 4 минуты
easybudda, записанные слова из текста можно к примеру использовать для их реверса(вывод слов в предложении наоброт), да миллион таких заданий можно придумать, лично мне нра, навязывать алгоритм я и не хотел просто показал как можно обойтись без strtok -
имхо
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(i < sLen)
* * * * {
* * * * * * * * sscanf(text + i,"%s",word);
* * * * * * * * str = strstr(text + i, word);
* * * * * * * * wLen= strlen(word);
* * * * * * * * i * = strlen(text) - strlen(str) + wLen;
* * * * }
не на много сложней чем
while(tok)
{
tok = strtok(NULL,delim);
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.02.2012, 16:34     Вывести слова которые повторяются и количество их повторения #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ну это не аргумент переделать под такое довольно таки просто
можно доработать механизм и не записывать в WordArray дублежи
Так у меня и первые из повторяющихся слов, и вообще никакие слова никуда не копируются, как лежали в исходной строке, так и лежат. Как-раз аргумент.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
просто показал как можно обойти strtok
Осталось объяснить, за чем...

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
всмысле, 2-й ввод, или что имелось ввиду?
Код
Enter text(less than 1024 chars)
bla one two bla two bla three three three
Number of words in string 9
bla chislo raz v stroke 3
one chislo raz v stroke 1
two chislo raz v stroke 2
three chislo raz v stroke 3
Enter text(less than 1024 chars)

Number of words in string 9
bla chislo raz v stroke 3
one chislo raz v stroke 1
two chislo raz v stroke 2
three chislo raz v stroke 3
Enter text(less than 1024 chars)

Number of words in string 9
bla chislo raz v stroke 3
one chislo raz v stroke 1
two chislo raz v stroke 2
three chislo raz v stroke 3
Enter text(less than 1024 chars)

Не по теме:

Как в том анекдоте

Малыш, хочешь, я расскажу тебе сказку... Малыш, хочешь, я расскажу тебе сказку... Малыш, хочешь, я расскажу тебе сказку...

-=ЮрА=-
Заблокирован
Автор FAQ
03.02.2012, 17:14     Вывести слова которые повторяются и количество их повторения #19
easybudda, ничего не понял возможно правя мой код забыл getchar
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
printf("Enter text(less than 1024 chars)\n");
* * * * * * * * scanf("%[^\n]",text);
* * * * * * * * getchar();//Убрали '\n' от ввода

Не по теме:

PS:Тоже приведу одну цитату: Павлины говришь, эээ эх...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2012, 17:37     Вывести слова которые повторяются и количество их повторения
Еще ссылки по теме:

Вывести элементы массива, которые повторяются ровно два раза C++
C++ Пользователь вводит 8 чисел, вывести числа которые повторяются 2 или больше раз
Определить количество слов в тексте, и вывести слова, которые по длине меньше заданного числа C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.02.2012, 17:37     Вывести слова которые повторяются и количество их повторения #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ничего не понял возможно правя мой код забыл getchar
кроме while ( 1 ) ничего не правил. Запустил программу, в ответ на приглашение ввёл строку, выдало результат и снова приглашение. Просто нажал enter, выдало предыдущий результат и приглашение...
Yandex
Объявления
03.02.2012, 17:37     Вывести слова которые повторяются и количество их повторения
Ответ Создать тему
Опции темы

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