1 / 1 / 2
Регистрация: 12.04.2010
Сообщений: 121
1

Определить, сколько раз слово встречается в предложении

28.08.2012, 15:25. Показов 2825. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
исправьте пожалуйста.
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 <stdio.h>
using namespace std;
 
int main()
{
    const int max=256;
    char str[max], word[50], *p, *pstr(nullptr), *pword(nullptr);
    pstr=str;
    pword=word;
    int i=0, count=0;
 
    cin.getline(str,max,'\n');  //ввод предложения.
 
    while (*pstr!=32)           //запомнить 1-е слово в массив word.
    {
        *pword=*pstr;
        pstr++;
        pword++;
    }
    *pword='\0';                //вставить символ конца строки.
    count++;                    //увеличить счётчик на 1.
 
        //вот отсюда начинается проблема.ничего не выводит.
    while (pstr<&str[max])      //поиск, сколько раз встречается слово в предложении.
    {
        p=strstr(str,word);
        if (p)
        {
            pstr=p+strlen(word);
            count++;
        }
        else
        {
            cout << "Error";
            break;
        }
    }
    
    cout << count << endl;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2012, 15:25
Ответы с готовыми решениями:

Определить,сколько раз в предложении встречается заданное слово
Здравствуйте. Помоги пожалуйста написать программы на си++. 1)Определить,сколько раз в предложении...

Определить, сколько раз встречается заданное слово в предложении
надо найти сколько раз встречается данное слово в предложении))) спасибо!!

Сколько раз слово встречается в предложении
Здравствуйте уважаемые программисты. Помогите решить задачу или хотя бы намётки дайте. &quot;Для...

Задано предложение y. Проверить, сколько раз встречается данное слово х в предложении у.
Задано предложение y. Проверить, сколько раз встречается данное слово х в предложении у. помогите...

11
54 / 54 / 10
Регистрация: 26.09.2011
Сообщений: 186
28.08.2012, 16:29 2
не то...
0
1 / 1 / 2
Регистрация: 12.04.2010
Сообщений: 121
28.08.2012, 16:42  [ТС] 3
что не то?
0
54 / 54 / 10
Регистрация: 26.09.2011
Сообщений: 186
28.08.2012, 17:02 4
да ниче.. сообщение свое удалил

Добавлено через 15 минут
Смотри
C++
1
2
3
4
5
6
7
while (*pstr!=32)           //запомнить 1-е слово в массив word.
    {
        *pword=*pstr;
        pstr++;
        pword++;
 
    }
А если предложение содержит всего одно слово, то куда мы уйдем? Будем искать пробел дальше?
Да и здесь ерунда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 while (pstr<&str[max])      //поиск, сколько раз встречается слово в предложении.
    {
        p=strstr(str,word);
        if (p)
        {
            pstr=p+strlen(word);
            count++;
        }
        else
        {
            cout << "Error";
            break;
        }
    }
Мы ищем постоянно ищем одно и тоже слово в одном и том же предложении. В итоге у нас зацикливается цикл (как-то так)...
Вот эта запись
C++
1
pstr=p+strlen(word);
дает нам адрес первого элемента первого слова + длину первого слова... Мы постоянно присваиваем одно и тоже и ничего не увеличиваем
0
Заблокирован
28.08.2012, 17:03 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

регистр символов игнорируется
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
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
 
static void set_mem( void* s, int c, size_t n, int line ) {
    if (( memset( s, c, n )) != s) {
        fprintf( stderr, "ERROR LINE %d: %s\n", line, strerror(errno) );
        exit(EXIT_FAILURE);
    }
}
 
static void move_mem( void* dest, const void* src, size_t n, int line ) {
    if ( (memmove(dest, src, n)) != dest ) {
        fprintf( stderr, "ERROR LINE %d: %s\n", line, strerror(errno) );
        exit(EXIT_FAILURE);
    }
}
 
static void set_low( char* s ) {
    while ( *s ) {
        *s = isalpha(*s) ? tolower( *s ) : *s;
        ++s;
    }
}
 
int cnt_wrd(const char* src, const char* wrd) {
    size_t src_len = strlen(src);
    size_t wrd_len = strlen(wrd);
    int cnt = 0;
    char src_buf[ BUFSIZ ];
    char wrd_buf[ BUFSIZ ];
    char *p = src_buf - 1;
 
    set_mem( src_buf, 0, BUFSIZ, __LINE__ );
    set_mem( wrd_buf, 0, BUFSIZ, __LINE__ );
    move_mem( src_buf, src, src_len, __LINE__);
    move_mem( wrd_buf, wrd, wrd_len, __LINE__);
    set_low( src_buf );
    set_low( wrd_buf );
 
    while ( (p = strstr(p + 1, wrd_buf)) )
        ++cnt;
 
    return cnt;
}
 
int main() {
    
    char* str = "babaBABABabAba";
    fprintf(stdout, "%d\n", cnt_wrd( str, "baBA" ) );
 
    return 0;
}
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
28.08.2012, 17:07 6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <iostream>
#include <set>
 
using namespace std;
 
int main() {
    string s = "", word = "";
    char c;
    set<char> delim;
    {
        char d[ ] = "`~!@#$%^&*()-_=+[{]};:'\"\\|,<.>/? \t\n";
        delim = set<char>(d, d + sizeof d);
    }
    while (delim.find(c = cin.get()) == delim.end())
        word += c;
    unsigned count = 1;
    if (c != '\n')
        do
            if (delim.find(c = cin.get()) == delim.end())
                s += c;
            else {
                if (s == word)
                    count++;
                s = "";
            }
        while (c != '\n');
    cout << count;
}
0
54 / 54 / 10
Регистрация: 26.09.2011
Сообщений: 186
28.08.2012, 17:08 7
Вот так более-менее рабочий вариант
убираем count++;
Мы первое слово найдем потом
До цикла проверяем вхождение этого слова в строке, оно у нас есть потому count = 1;
дальше увеличиваем pstr; пока не війдет ERROR
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
....*pword='\0';                //вставить символ конца строки.
                       //увеличить счётчик на 1.
 
        //вот отсюда начинается проблема.ничего не выводит.
    p=strstr(str,word);
    while (pstr<&str[max])      //поиск, сколько раз встречается слово в предложении.
    {
                if (p)
        {
            pstr=p+strlen(word);
            count++;
            
        }
        else
        {
            cout << "Error";
            break;
        }
        p=strstr(pstr,word);
    }
 
    cout << count << endl;
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.08.2012, 17:18 8
0. разбивать нужно не по этим делимитерам. нужно проверять, буква ли. или что будет если очередной символ 0x03, например?
1. раз уже темплейты заиспользовал, пропэрси всю строчку и разбери на слова, который запомни в string, а их, в свою очередь, в контейнер (vector например).
тогда остальное напишешь сразу как надо, и все будет понятно откуда и куда.
0
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
28.08.2012, 17:22 9
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
#include<iostream>
#include<cstring>
 
using namespace std;
 
//размер буфера для строки
#define MAX_SIZE    256
 
int main()
{
setlocale(0,"");
 
char parsed_string[MAX_SIZE],//исследуемая строка
tempString[MAX_SIZE],//буффер для ввода данных
word[MAX_SIZE];//буфер для первого слова
char *tokenPtr;
 
size_t repeat = 0;//кол-во повторений слова
size_t count_of_words = 0;//кол-во слов в строке
 
cin.getline(tempString,MAX_SIZE);
 
strcpy(parsed_string,tempString);//копируем строку,так как
//ф-ия strtok модифицирует строку,которая передаётся ей
 
tokenPtr = strtok(tempString," ");//получаем указатель на первое слово,разделённое пробелом
 
strcpy(word,tokenPtr);
 
while(tokenPtr != NULL)
{
tokenPtr = strtok(NULL," ");//продолжаем разбивать строку на слова
//ограниченные пробелом
count_of_words++;
}
 
//если введено лишь одно слово ,то и считать нечего
if(count_of_words == 1)
{
cout << "В введённой строке лишь одно слово!" << endl;
system("pause");
return 0;
}
 
repeat++;//увеличиваем кол-во повторений слова
//чтобы при нахождении слова в строке иметь
//действительное кол-во повторений искомого слова
 
tokenPtr = strtok(parsed_string," ");
 
char ** words= new char*[count_of_words--];
 
size_t i = 0;
 
//копируем все слова,начиная со второго
while(tokenPtr != NULL)
{
tokenPtr = strtok(NULL," ");
words[i++] = tokenPtr;
}
 
//сравниваем искомое слово со всеми остальными
for(i = 0;i < count_of_words;i++)
if(strcmp(word,words[i]) == 0)
repeat++;
 
if(repeat != 1)
cout << "Первое слово: " << word
<< " встречается " << repeat << " раз!" << endl;
else
cout << "Ничего не найдено!" << endl;
 
 
system("pause");
return 0;
 
}
Миниатюры
Определить, сколько раз слово встречается в предложении  
0
alexey31415
28.08.2012, 17:23
  #10

Не по теме:

блин,пока писал свой вариант,уже кучу других написали

0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
28.08.2012, 17:34 11
0. Да, действительно.
1. В задании ничего не сказано про дальнейшую работу со строкой, так зачем тратить память на ее запоминание целиком?

Добавлено через 9 минут
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
#include <iostream>
 
using namespace std;
 
inline bool IsAlpha(char c) {
    return c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z';
}
 
int main() {
    string s = "", word = "";
    char c;
    while (IsAlpha(c = cin.get()))
        word += c;
    unsigned count = 1;
    while (c != '\n')
        if (IsAlpha(c = cin.get()))
            s += c;
        else {
            if (s == word)
                count++;
            s = "";
        }
    cout << count;
}
0
Эксперт С++
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
28.08.2012, 18:00 12
Забавы ради Сильно не тестил, уж не обессудьте..

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
#include <iostream>
 
#include <boost/mpl/string.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp> 
#include <boost/mpl/if.hpp>
#include <boost/mpl/equal_to.hpp>
#include <boost/mpl/not_equal_to.hpp>
#include <boost/mpl/push_back.hpp>
#include <boost/mpl/clear.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/count.hpp>
 
namespace mpl = boost::mpl;
 
template <
   typename Character,
   typename Word,
   typename Cond
>
struct AddToWord {
   typedef typename
      mpl::if_ <
         Cond,
         Word,
         typename mpl::push_back <
            Word,
            mpl::char_ <
               Character::value
            >
         >::type
      >::type type;
};
 
template <
   typename Word,
   typename Cond
>
struct ClearWord {
   typedef typename
      mpl::if_ <
         Cond,
         typename mpl::clear <Word>::type,
         Word
      >::type type;
};
 
template <
   typename Word,
   typename Seq,
   typename Cond
>
struct AddToSeq {
   typedef typename
      mpl::if_ <
         Cond,
         typename mpl::push_back <
            Seq,
            Word
         >::type,
         Seq
      >::type type;
};
 
template <typename Character>
struct IsSpace {
   typedef typename
      mpl::equal_to <
         mpl::char_ <Character::value>,
         mpl::char_ <' '>
      >::type type;
};
 
template <
   typename Word,
   typename Vec,
   typename Seq,
   int I,
   int N
>
struct Split {
   typedef typename
      mpl::at_c <Seq, I>::type Character;
 
   typedef typename
      AddToWord <
         Character,
         Word,
         typename IsSpace <Character>::type
      >::type word;
      
   typedef typename
      Split <
         typename ClearWord <
            word,
            typename IsSpace <Character>::type
         >::type,
         typename AddToSeq <
            word,
            Vec,
            typename IsSpace <Character>::type
         >::type,
         Seq,
         I + 1,
         N
      >::type type;
};
 
template <
   typename Word,
   typename Vec,
   typename Seq,
   int N
>
struct Split <Word, Vec, Seq, N, N> {
   typedef typename
      mpl::if_ <
         typename mpl::not_equal_to <
            typename mpl::at_c <Seq, N - 1>::type,
            mpl::char_ <' '>
         >,
         typename mpl::push_back <
            Vec,
            Word
         >::type,
         Vec    
      >::type type;
};
 
template <typename Seq>
struct SplitSeq {
   typedef typename
      Split <
         mpl::string <>,
         mpl::vector <>,
         Seq,
         0,
         mpl::size <Seq>::value
      >::type v_words;   
};
 
 
int main() {
   std::cout <<
      mpl::count <
         SplitSeq <
            mpl::string <'red ', 'bad ', 'cat ', 'bad ', 'cold', ' red', ' bad'>
         >::v_words,
         mpl::string <'bad'>
      >::type::value << std::endl;
}
http://liveworkspace.org/code/... 1772373a8c
2
28.08.2012, 18:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2012, 18:00
Помогаю со студенческими работами здесь

Определить сколько раз в заданном предложении встречается сочетание двух первых букв
Нужно определить сколько раз в заданном предложении встречается сочетание двух первых букв.

Определить сколько раз заданное слово повторяется в предложении
Ввести любое предложение и определить, сколько раз повторяется в нем заданное слово.

Определить сколько раз в предложении встретилось заданное слово
Ребят, нужна помощь, кто может написать. Задача такая: Написать программу, которая считывает...

Определить сколько раз слово встречается в строке
Ввести строку и слово. Определить сколько раз слово встречается в строке.


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

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

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