Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сосчитать кол-во слов, в строке 
:(
    Опции темы
Weman
Дата 29.11.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.11.2005
Где: Санкт-Петрбург

Репутация: нет
Всего: нет



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

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

--------------------
PM MAIL ICQ   Вверх
_hunter
Дата 29.11.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



не вопрос -- поможем.
что именно тебе не понятно?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Weman
Дата 30.11.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.11.2005
Где: Санкт-Петрбург

Репутация: нет
Всего: нет



Я не знаю как написать сам цикл обработки строки.
У меня в книге по Си про строковые массивы очень мало написано.
Кто подскажет хорошую ссылочку по этой теме?
--------------------
PM MAIL ICQ   Вверх
azesmcar
Дата 30.11.2005, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



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

Как делать смотри здесь
www.cplusplus.com/ref/cstring/strtok.html
потом вызываешь свою функцию например glasniy_simvol_exists(const char *p) которая возвращяет true если гласные в слове есть и false соотвественно если их нет..
И считаешь..вроде все остальное дело техники
PM   Вверх
Weman
Дата 30.11.2005, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.11.2005
Где: Санкт-Петрбург

Репутация: нет
Всего: нет



Попробую сделать. ОГРОМНОЕ СПАСИБО!!!
--------------------
PM MAIL ICQ   Вверх
azesmcar
Дата 1.12.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Будут вопросы стучи в ICQ. 173549200
PM   Вверх
Weman
Дата 1.12.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.11.2005
Где: Санкт-Петрбург

Репутация: нет
Всего: нет



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

--------------------
PM MAIL ICQ   Вверх
Aleksandor
Дата 1.12.2005, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 0
Всего: 12



Вот, выложил. Но не проверял 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- не нашли)
}


Это сообщение отредактировал(а) Aleksandor - 3.12.2005, 23:39


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
blackofe
Дата 1.12.2005, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



Aleksandor
не по существу вопроса: 'й' - не гласная буква. но зато к гласным относятся еще 'ы' и 'ё'. smile
PM MAIL   Вверх
Aleksandor
Дата 1.12.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 0
Всего: 12



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


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
Weman
Дата 3.12.2005, 07:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.11.2005
Где: Санкт-Петрбург

Репутация: нет
Всего: нет



Спасибо. Попробую этот вариант.
--------------------
PM MAIL ICQ   Вверх
Doc_d0s
Дата 3.12.2005, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле

Репутация: 2
Всего: 3



число пробелов(разделителей)+1
--------------------
Админ- это вождь Apache'й :)
PM MAIL ICQ   Вверх
Weman
Дата 3.12.2005, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.11.2005
Где: Санкт-Петрбург

Репутация: нет
Всего: нет



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

--------------------
PM MAIL ICQ   Вверх
nikitao
Дата 3.12.2005, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



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


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Weman
Дата 4.12.2005, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 29.11.2005
Где: Санкт-Петрбург

Репутация: нет
Всего: нет



1)Возможно ли написать эту прогу без использования указателей?
2)Можно ли написать код без функции strtok();
3)Что такое NULL, strlen(szLine)
4)Какого szLine типа?
5)Можно ли сделать, чтобы программа искала английские буквы, а не русские?
--------------------
PM MAIL ICQ   Вверх
Fixin
Дата 4.12.2005, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Вот, совсем по-детски:
Код
#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; // а флаг снимаем, тк переходим к следующему слову
            }
    }
}

PM MAIL ICQ   Вверх
blackofe
Дата 5.12.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



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

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

или наоборот - слова разделены только запятой без пробела?
PM MAIL   Вверх
_hunter
Дата 6.12.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



тогда предварительно пройдись по тексту ( возможно несколько раз ) и удали все двойные пробелы


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
nikitao
Дата 6.12.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



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


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
TeeT
Дата 6.12.2005, 17:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Без указателей нельзя, а вот без функции 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



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

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



--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
blackofe
Дата 6.12.2005, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



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

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

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

сорри. smile

Это сообщение отредактировал(а) blackofe - 6.12.2005, 19:08
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.