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

Поиск количества слов строке(как можно проще) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
ivan732
0 / 0 / 0
Регистрация: 02.12.2011
Сообщений: 7
05.03.2012, 15:32     Поиск количества слов строке(как можно проще) #1
Здравствуйте.Я недавно начал изучать с++ и столкнулся с проблемой. Нужно написать программу поиска количества слов строке, но как можно проще ,ограничиваясь базовыми библиотеками. Нужно использовать ассоциативный массив,но я его не знаю если кто поможет кодом с пояснениями буду благодарен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rexer
 Аватар для Rexer
151 / 150 / 19
Регистрация: 10.10.2010
Сообщений: 691
05.03.2012, 15:52     Поиск количества слов строке(как можно проще) #2
Можно было б использовать strtok() для разбивки строки на слова,а потом их посчитать
ivan732
0 / 0 / 0
Регистрация: 02.12.2011
Сообщений: 7
05.03.2012, 15:58  [ТС]     Поиск количества слов строке(как можно проще) #3
Цитата Сообщение от Rexer Посмотреть сообщение
Можно было б использовать strtok() для разбивки строки на слова,а потом их посчитать
К сожалению не слышал. На форуме увидел код :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <sstream>
#include <conio.h>
int main()
{
   std::string str;
   std::getline(std::cin, str);
   std::stringstream ss(str);
   int i(0);
   while(ss >> str)
        i++;
   system("cls");
   std::cout << i;
   std::getchar();
   getch();
   return 0;
}
Он находит количество слов, но за слова принимает и запятые ,и тд. Можно ли это исправить и поясните сам код ,пожалуйста.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
05.03.2012, 16:10     Поиск количества слов строке(как можно проще) #4
http://www.cyberforum.ru/cpp-beginne...ead448812.html
Rexer
 Аватар для Rexer
151 / 150 / 19
Регистрация: 10.10.2010
Сообщений: 691
05.03.2012, 16:30     Поиск количества слов строке(как можно проще) #5
Этот код считает количество символов,а не слов.
А про strtok() почитайте на http://cplusplus.com/reference/clibrary/cstring/strtok/
Вы можете сделать так
Вводите строку.Считываете ее.Это будет,в простейшей реализации нечто такое
C++
1
2
3
char s[100];
cout << "Enter string: ";
cin.getline(s,100);
Далее,вы идете по строке простым for-ом
C++
1
2
3
4
5
6
for(int i = 0; i < strlen(s) - 1; i++)
{
if(s[i] != ' ' && s[i + 1] == ' ')
//значит i это конец слова нашего
countWord++;
}
что-то такое я думаю вам надо реализовать.
Там подхватите идею и развейте ее.
Либо уже можно использовать cpp-ые методы,там как вы уже написали целая библиотека есть string,попробуйте почитать про нее
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.03.2012, 16:35     Поиск количества слов строке(как можно проще) #6
Цитата Сообщение от ivan732 Посмотреть сообщение
но за слова принимает и запятые ,и тд.
Не знаю, по каким правилам "запятые и тд" могут в предложении в отрыве от слов стоять, но если так хочется от них избавиться, просто поменяйте их на пробелы
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
#include <iostream>
#include <string>
#include <sstream>
 
size_t count_words(const std::string & str, const std::string & delim){
    std::string tmp(str);
    size_t i = 0;
    while ( ( i = tmp.find_first_of(delim, i) ) != std::string::npos )
        tmp[i] = ' ';
    std::istringstream ist(tmp);
    i = 0;
    while ( ist >> tmp )
        ++i;
    
    return i;
}
 
int main(){
    const std::string DELIM(",.?!:;\t\n"); // добавить по вкусу
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() )
        std::cout << count_words(str, DELIM) << " words." << std::endl;
    
    return 0;
}
Цитата Сообщение от Rexer Посмотреть сообщение
Этот код считает количество символов,а не слов.
Да ну?! Слова разделённые пробелами он считает.

Добавлено через 2 минуты
Цитата Сообщение от ivan732 Посмотреть сообщение
Нужно использовать ассоциативный массив
Кстати, это тут к чему?
ivan732
0 / 0 / 0
Регистрация: 02.12.2011
Сообщений: 7
05.03.2012, 16:40  [ТС]     Поиск количества слов строке(как можно проще) #7
Кстати, это тут к чему?
Вобще еще нужно вывести количество одинаковых слов например: мама-2 раза папа-4 раза и тд.
Буду разбираться
remarkes
300 / 223 / 13
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
05.03.2012, 17:06     Поиск количества слов строке(как можно проще) #8
из Брайана Кернигана, Денниса Ритчи "Язык программирования Си"
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
/* подсчет строк входного потока */
main()
{
    int c, nl;
    nl = 0;
    while ((с = getchar()) != EOF)
        if (c == '\n')
            ++nl;
    printf(%d\n”, nl);
}
как видишь, никаких дополнительных библиотек не используется.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.03.2012, 17:07     Поиск количества слов строке(как можно проще) #9
remarkes, Строки не всегда есть слова.
remarkes
300 / 223 / 13
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
05.03.2012, 17:18     Поиск количества слов строке(как можно проще) #10
Цитата Сообщение от easybudda Посмотреть сообщение
Кстати, это тут к чему?
(про асс. массив)
видимо, человек до этого изучал что-то высокоуровневое, типа PHP и Javascript

Добавлено через 7 минут
ForEveR, ой, пардон ... тогда так:
из K&R
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
//~ подсчет количества слов из K&R
 
#include <stdio.h>
 
#define IN 1    /* внутри слова */
#define OUT 0   /* вне слова */
 
/* подсчет строк, слов и символов */
int main()
{
    int c, nl, nw, nc, state;
    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            ++nw;
        }
    }
    printf("строк: %d, слов: %d, букв: %d\n", nl, nw, nc);
    return 0;
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//~ подсчет количества слов (упрощенная версия)
 
#include <stdio.h>
 
/* создана из подсчета строк входного потока K&R */
int main()
{
    int c, nl;
    nl = 0;
    while ((c = getchar()) != EOF)
    if (c == ' ')
        ++nl;
    printf("%d\n", nl);
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2012, 17:20     Поиск количества слов строке(как можно проще)
Еще ссылки по теме:

C++ можно написать ее как то проще ?
Найти количества слов в строке C++
C++ Определение количества слов четной длины в строке

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.03.2012, 17:20     Поиск количества слов строке(как можно проще) #11
Цитата Сообщение от ivan732 Посмотреть сообщение
Вобще еще нужно вывести количество одинаковых слов
И это много раз было
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <map>
 
int main(){
    std::string str;
    
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ){
        std::istringstream ist(str);
        std::map<std::string, size_t> map;
        while ( ist >> str )
            map[str]++;
        for ( std::map<std::string, size_t>::const_iterator i = map.begin(); i != map.end(); ++i )
            std::cout << std::left << std::setw(20) << i->first << i->second << std::endl;
    }
    
    return 0;
}
Yandex
Объявления
05.03.2012, 17:20     Поиск количества слов строке(как можно проще)
Ответ Создать тему
Опции темы

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