Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
1 / 1 / 2
Регистрация: 12.04.2010
Сообщений: 121

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

28.08.2012, 15:25. Показов 3099. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.08.2012, 15:25
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 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
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
28.08.2012, 17:03
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

регистр символов игнорируется
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
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
Вот так более-менее рабочий вариант
убираем 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
0. разбивать нужно не по этим делимитерам. нужно проверять, буква ли. или что будет если очередной символ 0x03, например?
1. раз уже темплейты заиспользовал, пропэрси всю строчку и разбери на слова, который запомни в string, а их, в свою очередь, в контейнер (vector например).
тогда остальное напишешь сразу как надо, и все будет понятно откуда и куда.
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
28.08.2012, 17:22
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
28.08.2012, 17:23

Не по теме:

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

0
 Аватар для Кот Ангенс
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
28.08.2012, 17:34
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
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
28.08.2012, 18:00
Забавы ради Сильно не тестил, уж не обессудьте..

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.08.2012, 18:00
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru