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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Стас45rus
1 / 1 / 0
Регистрация: 12.04.2010
Сообщений: 121
28.08.2012, 15:25     Определить, сколько раз слово встречается в предложении #1
исправьте пожалуйста.
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2012, 15:25     Определить, сколько раз слово встречается в предложении
Посмотрите здесь:

C++ Определить сколько раз в строке встречается заданное слово
Определить сколько раз данное слово встречается в тексте C++
C++ Сколько раз слово встречается в предложении
C++ Определить, сколько раз встретилось в предложении введенное с клавиатуры слово
C++ Задано предложение y. Проверить, сколько раз встречается данное слово х в предложении у.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
denys_l
51 / 51 / 4
Регистрация: 26.09.2011
Сообщений: 186
28.08.2012, 16:29     Определить, сколько раз слово встречается в предложении #2
не то...
Стас45rus
1 / 1 / 0
Регистрация: 12.04.2010
Сообщений: 121
28.08.2012, 16:42  [ТС]     Определить, сколько раз слово встречается в предложении #3
что не то?
denys_l
51 / 51 / 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);
дает нам адрес первого элемента первого слова + длину первого слова... Мы постоянно присваиваем одно и тоже и ничего не увеличиваем
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
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;
}
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 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;
}
denys_l
51 / 51 / 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;
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
28.08.2012, 17:18     Определить, сколько раз слово встречается в предложении #8
0. разбивать нужно не по этим делимитерам. нужно проверять, буква ли. или что будет если очередной символ 0x03, например?
1. раз уже темплейты заиспользовал, пропэрси всю строчку и разбери на слова, который запомни в string, а их, в свою очередь, в контейнер (vector например).
тогда остальное напишешь сразу как надо, и все будет понятно откуда и куда.
alexey31415
 Аватар для 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;
 
}
Миниатюры
Определить, сколько раз слово встречается в предложении  
alexey31415
28.08.2012, 17:23
  #10

Не по теме:

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

Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 18:00     Определить, сколько раз слово встречается в предложении
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 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/72450a...5e6f1772373a8c
Yandex
Объявления
28.08.2012, 18:00     Определить, сколько раз слово встречается в предложении
Ответ Создать тему
Опции темы

Текущее время: 16:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru