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

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

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

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

05.06.2013, 23:11. Просмотров 1092. Ответов 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++
Близиться сессия,а завтра мне сдавать 2 проги. Помогите ребят,могу даже 100 скинуть,если уж так трудно помочь. 8.Задан...

Вывести слова без повторений,которые имеют больше гласных,чем согласных. - C++
Пусть у нас есть текстовый файл,на который не накладываются ограничения относительно его размера. Также не накладываются ограничения на...

Поменять местами первые слова (слова разделены пробелами) заданных строк, без использования процедур - C++
Вводятся две строки произвольного текста. Поме-нять местами их первые слова (слова разделены пробелами). без подпроцедур.

Из заданной строки, распечатать все слова без повторений (как добавить функцию strcmp) - C++
Из заданной строки, распечатать все слова без повторений, используя функции strtok, strcmp. #include <iostream> #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MrGluck
Модератор
Эксперт CЭксперт С++
7211 / 4377 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
Сообщений: 151
Завершенные тесты: 1
05.06.2013, 23:36  [ТС] #3
MrGluck, не работает. vs2010 выдает 6 ошибок...
MrGluck
Модератор
Эксперт CЭксперт С++
7211 / 4377 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
Сообщений: 151
Завершенные тесты: 1
05.06.2013, 23:46  [ТС] #5
MrGluck, я бы с радостью, но сдавать мне это нужно будет вообще на vs2008.
да и тем более с такого кода я понимаю смысл всего нескольких строк, а мне еще нужно будет объяснить как оно работает..(
MrGluck
Модератор
Эксперт CЭксперт С++
7211 / 4377 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
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
231 / 187 / 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Эксперт С++
7211 / 4377 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
06.06.2013, 00:55 #8
Цитата Сообщение от ninja2 Посмотреть сообщение
//удаляем символы ,.! со строки
erase нам не подходит?
MrGluck
06.06.2013, 01:21
  #9

Не по теме:

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

gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 151
Завершенные тесты: 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
231 / 187 / 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 минуты
Это так гамнокодец, лучше конечно строку разбить на слова записать в массив, потом подсчитать количество слов и записать в другой массив их количество, затем ужи вывесит. Так лучше б было б.
gorus95
5 / 5 / 1
Регистрация: 22.12.2012
Сообщений: 151
Завершенные тесты: 1
06.06.2013, 22:39  [ТС] #12
ninja2, я как раз и пытался так сделать, но потратил кучу времени, и ничего толкового не получилось(
спасибо еще раз, так даже лучше)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 22:39
Привет! Вот еще темы с ответами:

Вывести все слова с максимальным количеством букв - C++
Дана строка текста, в которой слова разделены пробелами. Необходимо: - определить количество слов в строке;...

Вывести слова, содержащие гласные. Без использования встроенных функций - C++
Доброго времени суток! У меня есть программа, которая выводит в консоль слова, в которой есть гласные буквы. Но не устраивает, что в ней...

Строки: вывести слова с наименьшим количеством букв; удалить слова, начинающиеся с маленькой буквы - C++
Здравствуйте. Помогите, пожалуйста сделать программу... Задание: Составить программу, которая выводит на экран слова с наименьшим...

Работа со строками: выводит все слова, с четным количеством букв - C++
Требуется помощь в написании следующей программы: С клавиатуры вводится текстовая строка. Составить программу, которая: ...


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

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

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