С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Стас45rus
1 / 1 / 0
Регистрация: 12.04.2010
Сообщений: 121
#1

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

28.08.2012, 15:25. Просмотров 1686. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить, сколько раз слово встречается в предложении (C++):

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

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

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

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

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

Определить, сколько раз встречается одно слово в другом - C++
может кто нибудь сталкивался, когда нужно найти количество раз, когда одно сочетание букв (например, &quot;ха&quot;) встречается в другом сочетании...

11
denys_l
52 / 52 / 4
Регистрация: 26.09.2011
Сообщений: 186
28.08.2012, 16:29 #2
не то...
0
Стас45rus
1 / 1 / 0
Регистрация: 12.04.2010
Сообщений: 121
28.08.2012, 16:42  [ТС] #3
что не то?
0
denys_l
52 / 52 / 4
Регистрация: 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 / 38
Регистрация: 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 / 4
Регистрация: 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 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.08.2012, 17:18 #8
0. разбивать нужно не по этим делимитерам. нужно проверять, буква ли. или что будет если очередной символ 0x03, например?
1. раз уже темплейты заиспользовал, пропэрси всю строчку и разбери на слова, который запомни в string, а их, в свою очередь, в контейнер (vector например).
тогда остальное напишешь сразу как надо, и все будет понятно откуда и куда.
0
alexey31415
59 / 59 / 3
Регистрация: 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 / 38
Регистрация: 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
Эксперт С++
334 / 298 / 14
Регистрация: 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
Привет! Вот еще темы с ответами:

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

Определить сколько раз в строке встречается заданное слово - C++
Помогите пожалуйста в строках вообще ничего непонимаю! Задача:1 Определить сколько раз в строке встречается заданное слово. Задача:2 ...

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

Определить сколько раз встречается в тексте первое его слово - C++
Определить сколько раз встречается первое слово текста в тексте Вот код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...


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

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

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