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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.88
6blgJlo'KOgeP
0 / 0 / 0
Регистрация: 13.12.2011
Сообщений: 21
#1

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

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

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


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

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


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

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

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

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

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

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

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

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

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

или просто обьяснить мне алгоритм а я сам напишу, плз
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
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
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

что с этим делать?
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
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
6blgJlo'KOgeP
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
Миниатюры
Вывести слова которые повторяются и количество их повторения  
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
03.02.2012, 12:49 #9
-=ЮрА=-, Конечно... Куда проще написать новый велосипед, вместо того, чтобы заюзать strtok...
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
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
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
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
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2012, 15:00
Привет! Вот еще темы с ответами:

Определить количество слов в тексте, и вывести слова, которые по длине меньше заданного числа - C++
Помогите написать прогу... Не работает..;) /*Дан текст, в котором слова разделяются пробелами, * в конце стоит точка. Определить...

Убедиться, что последние числа ряда повторяются, и найти период повторения - C++
Задан ряд аn=an-2+an-1, a0=0, a1=1. Убедитесь, что последние числа этого ряда повторяются. Чему равна длина периода повторения? Не...

В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются. - C++
В строке слов из букв латинского алфавита найти слова, в которых нет букв, которые повторяются.

Вывести слова данного предложения, которые отличны от последнего слова - C++
Разработать алгоритм и составить программу на языке Си. Предполагается, что длина вводимого текста ограничена константой. Длины слов...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.02.2012, 15:00
Ответ Создать тему
Опции темы

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