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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.71
Irissha
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 17
#1

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

04.01.2012, 00:52. Просмотров 2898. Ответов 11
Метки нет (Все метки)

Разработать функцию, которая выполняет ту обработку фрагмента текста, которая определена в Вашем индивидуальном задании. При реализации функции запрещается пользоваться функциями библиотек языка C.
условие:
Функция подсчитывает количество слов в строке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2012, 00:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция подсчитывает количество слов в строке. (C++):

Напишите программу, которая подсчитывает количество слов в строке - C++
Напишите программу, которая подсчитывает количество слов в строке.*

Функция в строке должна вычислять количество слов (слова разделяются пробелом) - C++
int sum (const char *pS ) { const char *p (pS); int n (0); while ( *p ) { if ( isspace (*p)) ++n; p++; } ...

Составить программу, которая подсчитывает количество слов - C++
Пожалуйста помогите! C клавиатуры вводится строка. Составить программу, которая подсчитывает количество слов, которые имеют нечетное...

Функция, получает строку слов и рзделителей, а на выходе имеет массив слов из строки и количество этих слов - C++
мне нужна функция, которая во входе получает строку слов и рзделителей (" ", ",", ".", "_", """), а на выходе имеет массив слов из строки...

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

Описать рекурсивную функцию letter(s), которая подсчитывает количество букв в строке s - C++
Описать рекурсивную функцию letter(s), которая подсчитывает количество букв в строке s. Преподаватель сказал, что внутри должно быть...

11
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
04.01.2012, 01:06 #2
Посчитай количество символов, являющихся буквами, после символов таковыми не являющихся. +нужно учесть возможное наличие слова в начале строки. Профит...
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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;}
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
04.01.2012, 03:38 #4
Таки пробел не единственный символ, который может разделять слова. К тому у тебя не учитывается первое(или последние, по вкусу) слово

Добавлено через 1 минуту
Почему бы не написать
C
1
*string == ' '
?
1
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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);
}
0
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
04.01.2012, 04:12 #6
Цитата Сообщение от Gepar Посмотреть сообщение
Таки за "янаписалпрограммунас++,посмотритепожалуйста" по рукам бить надо так что разделитель слов это пробел, ну а лишний пробел это ещё ладно и правда можно учесть так как выглядит нормально в отличии от слитнонаписанныхслов.
Не распарсил толком, но есть как минимум переносы строк и табуляции. Знаки препинания тоже вполне себе разделители слов. Впрочем, в данном конкретном случае, скорее всего, действительно имелись в виду только пробелы.
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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);
}
Хотя условия начинают выглядить страшно и напрашивается добавление функций чтобы убрать столь длинные условия ...
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,850
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;
}
1
go
Эксперт С++
3586 / 1366 / 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/74bcc29bb448dbb41f2fe338ef764ce2

Добавлено через 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/clibrary/cctype/isspace/
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,850
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;
}
1
Irissha
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 17
04.01.2012, 16:52  [ТС] #11
всем огромное спасибо.... очень помогли...
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
04.01.2012, 17:12 #12
Цитата Сообщение от go Посмотреть сообщение
А сам правильно можете реализовать? isspace это не только пробел
Не подумал я об этом что-то, наверное потому что рассчитывал на обычную короткую строку, а не на чтения текста с файла, а в обычно строке редко всякие табуляции попадаются, разве что специально их туда записать.
0
04.01.2012, 17:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2012, 17:12
Привет! Вот еще темы с ответами:

Описать функцию, которая подсчитывает максимальное количество символов, идущих подряд в строке - C++
Добрый день! Дали задание, но не совсем ясно, а выполнить надо. Просьба написать: a)функцию, которая подсчитывает максимальное...

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

Реализовать парсер текста, который в каждой строке файла подсчитывает количество открытых и закрытых скобок - C++
Необходима программа, которая в каждой строке файла ищет количество открытых и закрытых скобок. А результатом выводит файл, где в конце тех...

Количество слов в заданной строке (для каждого из слов) - C++
дано символьная строка. Слово-последовательность символов между пробелами, не содержащие пробелы усередени себя. Для каждого из слов...


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

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

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