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

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

Войти
Регистрация
Восстановить пароль
 
 
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
#1

Подсчет числа слов во введенных данных - C++

02.08.2015, 17:14. Просмотров 429. Ответов 18
Метки нет (Все метки)

Приветствую. Имеется задание: напишите программу, которая должна вычислить, сколько раз каждое отдельное слово содержится во введенных данных. Мой код работает криво: считает неправильно, в некоторых случаях вообще никакого ответа не выдает. Хотел бы понять, где ошибки.
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    typedef vector<string>::size_type vec_t;
    vector<string> str_vec;
    string line;
    while (cin>> line)
        str_vec.push_back (line);
 
    cout<< endl;
    sort(str_vec.begin(), str_vec.end());
    for (vec_t i=0; i<str_vec.size(); i++)
        cout<< str_vec[i]<<" ";
 
    vec_t count=0;
 
    for (vec_t i=0; i <= str_vec.size(); i++)
        if (str_vec[i] != str_vec[i+1]){
            cout<< "\nСлово \"" + str_vec[i] + "\" встречается раз: "<< i+1-count;
            count=i;
        }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2015, 17:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подсчет числа слов во введенных данных (C++):

Подсчет слов, введенных с клавиатуры - C++
Есть такая практическая задача, надо написать прогу, которая считает слова при вводе их с клавиатуры, притом в несколько строк и прекращать...

Подсчет числа слов в предложении до точки - C++
Напишите программу,которая считает сколько слов в предложении до точки, с использованием getchar

Подсчет числа слов в предложении с использованием перечислений. Найти ошибку в коде - C++
где в коде ошибка? // подсчет чила слов в предложении с использованием перечислений.cpp: определяет точку входа для консольного...

Подсчет числа слов в тексте. Слишком много аргументов для вызова - C++
Пожалуйста помогите, нужно подсчитать количество слов в тексте, у меня выводит 2 ошибки: Ошибка 1 error C2197: bool (__cdecl...

Строка, введенная пользователем, состоит из слов, разделенных запятой. Подсчитать и вывести на экран количество введенных слов - C++
Задание: Строка, введенная пользователем, состоит из слов, разделенных запятой. Подсчитать и вывести на экран количество введенных слов. ...

Подсчет введенных символов - C++
Всем добрый день. Начал изучать С++ (чисто для себя) по книгде Г. Шилдта - &quot;С++ Руководство для начинающих&quot;, там в конце 4 модуля имеется...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Григорий34
Заблокирован
02.08.2015, 19:25 #2
Не стоит стараться решать все и сразу. Для начала сделайте функцию принимающую скажем слово и возвращающую сколько раз оно встретилось.

А вообще все зависит от того какие данные вводите. Вводите сразу несколько слов ? Текст из файла ? Или вводите по одному слову и жмете дальше ?
0
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 05:51  [ТС] #3
Я ввожу слова через пробел, заканчиваю ввод через Ctrl+D.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
03.08.2015, 07:29 #4
Нагородил огород. Всё проще делается.
0
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 07:55  [ТС] #5
gru74ik, вы неправильно поняли мое задание. Мне нужно не посчитать, сколько раз встречается заданное слово, а сколько раз встречается каждое из введенных слов. Или вы намекаете, что нужно для каждого из слов запускать функцию подсчета? Такой способ мне кажется неоптимальным, хотелось бы более эффективную реализацию. А по поводу вашего кода: вы не написали функцию, а просто использовали библиотечную, чего мне не нужно.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
03.08.2015, 08:23 #6
Exzotick, прошу прощения, значит я неправильно понял задание.
0
Ferrari F1
=^_^=
570 / 457 / 94
Регистрация: 27.01.2015
Сообщений: 2,696
Записей в блоге: 1
Завершенные тесты: 1
03.08.2015, 08:42 #7
Алгоритм решения на коленке:
1) Пишем исходную строку
2) Подсчитываем кол-во слов в этой строке
3) Создаем массив строк (char* words[]), динамически выделяя память под нужное кол-во ячеек (слов)
4) Для каждого элемента words считаем кол-во его вхождений в начальной строке.

Алгоритм очень обобщен и подразумевает собой включение различных проверок.
Например при составлении дин. массива, нужно учитывать, что размер массива может быть не равен кол-ву исходных слов.
0
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 10:30  [ТС] #8
Ferrari F1, я начал реализовывать ваш алгоритм, но что-то не выходит. Видимо, правильно заполнить вектор со словами не получается.
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    typedef vector<string>::size_type vec_t;
    vector<string> str_vec;
    string line;
    while (cin>> line)
        str_vec.push_back (line);
 
    cout<< endl;
    //sort(str_vec.begin(), str_vec.end());
    for (vec_t i=0; i<str_vec.size(); i++)
        cout<< str_vec[i]<<" ";
    vector<string> wrd_vec;
    cout<< endl;
    for (vec_t i=0; i<str_vec.size(); i++)
        for (vec_t j=i; j<str_vec.size(); j++)
            for (vec_t k=0; k<wrd_vec.size(); k++)
                if (wrd_vec[k]==str_vec[j])
                    break;
                else
                    wrd_vec.push_back(str_vec[j]);
    for (vec_t i=0; i<wrd_vec.size(); i++)
        cout<< wrd_vec[i]<<" ";
    }
А можете еще сказать, что в моей первоначальной реализации неверно?
0
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
03.08.2015, 11:54 #9
Exzotick, вот тут asics приводит пример. Можно переделать под свои нужды, убрав вывод строк на экран:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
 
int main()
{
    std::string s;
    std::cout << "Enter string: ";
    getline(std::cin, s);
    std::istringstream ist(s);
    std::vector<std::string> vec_word;
    int numberOfWords = 0;
    while(ist >> s)
    {
        vec_word.push_back(s);
        ++numberOfWords;
    }
    std::cout <<"Count words: " << numberOfWords << std::endl;
 
    return 0;
}
Добавлено через 1 минуту
Вот у тебя, считай, код для запихивания строки в вектор отдельными словами уже есть. Плюс к этому, переменная numberOfWords хранит количество слов. Половина задачи решена уже.
0
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 12:33  [ТС] #10
gru74ik, считывание слов в вектор у меня уже было сделано. Проблема не в этом. Так что вряд ли это половина задачи.
0
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
03.08.2015, 12:37 #11
Цитата Сообщение от Exzotick Посмотреть сообщение
правильно заполнить вектор со словами не получается.
А это тогда что?
0
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 13:11  [ТС] #12
gru74ik, идея была в том, чтобы все слова (с повторами) считать в вектор, потом создать вектор, в котором будут все слова без повторов, и с его помощью посчитать, сколько раз каждое из слов содержится в первом векторе. Вот этот самый второй вектор у меня не получается заполнить.
0
Kerry_Jr
Модератор
Эксперт PHP
2191 / 1987 / 694
Регистрация: 14.05.2014
Сообщений: 5,813
Записей в блоге: 1
Завершенные тесты: 5
03.08.2015, 13:22 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Exzotick, может так
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
#include <vector>
#include <string>
#include <iostream>
 
int main()
{
    std::string word;
    std::vector<std::string> words;
    std::vector<int> count;
    bool exists;
    
    while (std::cin >> word)
    {
        exists = false;
        for (size_t i = 0; i < words.size(); ++i)
        {
            if (word == words[i])
            {    
                ++count[i];
                exists = true;
                break;
            }
        }
        
        if (!exists)
        {    
            words.push_back(word);
            count.push_back(1);
        }
    }
    
    for (size_t i = 0; i < count.size(); ++i)
        std::cout << words[i] << " : " << count[i] << std::endl;
    
    return 0;
}
2
gru74ik
Модератор
Эксперт CЭксперт С++
4178 / 1806 / 197
Регистрация: 20.02.2013
Сообщений: 4,943
Записей в блоге: 21
03.08.2015, 13:37 #14
Exzotick, вот вектор без повторов.

Добавлено через 10 минут
Kerry_Jr, в 17-й строке в векторе words ещё нет ни одного значения. С чем сравниваем строку word?
Более того, поскольку после создания вектора words туда пока что не случилось ни одного пуш_бэка, размер его равен нулю (15 строка кода). Значит и в цкил-то мы даже не попадём.
0
Kerry_Jr
Модератор
Эксперт PHP
2191 / 1987 / 694
Регистрация: 14.05.2014
Сообщений: 5,813
Записей в блоге: 1
Завершенные тесты: 5
03.08.2015, 13:44 #15
Цитата Сообщение от gru74ik Посмотреть сообщение
в 17-й строке в векторе words ещё нет ни одного значения
я знаю, только если значений нет, то в цикл не войдет
C++
1
for (size_t i = 0; i < words.size(); ++i)
Добавлено через 1 минуту
Цитата Сообщение от gru74ik Посмотреть сообщение
цкил-то мы даже не попадём.
ну так естесственно, в цикл не попадаем, идем ниже и пушбэчимся. В чем вопрос, программа полностью рабочая. Я б не выкладывал, если не проверил.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2015, 13:44
Привет! Вот еще темы с ответами:

Не работает подсчет суммы введенных чисел - C++
#include &lt;iostream&gt; using namespace std; int main() { std::cout &lt;&lt; 'Enter two numbers' &lt;&lt; std::endl; int v1, v2; std::cin &gt;&gt;...

Подсчет количества введенных с клавиатуры чисел - C++
Реализовать ввод чисел с клавиатуры и подсчёт их длинны

Введение массива пользователем и подсчет введенных элементов - C++
Кто нибудь! Пожалуйста! Нужна помощь!! Как подсчитать количество элементов в произвольно введенном массиве не используя векторов и прочих...

Количество введенных слов - C++
Вот что я смог сделать с этим заданием. И еще if по книге я еще не проходил, но применил больше вариантов не нашел. #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.08.2015, 13:44
Ответ Создать тему
Опции темы

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