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

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

Войти
Регистрация
Восстановить пароль
 
qwer_11
2 / 2 / 0
Регистрация: 30.10.2011
Сообщений: 16
#1

задача с stl библиотекой и файлами - C++

21.11.2011, 14:21. Просмотров 746. Ответов 7
Метки нет (Все метки)

В текстовом файле input.txt записаны слова – по одному в строке. Необходимо разбить слова на группы так, чтобы в одну группу попали все слова, составленные из одного и того же множества символов. Иными словами, в каждом слове группы должны быть использованы все символы этой группы (может быть, несколько раз). Так, слова «окно» и «конка» не входят в одну группу, а слова «конник» и «инок» - входят. Программа должна подсчитать количество найденных групп и выдать результат на консоль.

Добавлено через 21 час 5 минут
подскажите кто-нить идейку
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2011, 14:21     задача с stl библиотекой и файлами
Посмотрите здесь:

C++ Задача на работу с файлами
C++ Задача на С++. Алгоритмы библиотеки STL.
Задача с файлами и строками! C++
Библиотека STL, + задача с её использованием C++
Задача по контейнерам stl vector и list C++
C++ Задача по STL (Создать объект-контейнер, очередь с приоритетом, заполнить ее данными, тип char)
Задача по STL (В строке текста, все числа, встречающиеся перевернуть, оставив на месте) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
21.11.2011, 14:30     задача с stl библиотекой и файлами #2
можно так,берете первое слово,удаляете из него все повторяющиеся буквы и выстраиваете их в лексографическом порядке то же самое проделываете с остальными.последовательно сравниваете первое слово с остальными удаляя те которые совпадают.переход на второе слово и сравнение и так пока есть слова
qwer_11
2 / 2 / 0
Регистрация: 30.10.2011
Сообщений: 16
21.11.2011, 14:35  [ТС]     задача с stl библиотекой и файлами #3
а что это за лексикографический порядок?
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
21.11.2011, 14:40     задача с stl библиотекой и файлами #4
в порядке расположения букв в алфавите
абвг
qwer_11
2 / 2 / 0
Регистрация: 30.10.2011
Сообщений: 16
21.11.2011, 19:19  [ТС]     задача с stl библиотекой и файлами #5
а не подскажет как реализовать этот лексикографический порядок??
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
21.11.2011, 20:42     задача с stl библиотекой и файлами #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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <map>
#include <vector>
 
int main()
{
    const char* filename = "input.txt";
    std::ifstream fin(filename);
 
    if(!fin.is_open())
    {
        std::cout << "can`t open file " << filename << '\n';
        return 0;
    }
 
    std::string word;
    std::map< std::string, std::vector<std::string> > groups;
 
    while(fin >> word)
    {
        std::set<char> char_set(word.begin(), word.end());
        groups[std::string(char_set.begin(), char_set.end())].push_back(word);
    }
 
    fin.close();
 
    for(std::map< std::string, std::vector<std::string> >::iterator it = groups.begin();
        it != groups.end(); ++it)
    {
        std::cout << it->first << ": \n";
        for(size_t i = 0; i < it->second.size(); ++i)
            std::cout << it->second[i] << '\n';
        std::cout << '\n';
    }
 
    std::cout << "count: " << groups.size() << '\n';
 
    return 0;
}
qwer_11
2 / 2 / 0
Регистрация: 30.10.2011
Сообщений: 16
23.11.2011, 15:13  [ТС]     задача с stl библиотекой и файлами #7
Цитата Сообщение от rangerx Посмотреть сообщение
C++
1
2
3
4
5
6
7
    while(fin >> word)
    {
        std::set<char> char_set(word.begin(), word.end());
        groups[std::string(char_set.begin(), char_set.end())].push_back(word);
    }
 
    fin.close();
если я правильно понял, то этот цикл загонят в конструктор слова из файла??
Цитата Сообщение от rangerx Посмотреть сообщение
C++
1
2
3
4
    for(std::map< std::string, std::vector<std::string> >::iterator it = groups.begin();
        it != groups.end(); ++it)
    {
        std::cout << it->first << ": \n";
а на что этот указатель??
Цитата Сообщение от rangerx Посмотреть сообщение
C++
1
2
        for(size_t i = 0; i < it->second.size(); ++i)
            std::cout << it->second[i] << '\n';
а здесь что такое second.size
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2011, 19:54     задача с stl библиотекой и файлами
Еще ссылки по теме:

Задача с файлами в с++ C++
Работа с библиотекой STL, контейнер map C++
Задача с бинарными файлами C++
Задача со строками библиотеки STL C++
C++ Работа с файлами С++. Библиотека STL

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

Или воспользуйтесь поиском по форуму:
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,905
23.11.2011, 19:54     задача с stl библиотекой и файлами #8
Цитата Сообщение от qwer_11 Посмотреть сообщение
если я правильно понял, то этот цикл загонят в конструктор слова из файла??
Думаю проще будет объяснить всё с самого начала
C++
1
std::map< std::string, std::vector<std::string> > groups;
Это ассоциативный массив, каждым элементом(значением) которого является набор слов(динамический массив строк std::vector<std::string>), а индексом(ключём) группа символов(str::string), к которой этот набор слов относится.
C++
1
while(fin >> word)
Начинаем последовательно считывать слова в строковую переменую word.
C++
1
2
// std::set это контейнер, который хранит отсортированный набор элементов заданного типа без повторений. 
std::set<char> char_set(word.begin(), word.end());
Помещаем в множество char_set символы из строки word. Тем самым получаем имя группы, в которую входит текущее слово.
C++
1
std::string(char_set.begin(), char_set.end())
Из множества символов контейнера char_set "на лету" создаём строку(имя группы) и передаём её в качестве индекса(ключа) ассоциативному массиву(если такого элемента нет, то он будет создан)
C++
1
groups[std::string(char_set.begin(), char_set.end())]
Значением этого элемента массива будет динамический массив строк(std::vector<std::string>) соответствующий указанной в качестве индекса массива группе символов.
C++
1
.push_back(word)
помещает в этот массив текущее слово.
Цитата Сообщение от qwer_11 Посмотреть сообщение
а на что этот указатель??
std::map это бинарное дерево, в котором пара ключ-значение хранится в виде стандартной шаблонной структуры std::pair из заголовочного файла <utility>. Поля этой структуры имеют имена first и second. it это указатель(итератор) на текущую пару ассоциативного массива. Поле first соответствует ключу, а second значению. Другими слововами, it->first это имя группы, а it->second набор слов(std::vector<std::string>).
Цитата Сообщение от qwer_11 Посмотреть сообщение
а здесь что такое second.size
Получение размера текущего массива.
Yandex
Объявления
23.11.2011, 19:54     задача с stl библиотекой и файлами
Ответ Создать тему
Опции темы

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