Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/10: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Стас45rus
1 / 1 / 2
Регистрация: 12.04.2010
Сообщений: 121
1

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

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

исправьте пожалуйста.
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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2012, 15:25
Ответы с готовыми решениями:

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

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

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

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

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

11
denys_l
52 / 52 / 10
Регистрация: 26.09.2011
Сообщений: 186
28.08.2012, 16:29 2
не то...
0
Стас45rus
1 / 1 / 2
Регистрация: 12.04.2010
Сообщений: 121
28.08.2012, 16:42  [ТС] 3
что не то?
0
denys_l
52 / 52 / 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
alkagolik
Заблокирован
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
Кот Ангенс
318 / 268 / 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
denys_l
52 / 52 / 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
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.08.2012, 17:18 8
0. разбивать нужно не по этим делимитерам. нужно проверять, буква ли. или что будет если очередной символ 0x03, например?
1. раз уже темплейты заиспользовал, пропэрси всю строчку и разбери на слова, который запомни в string, а их, в свою очередь, в контейнер (vector например).
тогда остальное напишешь сразу как надо, и все будет понятно откуда и куда.
0
alexey31415
59 / 59 / 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
Кот Ангенс
318 / 268 / 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
nameless
Эксперт С++
339 / 303 / 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/72450a2894520775a95e6f1772373a8c
2
28.08.2012, 18:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 18:00

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

Определить, сколько раз встретилось в предложении введенное с клавиатуры слово
Написать программу, которая считывает текст(text.txt) из файла и выводит его на...

Определить сколько раз данное слово встречается в тексте
У меня небольшая просьба 1)обьясните зачем нужен #define...


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

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

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