0 / 0 / 0
Регистрация: 27.01.2012
Сообщений: 4
1

Определить слово в строке, встречающееся наибольшее количество раз

27.01.2012, 01:24. Показов 4903. Ответов 8
Метки нет (Все метки)

помогите решить такую задачу
Дана строка – предложение. Определить слово в строке, встречающееся наибольшее количество раз, и вывести его на экран. Если таких слов несколько, то все из них. Если все слова в строке встречаются одинаковое количество раз, то ничего не выводить.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2012, 01:24
Ответы с готовыми решениями:

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

Определить число, встречающееся в последовательности наибольшее количество раз (массивы)
Определить,какое число в последовательности встречается наибольшее кол-во раз. Если таких элементов...

Найти число встречающееся в списке наибольшее количество раз
Напишите программу, которая находит в данном списке A число, которое встречается в списке...

Одномерные массивы. Найти число, встречающееся наибольшее количество раз
Задан массив целых чисел от -100 до 100. Найти число, встречающееся наибольшее количество раз

8
go
Эксперт С++
3645 / 1377 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
27.01.2012, 10:23 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Например. Создаете массив
C
1
2
3
4
5
6
7
8
typedef struct word {
    char *s;
    size_t count;
} word_t;
 
/* ... */
 
word_t arr[BUFSIZ]; // Можно также динамический
Дальше добавляете слова в этом массив, (если слова там уже присутствует, то увеличиваете счетчик). Идею думаю поняли.
Потом сортируете массив по полю count по убыванию.
Удачи!
0
0 / 0 / 0
Регистрация: 27.01.2012
Сообщений: 4
27.01.2012, 16:18  [ТС] 3
идея понятна а вот детали нет ) я новичек много чего не знаю.
берем новый массив и добавляем в него по порядку каждое слово из исходного массива, если в исходном массиве встретилось слово которое уже есть в новом массиве то его не добавляем а увеличиваем счетчик для этого слова.
а как это сделать ? счетчик для каждого слова.
0
1 / 1 / 2
Регистрация: 26.12.2009
Сообщений: 22
27.01.2012, 17:02 4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
include <string.h>
...
....
char *mas1=new char[100];
char * mas2=new char[50][100];//50 ячеек для слов, 100 знаков в слове
cin>>mas1;//вводите предложение, с несколькими повторяющимися словами(предложение до 100 символов)
int n=0;
for(int i=0;i<99;i++){
if(strcmp(mas1[i],' ')==0) {n++;i++;}//если встречается пробел, то следующее слово идет в новую ячейку
strcpy(mas2[n][i],mas1[i]);
}
for(int i=0;i<50;i++){
  for(int x=i+1;x<50;x++)
  if(strcmp(mas2[i],mas2[x])==0){cout<<mas2[i];}
я сам новичок, но идея такова.
к примеру вводим "быть или не быть" в мас1.
потом разбиваем на слова в двумерный массив:
=быть
=или
=не
=быть
и сравниваем каждый эл-т с каждым.
Не компилировал, но как новичку я думаю будет идея точно ясна

}
1
go
Эксперт С++
3645 / 1377 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
27.01.2012, 17:49 5
Цитата Сообщение от Shurachka Посмотреть сообщение
а как это сделать ? счетчик для каждого слова.
Мой пост точно весь прочитали?
Допустим, очередное слово из строки уже присутствует в массиве, и индекс элемента в массиве равен i. Тогда
C
1
++arr[i].count;
0
0 / 0 / 0
Регистрация: 27.01.2012
Сообщений: 4
27.01.2012, 18:38  [ТС] 6
Diskoman спасибо за подробный ответ =)

вот результаты моих раздумий со времени моего последнего поста.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <math.h>
int main()
 
{ 
char s1[50], s2[50], sp[50];      //s1 первоначальная строка, s2 строка куда будут вписываться слова, sp промежуточная строка.
int i,j;
printf ( "vvedite stroku \n" ); 
gets(s1);
i=0;  while ( i<strlen(s1);)  {                           // цикл перебора символов первоначальной строки.
        j=0; while (s1[i] != ' ' )                      //  сброс щетчика текущего элемента промежуточной строки;   пока не встретим пробел добавляем символ из первоначальной строки в промежуточную                     
                { sp[j]=s1[i]; i++; j++; }             // присваивание текущего символа первоначальной строки в промежуточную              
                   i++;                                        // после выхода со второго while увеличиваем щетчик символов первоначальной строки чтобы перескочить через пробел и в следующий раз вписывать в промежуточную строку с 1-й буквы следующего слова первоначальной строки
                   p=strstr(s2, sp);                      // проверяем есть ли в строке-результате слово которое только что записали в промежуточную строку, первый раз в s2 ничего нет                     
                   if ( p== NULL) { strcat (s2,sp); }    // если слово не найдено добавляем в строку-результат(s2) слово из промежуточной строки
                   else                                       // здесь повидимому должен будет быть щетчик и какие то условия пока незнаю =))
                                                                                }
puts ( s2 );
}
в любом случае ( чисто для себя) хотелось бы кое что выяснить по моему коду:

1.) p=strstr(s2, sp); в блоках описания переменных куда то засобачить это P нужно ?

2.) в строке j=0; while (s1[i] != ' ' ) перед началом цикла повидимому нужно както обнулить строку sp ато вдруг следующее слово будет короче чем sp а в sp уже есть символы и в конце слова останутся старые символы, как это сделать (обнулить строку sp) ?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11177 / 7110 / 1680
Регистрация: 25.07.2009
Сообщений: 13,003
27.01.2012, 19:19 7
Цитата Сообщение от go Посмотреть сообщение
Создаете массив...
Это не серьёзно!
(с)Моргунов ака Бывалый
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct WORDS_LIST_NODE {
    char * word;
    struct WORDS_LIST_NODE * next;
} wln_t;
 
wln_t * new_wlnode(const char * word){
    wln_t * node;
    
    if ( ! ( node = malloc(sizeof(wln_t)) ) )
        return NULL;
    
    if ( ! ( node->word = strdup(word) ) ){
        free(node);
        return NULL;
    }
    
    node->next = NULL;
    
    return node;
}
 
void del_wlnode(wln_t * node){
    free(node->word);
    free(node);
}
 
typedef struct WORDS_LIST {
    wln_t * first;
    wln_t * last;
} wl_t;
 
wl_t * new_wlist(void){
    wl_t * list;
    
    if ( ! ( list = malloc(sizeof(wl_t)) ) )
        return NULL;
    
    list->first = NULL;
    list->last = NULL;
    
    return list;
}
 
int wlist_push(wl_t * list, const char * word){
    wln_t * node;
    
    if ( ! ( node = new_wlnode(word) ) )
        return -1;
    
    if ( list->first == NULL )
        list->first = node;
    else 
        list->last->next = node;
    list->last = node;
    
    return 0;
}
 
void wlist_dump(const wl_t * list){
    const wln_t * node;
    
    for ( node = list->first; node != NULL; node = node->next )
        printf("%s\n", node->word);
 
}
 
void del_wlist(wl_t * list){
    while ( list->first != NULL ){
        list->last = list->first->next;
        del_wlnode(list->first);
        list->first = list->last;
    }
    free(list);
}
 
typedef struct WORDS_TREE_NODE {
    char * word;
    size_t count;
    struct WORDS_TREE_NODE * left;
    struct WORDS_TREE_NODE * right;
} wtn_t;
 
int wtree_add(wtn_t ** tree, const char * word){
    if ( ! *tree ){
        if ( ! ( *tree = malloc(sizeof(wtn_t)) ) )
            return -1;
        
        if ( ! ( (*tree)->word = strdup(word) ) ){
            free(*tree);
            return -1;
        }
        
        (*tree)->count = 1;
        (*tree)->left = NULL;
        (*tree)->right = NULL;
        return 0;
    }
    else {
        int cmp = strcmp((*tree)->word, word);
        if ( cmp > 0 )
            return wtree_add(&(*tree)->left, word);
        else if ( cmp < 0 )
            return wtree_add(&(*tree)->right, word);
        else {
            (*tree)->count += 1;
            return 0;
        }
    }
}
 
void wtree_clear(wtn_t ** tree){
    if ( *tree ){
        wtree_clear(&(*tree)->left);
        wtree_clear(&(*tree)->right);
        free((*tree)->word);
        free(*tree);
        *tree = NULL;
    }
}
 
typedef struct COUNT_TREE_NODE {
    size_t count;
    wl_t * words;
    struct COUNT_TREE_NODE * left;
    struct COUNT_TREE_NODE * right;
} ctn_t;
 
int ctree_add(ctn_t ** tree, const wtn_t * wn){
    if ( ! *tree ){
        if ( ! ( *tree = malloc(sizeof(ctn_t)) ) )
            return -1;
        if ( ! ( (*tree)->words = new_wlist() ) ){
            free(*tree);
            return -1;
        }
        (*tree)->count = wn->count;
        if ( wlist_push((*tree)->words, wn->word) ){
            del_wlist((*tree)->words);
            free(*tree);
            return -1;
        }
        (*tree)->left = NULL;
        (*tree)->right = NULL;
        
        return 0;
    }
    else if ( (*tree)->count > wn->count )
        return ctree_add(&(*tree)->left, wn);
    else if ( (*tree)->count < wn->count )
        return ctree_add(&(*tree)->right, wn);
    else
        return wlist_push((*tree)->words, wn->word);
}
 
void ctree_clear(ctn_t ** tree){
    if ( *tree ){
        ctree_clear(&(*tree)->left);
        ctree_clear(&(*tree)->right);
        del_wlist((*tree)->words);
        free(*tree);
        *tree = NULL;
    }
}
 
int words_to_counters(const wtn_t * words, ctn_t ** counters){
    if ( words->left )
        if ( words_to_counters(words->left, counters) )
            return -1;
    if ( words->right )
        if ( words_to_counters(words->right, counters) )
            return -1;
    return ctree_add(counters, words);
}
 
#define DELIM " \t\n"
    
int main(void){
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' ){
        wtn_t * wordsTree = NULL;
        ctn_t * countsTree = NULL;
        char * pWord;
        
        for ( pWord = strtok(buf, DELIM); pWord != NULL; pWord = strtok(NULL, DELIM) ){
            if ( wtree_add(&wordsTree, pWord) ){
                fprintf(stderr, "Error while adding word to tree!\n");
                exit(1);
            }
        }
        if ( ! wordsTree ){
            fprintf(stderr, "Can't find any words in input string!\n");
            continue;
        }
        
        if ( words_to_counters(wordsTree, &countsTree) || ! countsTree ){
            fprintf(stderr, "Error while copy words to counters!\n");
            exit(1);
        }
        
        if ( countsTree->left == NULL && countsTree->right == NULL )
            printf("All words meets same times, nothing to out.\n");
        
        else {
            ctn_t * cnode = countsTree;
            while ( cnode->right )
                cnode = cnode->right;
            printf("Words, each meets %d times:\n", cnode->count);
            wlist_dump(cnode->words);
        }
        
        wtree_clear(&wordsTree);
        ctree_clear(&countsTree);
    }
    
    exit(0);
}
О, как!
0
0 / 0 / 0
Регистрация: 27.01.2012
Сообщений: 4
27.01.2012, 23:00  [ТС] 8
коды писать не нужно можно словами. допустим мы преобразовали первоначальную строку в матрицу.
быть
или
не
быть
что делаем дальше ? делаем матрицу с повторяющимися словами и потом что то делаем с ней? или считать повторения слов нужно во время создания матрицы и в матрице нет повторяющихся слов.

Добавлено через 56 секунд

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
#include <stdio.h>
#include <string.h>
 
int ONum(char* Sentence, char* Word);
 
int main(void)
{
   char InputString[80];
   char ArrayOfWords[40][80];
   
   printf("%s",InputString);
   int i = 0, j = 0;
   while(InputString[i] != '\0' && InputString[i] != '\n')
   {
      int k = 0;
      While(InputString[i] != ' ')
      {
         ArrayOfWords[j][k] = InputString[i];
         i++;
         k++; 
      }
      j++;
      i++;
      
   }
   
   int mas[j] = {0};
   for(int a = 0; a < j; a++)
   {
      mas[a] = Onum(InputString, ArrayOfWords[a]);
   }
   
   int AllEqualFlag = 1;
   int max = 0;
   for(i = 0; i < j; i++)
   {
      if((mas[i] != mas[max]) && AllEqualFlag) AllEqualFlag = 0;
      if(mas[i] > mas[max]) max = i;
   }
   
   if( !AllEgualFlag ) 
   {
      for(i = 0; i < j; i++)
          if(mas[i] == mas[max]) printf("%s",ArrayOfWords[i]);
   }
   getch();   
}
 
int Onum(char* Sentense, char* Word)
{
    char temp[80];
    int  num = 0;
    while((*Sentence != '\0') && (*Sentence != '\n'))
    {
        int i = 0;
        while(*Sentence++ != ' ')
          temp[i++] = *Sentence;
        temp[i] = '\0';
        if( strcmp(temp,word) == 0) num++;
        Sentence++;
    }
    return num;
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11177 / 7110 / 1680
Регистрация: 25.07.2009
Сообщений: 13,003
27.01.2012, 23:25 9
Цитата Сообщение от Shurachka Посмотреть сообщение
printf("%s",InputString);
Строка ничем не инициализирована, что по-вашему на экран выведется?
Читаются строки функцией scanf() или fgets(), а с помощью printf() они выводятся.
Цитата Сообщение от Shurachka Посмотреть сообщение
while(InputString[i] != '\0' && InputString[i] != '\n')
Тут кавычка была пропущена после \n, я поправил, чтобы глаза не резало...
Цитата Сообщение от Shurachka Посмотреть сообщение
int ONum(char* Sentence, char* Word);
Дальше в программе оно же Onum зовётся. Язык С чувствителен к регистру, буковки везде одинаковые должны быть. Да и вообще как-то странно у Вас всё происходит...
Если интересно, могу в двух словах описать суть моей пограмки (она кстати компилируется и работает, я проверял). Создаются два дерева. Узлы первого содержат слова в качестве ключей и их количество. Второе - наоборот - количество одинаковых слов в качестве ключей и список слов, встретившихся в таком количестве в тексте. За тем проверяем, что в дереве больше одного узла (иначе всех слов было бы поровну), находим крайний правый узел и выводим его список слов...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2012, 23:25
Помогаю со студенческими работами здесь

Удалить 2 раза в строке слово, встречающееся более трех раз
Удалить 2 раза в строке без знаков препинания слово, встречающееся более трех раз. Строка вводится...

Удалить 2 раза в строке слово, встречающееся более трех раз
Удалить 2 раза в строке слово, встречающееся более трех раз up!!!!!

Определить, какой из символов в строке встречается наибольшее количество раз
Задана строка символов. Определить, какой из символов встречается наибольшее количество раз.

Определить, какая буква кириллицы встречается в строке наибольшее количество раз
Дана последовательность символов (строка). Определить, какая буква кириллицы встречается в строке...

Какое слово в массиве встречается наибольшее количество раз
есть ли какой нибудь шаблон чтобы найти повторяющееся число в массиве больше чем остальные

Наибольшее число N в массиве, встречающееся столько же N раз
Дан массив чисел. Нужно написать функцию , которая ищет наибольшее N число в массиве, встречающееся...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru