Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Сосчитать кол-во слов


Автор: Weman 29.11.2005, 20:18
Помогите с задачей (код желательно на Си):
"В символьной строке сосчитать число слов, содержащих гласные буквы"
Заранее всем благодарен!!! smile

М
 
Переименован заголовок на более подходящий.
Постарайтесь давать теме внятное название.

Автор: _hunter 29.11.2005, 20:31
не вопрос -- поможем.
что именно тебе не понятно?

Автор: Weman 30.11.2005, 10:29
Я не знаю как написать сам цикл обработки строки.
У меня в книге по Си про строковые массивы очень мало написано.
Кто подскажет хорошую ссылочку по этой теме?

Автор: azesmcar 30.11.2005, 10:43
Слово это то что разделено пробелом. Т.е. разбиваешь строку с разделителем " ", потом начинаешь считать циклом...строку разбивай на слова фунцкией strtok.

Как делать смотри здесь
www.cplusplus.com/ref/cstring/strtok.html
потом вызываешь свою функцию например glasniy_simvol_exists(const char *p) которая возвращяет true если гласные в слове есть и false соотвественно если их нет..
И считаешь..вроде все остальное дело техники

Автор: Weman 30.11.2005, 19:59
Попробую сделать. ОГРОМНОЕ СПАСИБО!!!

Автор: azesmcar 1.12.2005, 11:01
Будут вопросы стучи в ICQ. 173549200

Автор: Weman 1.12.2005, 20:21
У меня вопрос. Можно ли разбить строку также как функцией strtok, только с помощью цикла?
Если можно, то выложите пожалуйста код на Си.

Автор: Aleksandor 1.12.2005, 21:03
Вот, выложил. Но не проверял smile

Код

// szLine содержит анализируемую строку
// можно предварительно конвертировать строку в нижний или верхний регистр
// еще по идее надо учитывать что могут встречаться разные кодировки для русского языка - Windows-1251, KOI-8R, MAC, ISO, IBM (DOS)


char* ptr, *ptok;
int size, cnt=0;    // счетчик слов

ptr=szLine;         // указатель в начале строки

do {                     // начали цикл
ptok=strtok(ptr," ");                             // ищем пробел
if (ptok==NULL) ptok=ptr+strlen(ptr);  // нет пробела- это единственное (или последнее) слово
size=ptok-ptr;                                      // длина слова

  if (myCheckWord(ptr, size)==TRUE) cnt++;   // если нашли гласную то увеличить счетчик на 1
  ptr+=(size+1);                                   // передвинуть указатель на начало следующего слова
} while (ptr<szLine+strlen(szLine));   //  делать пока указатель не дошел до конца строки



 
BOOL myCheckWord(char* ptr, int size)
{
char* searchptr=ptr;           // указатель на начале слова
char ch;
BOOL bResult=FALSE;

while (searchptr<ptr+size) {  // перемещаем указатель по слову
  ch=*searchptr++;                // берем значение по указателю с автоинкрементом
  if (ch=='а' || ch=='е' || ch=='и' || ch=='й' || ch=='о' || ch=='у' || ch=='э' || ch=='ю' || ch=='я') {
      bResult=TRUE; break; }  // если это гласная то устанавливаем флаг и выходим из цикла 
}
return bResult;    // возвращаем флаг (TRUE- нашли гласную, FALSE- не нашли)
}

Автор: blackofe 1.12.2005, 21:18
Aleksandor
не по существу вопроса: 'й' - не гласная буква. но зато к гласным относятся еще 'ы' и 'ё'. smile

Автор: Aleksandor 1.12.2005, 21:33
А у меня на клаве нет ё (вставил из буфера smile ) про Ы забыл, а вот про й думал что гласная smile

Автор: Weman 3.12.2005, 07:51
Спасибо. Попробую этот вариант.

Автор: Doc_d0s 3.12.2005, 16:15
число пробелов(разделителей)+1

Автор: Weman 3.12.2005, 21:42
А можно ли код программы, который написал Aleksandor написать какнибудь попроще для новичков и с объяснением назначения каждой вызываемой функции?
Помогите новичку разобраться. Спасибо.

Автор: nikitao 3.12.2005, 21:51
Weman.может перечислишь,какие ф-ции не понятны,а то код в себе не использует никаких сверх секретных ф-ций(если конечно число таких ф-ций не стримится к бесконечности),а после этого и как прога работает станет понятно smile

Автор: Weman 4.12.2005, 12:42
1)Возможно ли написать эту прогу без использования указателей?
2)Можно ли написать код без функции strtok();
3)Что такое NULL, strlen(szLine)
4)Какого szLine типа?
5)Можно ли сделать, чтобы программа искала английские буквы, а не русские?

Автор: Fixin 4.12.2005, 14:13
Вот, совсем по-детски:
Код
#include <string.h>

void main()
{
    char stroka[] = "считаем считаем neschitaem";
    char bukvi[] = "ёуеыаоэяию"; // сдесь будем хранить буквы, 
            //которые входят в нужные слова (тут только маленькие)
    int dlina = strlen(stroka); // получаем длину строки
    int kol_vo_slov = 0;
    int flag_podhodit = 0; // если в слове встречаем нужную букву - 
            //ставим этот флаг = 1
    for (int i = 0; i <= dlina; i++)
    {
        if (!flag_podhodit) // если флаг еще не установлен
            for (int j = 0; j < strlen(bukvi); j++)
                if (stroka[i] == bukvi[j]) // и текущая буква в перечне искомых
                    flag_podhodit = 1; // то текущее слово подходит
        
        if ((stroka[i] == ' ')||(stroka[i] == 0)) // если пробел или конец строки - слову конец
            if (flag_podhodit) // и если для кончившегося слова стоит флаг
            {
                kol_vo_slov++; // кол-во слов увеличиваем
                flag_podhodit = 0; // а флаг снимаем, тк переходим к следующему слову
            }
    }
}

Автор: blackofe 5.12.2005, 21:33
Цитата(Doc_d0s @ 3.12.2005, 16:15)
число пробелов(разделителей)+1

а если встречаются несколько пробелов подряд? у американцев, к примеру, дурацкая практика - в конце предложения после точки ставить два пробела.

или наоборот - слова разделены только запятой без пробела?

Автор: _hunter 6.12.2005, 11:50
тогда предварительно пройдись по тексту ( возможно несколько раз ) и удали все двойные пробелы

Автор: nikitao 6.12.2005, 12:09
Так а если там смайлики между словами написаны.Решение через пробелы -это схалявить.Тут как-то иначе.Разделитялями являются все символы кроме букв латинского и русского алфавита т е это не только пробелы,точки,запятые...Я бы сделал так:
Посимвольно шел по тексту,если встречается знак-разделитель,а предыдущий зна -это знак-неразделитель(для этого надо переменную типа bool обьявить),то увеличеваем счетчик на один.Так до канца.При этои символ '\0' будем тоже считать разделителем.Проблем как всегда в кодировке.Под латиницу писать от силы 20 минут(ИМХО),хотя это может только казаться.

Автор: TeeT 6.12.2005, 17:58
Без указателей нельзя, а вот без функции strtok можно, с помощью sscanf, только вот труднее получится,
smile а про NULL на русском языке в ХЭЛПЕ написано:

Description

Null pointer constant that is compatible with any data object pointer. It is not compatible with function pointers. When a pointer is equivalent to NULL it is guaranteed not to point to any data object defined within the program.

А в принципе на Си все можно сделать smile

Автор: nikitao 6.12.2005, 18:14
Цитата(TeeT @ 6.12.2005, 18:58)
а про NULL на русском языке в ХЭЛПЕ написано

А кто сказал ,что с NULL('\0') какие-то проблемы???

Автор: blackofe 6.12.2005, 19:08
Цитата(nikitao @ 6.12.2005, 12:09)
Проблем как всегда в кодировке.Под латиницу писать от силы 20 минут(ИМХО),хотя это может только казаться.

ну, какие же проблемы в кодировке? пользуйте locale, и будет вам щастье! ;)
Добавлено @ 19:10
Цитата(_hunter @ 6.12.2005, 11:50)
тогда предварительно пройдись по тексту ( возможно несколько раз ) и удали все двойные пробелы

а еще подровнять абзацы, проверить орфографию и раскрасть шрифты всеми цветами радуги. smile

сорри. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)