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

Функция подсчитывает количество слов в строке. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.71
Irissha
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 17
04.01.2012, 00:52     Функция подсчитывает количество слов в строке. #1
Разработать функцию, которая выполняет ту обработку фрагмента текста, которая определена в Вашем индивидуальном задании. При реализации функции запрещается пользоваться функциями библиотек языка C.
условие:
Функция подсчитывает количество слов в строке.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2012, 00:52     Функция подсчитывает количество слов в строке.
Посмотрите здесь:

C++ написать программу, которая подсчитывает количество гласных и согласных букв в заданной символьной строке
функцию, которая подсчитывает максимальное количество символов, идущих подряд в строке C++
C++ Программа, которая копирует содержимое входного файла в выходной; подсчитывает количество слов в тексте...
C++ Функция, получает строку слов и рзделителей, а на выходе имеет массив слов из строки и количество этих слов
Функция в строке должна вычислять количество слов (слова разделяются пробелом) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
04.01.2012, 01:06     Функция подсчитывает количество слов в строке. #2
Посчитай количество символов, являющихся буквами, после символов таковыми не являющихся. +нужно учесть возможное наличие слова в начале строки. Профит...
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.01.2012, 03:35     Функция подсчитывает количество слов в строке. #3
Цитата Сообщение от NoMasters Посмотреть сообщение
Посчитай количество символов, являющихся буквами, после символов таковыми не являющихся.
О, мсье любит извращения
Достаточно ведь просто посчитать количество пробелов и всё (не забывая проверять что если текущий символ пробел и предыдущий символ пробел то нужно сдвинуться, но счётчик не инкрементировать), ведь в строке число 35325 тоже можно считать словом.
Ну или в виде кода
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
    char *string="some string!, dsf    ";
    int count=0;
    string++;
    while(*string)
    {
        if (isspace(*string) && !isspace(*(string-1)))
         count++;
         string++;
    }
    printf("%d",count);
}
функцию isspace я думаю Irissha как-то уж без меня напишет.

Добавлено через 2 минуты
Хотя учитывая что она сюда обратилась ... в общем
C
1
int isspace(int x){return x==32;}
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
04.01.2012, 03:38     Функция подсчитывает количество слов в строке. #4
Таки пробел не единственный символ, который может разделять слова. К тому у тебя не учитывается первое(или последние, по вкусу) слово

Добавлено через 1 минуту
Почему бы не написать
C
1
*string == ' '
?
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.01.2012, 03:57     Функция подсчитывает количество слов в строке. #5
Цитата Сообщение от NoMasters Посмотреть сообщение
Таки пробел не единственный символ, который может разделять слова.
Таки за "янаписалпрограммунас++,посмотритепожалуйста" по рукам бить надо так что разделитель слов это пробел, ну а лишний пробел это ещё ладно и правда можно учесть так как выглядит нормально в отличии от слитнонаписанныхслов.

Цитата Сообщение от NoMasters Посмотреть сообщение
К тому у тебя не учитывается первое(или последние, по вкусу) слово
Угу, забыл проверить ещё что в конце слово перед 0. В общем как-то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    char *string="   sf dfd   ";
    int count=0;
    if(*string)
    {
        if(!isspace(string[strlen(string+1)]))
         count++;
 
        string++;
        while(*string)
        {
            if (isspace(*string) && !isspace(*(string-1)))
            count++;
            string++;
        }
 
    }
    printf("%d",count);
}
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
04.01.2012, 04:12     Функция подсчитывает количество слов в строке. #6
Цитата Сообщение от Gepar Посмотреть сообщение
Таки за "янаписалпрограммунас++,посмотритепожалуйста" по рукам бить надо так что разделитель слов это пробел, ну а лишний пробел это ещё ладно и правда можно учесть так как выглядит нормально в отличии от слитнонаписанныхслов.
Не распарсил толком, но есть как минимум переносы строк и табуляции. Знаки препинания тоже вполне себе разделители слов. Впрочем, в данном конкретном случае, скорее всего, действительно имелись в виду только пробелы.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.01.2012, 04:33     Функция подсчитывает количество слов в строке. #7
Цитата Сообщение от NoMasters Посмотреть сообщение
Не распарсил толком, но есть как минимум переносы строк и табуляции. Знаки препинания тоже вполне себе разделители слов. Впрочем, в данном конкретном случае, скорее всего, действительно имелись в виду только пробелы.
Ну всё это по желанию автор темы пускай дописывает в 13ую строку, при этом не забывая модифицировать 7ую.
Пример с добавленным условием на знаки пунктуации (чтобы "слово,слово" было = 2 слова"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    char *string="   sf.dfd   ,";
    int count=0;
    if(*string)
    {
        if(!(isspace(string[strlen(string+1)]) || ispunct(string[strlen(string+1)])))
         count++;
 
        string++;
        while(*string)
        {
            if ((isspace(*string) || ispunct(*string)) && !(isspace(*(string-1)) || ispunct(*(string-1))))
            count++;
            string++;
        }
 
    }
    printf("%d",count);
}
Хотя условия начинают выглядить страшно и напрашивается добавление функций чтобы убрать столь длинные условия ...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.01.2012, 05:31     Функция подсчитывает количество слов в строке. #8
Цитата Сообщение от Irissha Посмотреть сообщение
При реализации функции запрещается пользоваться функциями библиотек языка C.
Если эту строчку не заметить, то можно так как-нибудь:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>
 
#define DELIM " \t\n,.:;!?-"
 
int wc(char * s, const char * d){
    return ( strtok(s, d) ) ? 1 + wc(NULL, d) : 0;
}
 
int main(void){
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
        printf("%d words.\n", wc(buf, DELIM));
    
    return 0;
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.01.2012, 11:52     Функция подсчитывает количество слов в строке. #9
Цитата Сообщение от easybudda Посмотреть сообщение
Если эту строчку не заметить, то можно так как-нибудь:
В этом весь смысл задания. Такие задания очень полезны.
Осталось strtok реализовать самому.

easybudda, а Вам не кажется, что смысл этого задания, что самому strtok () реализовать?

Добавлено через 59 минут
Вот, как я бы реализовал strtok
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
#include <stdio.h>
 
char* strtok (const char *s, const char *DELIM)
{
   static char *start, *end, *last;
   char *p;
   short f;
   
   if ( s )
   {
      start = s;
      for ( end = start ; *end ; ++end ) ;
   }
   else
   {
      start = last;
      *start = *DELIM;
   }
   
   while ( start != end )
   {
      for ( p = DELIM, f = 0 ; *p && !f ; ++p  )
         if ( *start == *p )
            f = 1;
      if ( !f ) 
         break;
      else
         ++start;         
   }
   
   for ( last = start ; last != end ; ++last )
   {
      for ( p = DELIM, f = 0 ; *p && !f ; ++p )
         if ( *last == *p )
            f = 1;
      if ( f ) 
         break;
   }
   
   if ( last == start )
      return NULL;
   else   
   {
      *last = '\0';
      return start;
   }
}      
 
#define DELIM " \t\n,." 
 
int main ()
{
   char s[] = " Hello,world  Hello world  OK";
   char *p = strtok ( s, DELIM );
   while ( p )
   {
      printf ("%s\n", p );
      p = strtok ( NULL, DELIM );
   }
   
   return 0;
}
http://liveworkspace.org/code/74bcc2...2fe338ef764ce2

Добавлено через 14 минут
Цитата Сообщение от Gepar Посмотреть сообщение
Хотя учитывая что она сюда обратилась ... в общем
А сам правильно можете реализовать? isspace это не только пробел
isspace
' ' (0x20) space (SPC)
'\t' (0x09) horizontal tab (TAB)
'\n' (0x0a) newline (LF)
'\v' (0x0b) vertical tab (VT)
'\f' (0x0c) feed (FF)
'\r' (0x0d) carriage return (CR)


http://www.cplusplus.com/reference/c...ctype/isspace/
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.01.2012, 13:05     Функция подсчитывает количество слов в строке. #10
Цитата Сообщение от go Посмотреть сообщение
easybudda, а Вам не кажется, что смысл этого задания, что самому strtok () реализовать?
Нет. Скорее всего нужен вот такой велосипед
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
#include <stdio.h>
 
int wc(const char * s, const char * d){
    int cnt = 0, in_word = 0;
    
    while ( *s ){
        const char * p = d;
        
        while ( *p != '\0' && *p != *s )
            ++p;
        
        if ( *p != '\0' ){
            if ( in_word ){
                ++cnt;
                in_word = 0;
            }
        }
        else
            in_word = 1;
        
        ++s;
    }
    
    if ( in_word )
        ++cnt;
    
    return cnt;
}
 
#define DELIM " \t\n,.:;!?-"
 
int main(void){
    char buf[BUFSIZ];
    
    while ( printf("String: ") && fgets(buf, BUFSIZ, stdin) && *buf != '\n' )
        printf("%d words.\n", wc(buf, DELIM));
        
    return 0;
}
Irissha
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 17
04.01.2012, 16:52  [ТС]     Функция подсчитывает количество слов в строке. #11
всем огромное спасибо.... очень помогли...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2012, 17:12     Функция подсчитывает количество слов в строке.
Еще ссылки по теме:

C++ Составить программу, которая подсчитывает количество слов
C++ Описать рекурсивную функцию letter(s), которая подсчитывает количество букв в строке s

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

Или воспользуйтесь поиском по форуму:
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.01.2012, 17:12     Функция подсчитывает количество слов в строке. #12
Цитата Сообщение от go Посмотреть сообщение
А сам правильно можете реализовать? isspace это не только пробел
Не подумал я об этом что-то, наверное потому что рассчитывал на обычную короткую строку, а не на чтения текста с файла, а в обычно строке редко всякие табуляции попадаются, разве что специально их туда записать.
Yandex
Объявления
04.01.2012, 17:12     Функция подсчитывает количество слов в строке.
Ответ Создать тему
Опции темы

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