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

функция подсчета слов - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить количество одинаковых букв http://www.cyberforum.ru/cpp-beginners/thread192442.html
Помогите написать программу которая считывает текст из файла и определяет количество одинаковых букв ПО ПАРАМ слов в предложении. Например нам дано предложение: "Система управления базой данных...", В первой паре слов "система управления" 3 одинаковых буквы: и, е, а. И так дальше по парам слов... Пары слов считаются так: "Система управления", "базой данных" и т.д. (если не получиться так,...
C++ метод по добавлению нового объекта в массив объектов Как при помощи ссылок в java создать метод по добавлению нового объекта в массив объектов(например,-новый номер в справочник) ? что делать с длиной массива, ведь её никак не увеличишь? http://www.cyberforum.ru/cpp-beginners/thread192436.html
C++ найти сумму
Вычислить: y=-(1+x)^2+(1+x)^4/2-(1+x)^6/4.... ; (N слагаемых). void main() {int n,i,k=4,x,j=2,m,l; double sum=0,f=0; cout<<"vvedite n and x"; cin>>n>>x; f=-(1+x); l=1;
C++ Циклы с постусловием и с предусловим
Дано натуральное число. Верно ли, что в его десятичной записи есть шесть единиц подряд? У меня вообще мозг не пашет как это сделать... Пожалуйста! Помогите как можно скорее! Прошу! :cry:
C++ поменять местами элементы массива при условии http://www.cyberforum.ru/cpp-beginners/thread192415.html
Ниже представлен мой код,в комментариях написал как работает программа. Работает правильно-из одного массива записывает в другой все четные цифры,а из первого удаляются(обнуляются) эти числа. На рисунке показано что в массиве нечетных цифр,два числа стоят так как они стояли до калькуляции. Вот я хочу чтобы все оставшийся цифры записывались в массив рядом.,отсортировались. то есть на...
C++ Напишите программу, вычисляющую среднее арифметическое двух чисел Всем привет! Народ помогите с задачкой, нужно сделать в Microsoft Visual Studio. Задача: Напишите программу, вычисляющую среднее арифметическое двух чисел. подробнее

Показать сообщение отдельно
schdub
 Аватар для schdub
2901 / 1245 / 222
Регистрация: 19.01.2009
Сообщений: 3,209
Завершенные тесты: 1
17.11.2010, 02:15     функция подсчета слов
Цитата Сообщение от JerryJackson Посмотреть сообщение
char str1[]="Привет! nil laba_12 chaos? UFO";
У Вас в задании была именно такая строка?

Важно точно определить, какой набор символов является разделителем слов. Если только пробелы, пользуйте isspace(), а если например, так же и символы пунктуации, то нужно еще пользовать ispunct() (хидер ctype.h).

Вот первая версия, которую подсказывает логика:
C
1
2
3
4
5
6
7
8
9
10
11
12
int xcount(const char * p)
{
    int n = 0;
    while (*p)
    {
        while (*p && (isspace(*p) || ispunct(*p))) ++p;
        if (!*p) break;
        while (*p && !isspace(*p) && !ispunct(*p)) ++p;
        ++n;
    }
    return n;
}
Возвращаясь к строке-образцу, нужно отметить 2 важных момента:

1 Дело в том, что здесь есть русские символы, а это отрицательное значение (русские символы более максимального положительного значения типа данных char) и поэтому их нельзя использовать вместе с функциями ispunct(), isspace() и т.д. в исходниках CRT, например, стоят асерты на положительное значение передаваемых ей аргументов.

Данную проблему можно победить кастом из char * в unsigned char *, но это имхо не красиво:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
int xcount(const char * ptr)
{
    int n = 0;
    unsigned char * p = (unsigned char *) ptr;
    while (*p)
    {
        while (*p && (isspace(*p) || ispunct(*p))) ++p;
        if (!*p) break;
        while (*p && !isspace(*p) && !ispunct(*p)) ++p;
        ++n;
    }
    return n;
}
2. Обращаю внимание на вот это слово - laba_12 из образца. Символ '_' является знаком пунктуации, а следовательно, разделителем слов. По идее если символы пунктуации считать разделителем слов, то здесь будет два слова 'laba' и '12'.

Если символ '_' всеже необходимо использовать, то вот несколько "костыльное" решение:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int xcount(const char * ptr)
{
    int n = 0;
    unsigned char * p = (unsigned char *) ptr;
    while (*p)
    {
        while (*p && (isspace(*p) || ispunct(*p))) ++p;
        if (!*p) break;
        while (*p && !isspace(*p) && (*p == '_' || !ispunct(*p))) ++p;
        ++n;
    }
    return n;
}
 
Текущее время: 08:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru