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

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

28.01.2012, 22:46. Показов 9036. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят помогите реализовать следующую програмку: нужно чтоб когда на входе программы было например "мама мыла раму раму мыла мама".


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

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


помогите
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2012, 22:46
Ответы с готовыми решениями:

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

Найти и вывести на экран все элементы, которые которые повторяются более N/2 раз
#include "stdafx.h" #include <iostream> #include <fstream> using namespace std; int _tmain() {...

Удалить из сообщения слова (без учета регистра), которые повторяются.
Удалить из сообщения слова (без учета регистра), которые повторяются.

Получить количество элементов массива, которые не повторяются
Задан массив А(n),некоторые элементы в нем могут встречаться несколько раз.Получить количество...

38
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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/... 10a4140ce3
2
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
28.01.2012, 23:44  [ТС] 3
Бро это конечно всё хорошо,даже очень.Но мне нужен [С] код а не плюсы я их не изучал обсалютно не понимаю что ты написал тут, я буду всёравно переделывать потому-что мой экзаменатор знает как я пишу проиги и мне ее нужо потом обьяснить!))
я хочу понять и сам ее написать а мне нужен образец

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

или просто обьяснить мне алгоритм а я сам напишу, плз
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
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);
}
1
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

что с этим делать?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
29.01.2012, 00:09 6
Цитата Сообщение от 6blgJlo'KOgeP Посмотреть сообщение
что с этим делать?
Цитата Сообщение от 6blgJlo'KOgeP Посмотреть сообщение
main.cpp
А вот не нужно С-программы компилировать, как С++.
C
1
2
3
/*...*/
if ( ! ( *t = (treenode_t*)malloc(sizeof(treenode_t)) ) )
/*...*/
а лучше всё-таки с компилятором разберитесь.
1
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
29.01.2012, 00:17  [ТС] 7
спасибо большое))) всё отлично работает)) когданибудь я тоже стану таким как вы!)
суровым бородатым как Страуструм кодером)
0
Заблокирован
Автор 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 - он же небезопасный и строку гробит, почему за столько лет от него не откажешся???
Думаю выше нормальный Си-велосипед для парсинга слов...

Миниатюры
Вывести слова которые повторяются и количество их повторения  
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.02.2012, 12:49 9
-=ЮрА=-, Конечно... Куда проще написать новый велосипед, вместо того, чтобы заюзать strtok...
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.02.2012, 12:52 10
-=ЮрА=-, бегло просмотрел код. Где строка делителей?

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

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

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

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

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

Добавлено через 25 секунд
Цитата Сообщение от go Посмотреть сообщение
Где строка делителей?
- что имелось в виду?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.02.2012, 12:59 12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- что имелось в виду?
Бегло просмотрел Ваш код, и не заметил массив, в котором должна храниться строка символов, которые являются разделителями слов.
0
Заблокирован
Автор 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;
}
Советую посмотреть код повнимательней
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
03.02.2012, 14:29 14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Советую посмотреть код повнимательней
Ага... http://codepad.org/XSBdN5m5 присмотритесь...
0
Заблокирован
Автор FAQ
03.02.2012, 15:00 15
easybudda, это всё легко устранимо http://codepad.org/acBNoAdw - галвное же идея sscanf вместо strtok
PS:Благодарю за альфа-тестирование
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
03.02.2012, 16:14 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
easybudda, зачем strtok - он же небезопасный
В плане потоков? strtok_r() есть на такие случаи.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
и строку гробит
Да и чёрт бы с ней. Если нужна исходная строка, go прекрасный выход подсказал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
почему за столько лет от него не откажешся?
Когда я только появился на форуме, я просто не умел этой функцией пользоваться. Тоже знатные велосипеды сочинял по извлечению слов из строк (можно поискать при желании). Разобравшись же с ней просто не вижу смысла городить вот такие непонятные конструкции, да ещё и череватые ошибками вроде обнуления произвольного количества байт памяти...
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
это всё легко устранимо
Да само собой, только его ещё заметить надо... Короче, по моему скромному, нужен очень веский повод, чтобы отказываться от стандартных библиотечных функций, гораздо лучше научиться ими пользоваться.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(true)
Если на С, то
C
1
while ( 1 )
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Благодарю за альфа-тестирование
А попробуй в ответ на второй запрос просто enter нажать...
Да и само по себе решение с деревом как-то оптимистичнее выглядит, к тому же у меня в примере слова лишний раз вообще никуда не копируются...
0
Заблокирован
Автор 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);
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
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)

Не по теме:

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

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

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

Не по теме:

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

0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
03.02.2012, 17:37 20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ничего не понял возможно правя мой код забыл getchar
кроме while ( 1 ) ничего не правил. Запустил программу, в ответ на приглашение ввёл строку, выдало результат и снова приглашение. Просто нажал enter, выдало предыдущий результат и приглашение...
0
03.02.2012, 17:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2012, 17:37
Помогаю со студенческими работами здесь

Вывести буквы текста которые меньше всего повторяются
надо вывести буквы из текста которые меньше всего повторяются на с++

Найти и вывести на экран слова, которие повторяются
Доброго времени суток, форумчани. Помогите пожалуста решить задачу на Си (просто Си). Просто я...

Вывести элементы массива, которые повторяются ровно два раза
Массив создать динамический. Язык - С++ Пример: Пусть даны числа: 1,2,5,2,3,3,3, Тогда...

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


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

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