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

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

Восстановить пароль Регистрация
 
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
02.08.2015, 17:14     Подсчет числа слов во введенных данных #1
Приветствую. Имеется задание: напишите программу, которая должна вычислить, сколько раз каждое отдельное слово содержится во введенных данных. Мой код работает криво: считает неправильно, в некоторых случаях вообще никакого ответа не выдает. Хотел бы понять, где ошибки.
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;
        }
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Григорий34
Заблокирован
02.08.2015, 19:25     Подсчет числа слов во введенных данных #2
Не стоит стараться решать все и сразу. Для начала сделайте функцию принимающую скажем слово и возвращающую сколько раз оно встретилось.

А вообще все зависит от того какие данные вводите. Вводите сразу несколько слов ? Текст из файла ? Или вводите по одному слову и жмете дальше ?
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 05:51  [ТС]     Подсчет числа слов во введенных данных #3
Я ввожу слова через пробел, заканчиваю ввод через Ctrl+D.
gru74ik
Модератор
 Аватар для gru74ik
3077 / 1322 / 164
Регистрация: 20.02.2013
Сообщений: 3,759
Записей в блоге: 17
03.08.2015, 07:29     Подсчет числа слов во введенных данных #4
Нагородил огород. Всё проще делается.
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 07:55  [ТС]     Подсчет числа слов во введенных данных #5
gru74ik, вы неправильно поняли мое задание. Мне нужно не посчитать, сколько раз встречается заданное слово, а сколько раз встречается каждое из введенных слов. Или вы намекаете, что нужно для каждого из слов запускать функцию подсчета? Такой способ мне кажется неоптимальным, хотелось бы более эффективную реализацию. А по поводу вашего кода: вы не написали функцию, а просто использовали библиотечную, чего мне не нужно.
gru74ik
Модератор
 Аватар для gru74ik
3077 / 1322 / 164
Регистрация: 20.02.2013
Сообщений: 3,759
Записей в блоге: 17
03.08.2015, 08:23     Подсчет числа слов во введенных данных #6
Exzotick, прошу прощения, значит я неправильно понял задание.
Ferrari F1
Заблокирован
295 / 281 / 61
Регистрация: 27.01.2015
Сообщений: 1,888
Записей в блоге: 1
Завершенные тесты: 1
03.08.2015, 08:42     Подсчет числа слов во введенных данных #7
Алгоритм решения на коленке:
1) Пишем исходную строку
2) Подсчитываем кол-во слов в этой строке
3) Создаем массив строк (char* words[]), динамически выделяя память под нужное кол-во ячеек (слов)
4) Для каждого элемента words считаем кол-во его вхождений в начальной строке.

Алгоритм очень обобщен и подразумевает собой включение различных проверок.
Например при составлении дин. массива, нужно учитывать, что размер массива может быть не равен кол-ву исходных слов.
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]<<" ";
    }
А можете еще сказать, что в моей первоначальной реализации неверно?
gru74ik
Модератор
 Аватар для gru74ik
3077 / 1322 / 164
Регистрация: 20.02.2013
Сообщений: 3,759
Записей в блоге: 17
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 хранит количество слов. Половина задачи решена уже.
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 12:33  [ТС]     Подсчет числа слов во введенных данных #10
gru74ik, считывание слов в вектор у меня уже было сделано. Проблема не в этом. Так что вряд ли это половина задачи.
gru74ik
Модератор
 Аватар для gru74ik
3077 / 1322 / 164
Регистрация: 20.02.2013
Сообщений: 3,759
Записей в блоге: 17
03.08.2015, 12:37     Подсчет числа слов во введенных данных #11
Цитата Сообщение от Exzotick Посмотреть сообщение
правильно заполнить вектор со словами не получается.
А это тогда что?
Exzotick
0 / 0 / 0
Регистрация: 25.05.2014
Сообщений: 25
03.08.2015, 13:11  [ТС]     Подсчет числа слов во введенных данных #12
gru74ik, идея была в том, чтобы все слова (с повторами) считать в вектор, потом создать вектор, в котором будут все слова без повторов, и с его помощью посчитать, сколько раз каждое из слов содержится в первом векторе. Вот этот самый второй вектор у меня не получается заполнить.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1855 / 1651 / 574
Регистрация: 14.05.2014
Сообщений: 4,726
Записей в блоге: 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;
}
gru74ik
Модератор
 Аватар для gru74ik
3077 / 1322 / 164
Регистрация: 20.02.2013
Сообщений: 3,759
Записей в блоге: 17
03.08.2015, 13:37     Подсчет числа слов во введенных данных #14
Exzotick, вот вектор без повторов.

Добавлено через 10 минут
Kerry_Jr, в 17-й строке в векторе words ещё нет ни одного значения. С чем сравниваем строку word?
Более того, поскольку после создания вектора words туда пока что не случилось ни одного пуш_бэка, размер его равен нулю (15 строка кода). Значит и в цкил-то мы даже не попадём.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1855 / 1651 / 574
Регистрация: 14.05.2014
Сообщений: 4,726
Записей в блоге: 1
Завершенные тесты: 5
03.08.2015, 13:44     Подсчет числа слов во введенных данных #15
Цитата Сообщение от gru74ik Посмотреть сообщение
в 17-й строке в векторе words ещё нет ни одного значения
я знаю, только если значений нет, то в цикл не войдет
C++
1
for (size_t i = 0; i < words.size(); ++i)
Добавлено через 1 минуту
Цитата Сообщение от gru74ik Посмотреть сообщение
цкил-то мы даже не попадём.
ну так естесственно, в цикл не попадаем, идем ниже и пушбэчимся. В чем вопрос, программа полностью рабочая. Я б не выкладывал, если не проверил.
gru74ik
Модератор
 Аватар для gru74ik
3077 / 1322 / 164
Регистрация: 20.02.2013
Сообщений: 3,759
Записей в блоге: 17
03.08.2015, 13:53     Подсчет числа слов во введенных данных #16
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
если значений нет, то в цикл не войдет
А так и было задумано?

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
ну так естесственно, в цикл не попадаем, идем ниже и пушбэчимся.
Понял, благодарю за разъяснения.

Цитата Сообщение от Kerry_Jr Посмотреть сообщение
В чем вопрос, программа полностью рабочая. Я б не выкладывал, если не проверил.
Kerry_Jr, странно. У меня только постоянно вводить слова предлагает. Больше ничего.
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
03.08.2015, 14:00     Подсчет числа слов во введенных данных #17
Цитата Сообщение от Exzotick Посмотреть сообщение
сколько раз встречается каждое из введенных слов
Aho–Corasick algorithm
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1855 / 1651 / 574
Регистрация: 14.05.2014
Сообщений: 4,726
Записей в блоге: 1
Завершенные тесты: 5
03.08.2015, 14:02     Подсчет числа слов во введенных данных #18
gru74ik, для окончания ввода [Ctrl] + [z]. Можно программу укоротить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <map>
#include <string>
#include <iostream>
 
int main()
{
    std::string word;
    std::map<std::string, int> words;
    
    while (std::cin >> word)
    {
        if (words.count(word) == 0)
            words.insert(std::pair<std::string, int>(word, 1));
        else
            ++words.at(word);
    }
    
    for (auto i = words.begin(); i != words.end(); ++i)
        std::cout <<i->first << " : " << i->second << std::endl;
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2015, 18:53     Подсчет числа слов во введенных данных
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Martein
Оператор ЭВМ 6 разряда
 Аватар для Martein
470 / 66 / 12
Регистрация: 22.06.2014
Сообщений: 144
03.08.2015, 18:53     Подсчет числа слов во введенных данных #19
Вот мой велосипед на std::vector и std::set, но вариант с std::map конечно гораздо гораздее:
C++
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
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
 
int main()
{
    std::string str;
 
    std::cout << "Enter your string: ";
    std::vector<std::string> stringVec;
    while (std::cin >> str) {
        stringVec.push_back(str);
    }
 
    std::cin.clear();
    std::cout << "Enter words: ";
    std::set<std::string> setOfWords;
    while (std::cin >> str) {
        setOfWords.insert(str);
    }
 
    std::vector<int> countWords(setOfWords.size(), 0);
 
    size_t i = 0;
    for (std::set<std::string>::iterator it_set = setOfWords.begin(); it_set != setOfWords.end(); ++it_set, ++i) {
 
        std::vector<std::string>::iterator it_vec = stringVec.begin();
 
        while (it_vec != stringVec.end()) {
 
            it_vec = std::find(it_vec, stringVec.end(), *it_set);
 
            if (it_vec != stringVec.end()) {
                ++countWords[i];
                ++it_vec;
            }
        }
    }
 
    i = 0;
    for (std::set<std::string>::iterator it_set = setOfWords.begin(); it_set != setOfWords.end(); ++it_set, ++i) {
        std::cout << *it_set << " - " << countWords[i] << " times.\n";
    }
 
    return 0;
}

И то же самое, но с применением C++11
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
37
38
39
40
41
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
 
int main()
{
    std::string str;
    std::cout << "Enter your string: ";
    std::vector<std::string> stringVec;
   
    while (std::cin >> str) {
        stringVec.push_back(str);
    }
    std::cin.clear();
   
    std::cout << "Enter words: ";
    std::set<std::string> setOfWords;
    while (std::cin >> str) {
        setOfWords.insert(str);
    }
   
    std::vector<int> countWords(setOfWords.size(), 0);
    size_t i = 0;
    for (auto str : setOfWords) {
        auto it = stringVec.begin();
        while (it != stringVec.end()) {
            it = std::find(it, stringVec.end(), str);
            if (it != stringVec.end()) {
                ++countWords[i];
                ++it;
            }
        }
        ++i;
    }
    i = 0;
    for (auto str : setOfWords) {
        std::cout << str << " - " << countWords[i] << " times.\n";
    }
    return 0;
}
Yandex
Объявления
03.08.2015, 18:53     Подсчет числа слов во введенных данных
Ответ Создать тему
Опции темы

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