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

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

Войти
Регистрация
Восстановить пароль
 
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 150
Завершенные тесты: 1
#1

Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) - C++

05.06.2013, 23:11. Просмотров 1065. Ответов 11
Метки нет (Все метки)

Ввести строку. Учитывая что строка может содержать слова которые повторяются, вывести в столбец все слова без повторений и количеством использования каждого слова. Регистр букв можно не учитывать если так будет легче написать программу.

Например строка:
Hello, World! This is the test program. Bye World.

Должно вывести:
Hello 1
World 2
This 1
is 1
the 1
test 1
program 1
Bye 1



уже третий день мучаюсь, помогите пожалуйста..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2013, 23:11     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова)
Посмотрите здесь:
C++ Вывести все слова в столбик без повторений
C++ Вывести все слова из файла в алфавитном порядке, указать частоту каждого слова
C++ Вывести слова без повторений,которые имеют больше гласных,чем согласных.
Поменять местами первые слова (слова разделены пробелами) заданных строк, без использования процедур C++
C++ Из заданной строки, распечатать все слова без повторений (как добавить функцию strcmp)
Вывести все слова с максимальным количеством букв C++
C++ Вывести слова, содержащие гласные. Без использования встроенных функций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Модератор
Эксперт CЭксперт С++
7001 / 4172 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
05.06.2013, 23:15     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <string>
 
typedef std::unordered_map<std::string, int> umap;
 
int main()
{
    std::ifstream ifs("input.txt");
    if (!ifs)
        return 1;
    umap m;
    std::string str;
    while(!ifs.eof() && ifs >> str)
        ++m[str];
    for (auto &word : m)
        std::cout << word.first << ' ' << word.second << std::endl;
}
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 150
Завершенные тесты: 1
05.06.2013, 23:36  [ТС]     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #3
MrGluck, не работает. vs2010 выдает 6 ошибок...
MrGluck
Модератор
Эксперт CЭксперт С++
7001 / 4172 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
05.06.2013, 23:45     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #4
gorus95, выкиньте vs2010
У меня все работает, просто код написан с использованием стандарта С++11 и требует компилятора поновее.

Добавлено через 2 минуты
Замените for-цикл по коллекции на обычный std::for_each и замените обычный ассоциативный массив (unordered_map) на отсортированный (map), иначе доступа к элементу по ключу, а не индексу не получите.

Не по теме:

Эх, в С++ бы ассоциат. массивы из PHP (как элемент ситаксиса)...

gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 150
Завершенные тесты: 1
05.06.2013, 23:46  [ТС]     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #5
MrGluck, я бы с радостью, но сдавать мне это нужно будет вообще на vs2008.
да и тем более с такого кода я понимаю смысл всего нескольких строк, а мне еще нужно будет объяснить как оно работает..(
MrGluck
Модератор
Эксперт CЭксперт С++
7001 / 4172 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
06.06.2013, 00:02     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #6
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
#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <algorithm>
 
typedef std::map<std::string, int> mymap; // создаем синоним для map
 
void foo(const mymap::value_type &vt)
{
    std::cout << vt.first << ' ' << vt.second << std::endl;
}
 
int main()
{
    std::ifstream ifs("input.txt"); // открываем поток для считывания с файла
    if (!ifs) // если создать не удалось - возвращаем ошибку
        return 1;
    mymap m;
    std::string str;
    while(!ifs.eof() && ifs >> str) // пока не конец файла и считали строку
        ++m[str]; // инкремируем её счетчик в множестве m (второе число по ключу str)
    std::for_each(m.begin(), m.end(), foo); // для каждого элемента множества m вызываем функцию foo
}
Добавлено через 22 секунды
http://www.cplusplus.com/reference/map/map/
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
06.06.2013, 00:45     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #7
А от мое элегантно решение:
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
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
#include <string>
using std::string;
#include <cstdlib>
using std::exit;
 
int main()
{
    string str="Hello, World! This is the test program. Bye World.";
    cout <<"vvedite ctroky... "<<endl;
    getline(cin,str);
    int pos=0;
    string s;
 
    //удаляем символы ,.! со строки
    s=",.!";
    pos=str.find_first_of(s);
    while(pos!=string::npos)
    {
        str.replace(pos,1,0,'!');
        pos=str.find_first_of(s);
    }
 
    //ищем слова и подсчитываем количество
    int count(0);
    pos=0;
    while(pos!=string::npos)
    {
        count=1;
        int pos2=str.find(' ',pos);
        if(pos2!=string::npos)
        {
            s=str.substr(pos,pos2-pos);
            int p=str.find(s,pos+1);
            while(p!=string::npos)
            {
                str.replace(p,s.length(),0,'1');
                count++;
                p=str.find(s,pos+1);
            }
            cout <<s<<" - "<<count<<endl;
            pos=pos2+1;
        }
        else
        {
            if(pos+1>=str.length())
                break;
            else
            {
                s=str.substr(pos);
                cout <<s<<" - "<<count<<endl;
                break;
            }
        }
    }
 
    return 0;
}
MrGluck
Модератор
Эксперт CЭксперт С++
7001 / 4172 / 595
Регистрация: 29.11.2010
Сообщений: 11,075
06.06.2013, 00:55     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #8
Цитата Сообщение от ninja2 Посмотреть сообщение
//удаляем символы ,.! со строки
erase нам не подходит?
MrGluck
06.06.2013, 01:21
  #9

Не по теме:

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

gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 150
Завершенные тесты: 1
06.06.2013, 12:52  [ТС]     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #10
ninja2, спасибо большое!

Добавлено через 14 минут
ninja2, можете еще немного объяснить этот кусок кода?
Кликните здесь для просмотра всего текста
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
while(pos != string::npos)
    {
        count = 1;
        int pos2 = str.find(' ', pos);
        if(pos2 != string::npos)
        {
            s = str.substr(pos, pos2-pos);
            int p = str.find(s, pos+1);
            while(p != string::npos)
            {
                str.replace(p, s.length(), 0, '1');
                count++;
                p = str.find(s, pos+1);
            }
            cout << s << " - " << count << endl;
            pos = pos2+1;
        }
        else
        {
            if(pos+1 >= str.length())
                break;
            else
            {
                s = str.substr(pos);
                cout << s << " - " << count << endl;
                break;
            }
        }
    }


Добавлено через 8 минут
если ввести 3 и больше одинаковых слов подряд, оно выводит информацию и зависает в бесконечном цикле...
например, попробуйте ввести
hello hello hello
результат будет
hello - 3
но программа не закончится...
ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
06.06.2013, 15:27     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
#include <string>
using std::string;
#include <cstdlib>
using std::exit;
 
int main()
{
    string str="Hello, World! This is the test program. Bye World.";
    cout <<"vvedite ctroky... "<<endl;
    getline(cin,str);
    int pos=0;
    string s;
 
    //удаляем символы ,.! со строки
    s=",.!";
    pos=str.find_first_of(s);
    while(pos!=string::npos)
    {
        str.replace(pos,1,0,'!');
        pos=str.find_first_of(s);
    }
 
    //ищем слова и подсчитываем количество
    int count(0);
    pos=0;
    while(pos!=string::npos)
    {
        count=1;
        int pos2=str.find(' ',pos);
        if(pos2!=string::npos)
        {
            s=str.substr(pos,pos2-pos);
            int p=str.find(s,pos+1);
            while(p!=string::npos)
            {
                str.replace(p,s.length(),0,'1');
                count++;
                if(count==100) break;
                p=str.find(s,pos+1);
            }
            if(count==100) break;
            cout <<s<<" - "<<count<<endl;
            pos=pos2+1;
        }
        else
        {
            if(pos+1>=str.length())
                break;
            else
            {
                s=str.substr(pos);
                cout <<s<<" - "<<count<<endl;
                break;
            }
        }
    }
 
    return 0;
}
Добавлено через 2 минуты
Это так гамнокодец, лучше конечно строку разбить на слова записать в массив, потом подсчитать количество слов и записать в другой массив их количество, затем ужи вывесит. Так лучше б было б.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 22:39     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова)
Еще ссылки по теме:
Строки: вывести слова с наименьшим количеством букв; удалить слова, начинающиеся с маленькой буквы C++
Работа со строками: выводит все слова, с четным количеством букв C++
C++ Напечатать все слова строки, предварительно удалив из каждого слова все предыдущие вхождения последней буквы
Дана строка. Вывести все слова, содержащиеся в строке, в столбец. C++
Преобразовать строку таким образом, чтобы цифры каждого слова были перенесены в начало слова без изменения порядка следования их в слове C++

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

Или воспользуйтесь поиском по форуму:
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 150
Завершенные тесты: 1
06.06.2013, 22:39  [ТС]     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова) #12
ninja2, я как раз и пытался так сделать, но потратил кучу времени, и ничего толкового не получилось(
спасибо еще раз, так даже лучше)
Yandex
Объявления
06.06.2013, 22:39     Работа со строчками (вывести в столбец все слова без повторений и количеством использования каждого слова)
Ответ Создать тему
Опции темы

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