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

Не могу освоить использование контейнеров STL (решить задачу) - C++

Восстановить пароль Регистрация
 
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
04.03.2013, 22:46     Не могу освоить использование контейнеров STL (решить задачу) #1
Последняя (надеюсь) лаба по СТЛ...
Котегорически в них ничего не понимаю
Буду очень блогодарен за решение этой задачки с как можно большим количеством коментариев к нему
и примером текста во входном файле.

Домашние животные
Исходный текстовый файл input.txt содержит строки с информацией об одном домашнем животном и состоит из четырёх полей:
• имя владельца (однозначно идентифицирует владельца);
• вид животного (кот, собака и т.д.);
• кличка (может отсутствовать);
• возраст в годах.
Допускается ситуация, когда несколько строк файла совпадают (10 одинаковых безымянных рыбок).
Все поля разделены запятыми, отсутствие клички обозначается двумя запятыми, стоящими подряд. Вам необходимо:
• прочитать содержимое файла в один или несколько контейнеров, наиболее подходящих, на Ваш взгляд;
• после этого реализовать ответы на следующие запросы:
1. Посчитать количество различных видов животных у каждого владельца.
2. Для конкретного вида животного (вводится пользователем) вывести всех его владельцев и клички. Владельцы и клички не должны повторяться.
3. Определить, сколько видов животных носит определённую кличку (кличка вводится пользователем).
4. Вывести информацию о возрасте самого старого и самого молодого животного каждого вида.
Реализацию запросов выполнить через меню. Предусмотреть ситуацию, когда пользователь вводит отсутствующую информацию.

Заранее спасибо))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2013, 22:46     Не могу освоить использование контейнеров STL (решить задачу)
Посмотрите здесь:

C++ использование stl
Использование алгоритмов STL C++
C++ Использование STL в DLL-файлах
C++ Использование двух контейнеров из STL
Задачу с использованием STL. Разработать шаблон класса для работы с односвязным списком C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
afaafa
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 8
04.03.2013, 23:01     Не могу освоить использование контейнеров STL (решить задачу) #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include  <iostream>
using namespace std;
int main()
{
   int x;
   int max=0;
   int n;
   
   std::cin>>x;
   int temp=x<0?-x:x;
   while(temp){
       max=(n=temp%10)>max?n:max;
       temp/=10;
   }
   std::cout<<max<<std::endl;
 
 
return 0;
}
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
05.03.2013, 00:15  [ТС]     Не могу освоить использование контейнеров STL (решить задачу) #3
Оу... что не то это...

Добавлено через 42 минуты
Хелп ми!!! Завтра сдать уже нужно
Vyzov
6 / 6 / 1
Регистрация: 19.02.2013
Сообщений: 64
05.03.2013, 18:41  [ТС]     Не могу освоить использование контейнеров STL (решить задачу) #4
Ну да STL

Добавлено через 7 часов 54 минуты
Просьба к модераторам удалить эту тему

Добавлено через 15 минут
Удалили репост =)
Остаемся здесь

Добавлено через 8 часов 47 минут
Время уже не критично, просто помогите выполнить.
Буду очень признателен.
011
9 / 9 / 0
Регистрация: 28.11.2013
Сообщений: 149
05.02.2016, 19:04     Не могу освоить использование контейнеров STL (решить задачу) #5
Вот мое неидеальное решение. (Да-да, уже несколько лет прошло, но судя по личному опыту, эту задачу все еще некоторые решают).
Код

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <fstream>
#include <sstream>
#include <set>
#include <algorithm>
#include <Windows.h> // для настройки консоли (ввод/вывод кириллицы)
using namespace std;
 
struct Note
{
    string typeOfAnimal;
    string name = "";
    unsigned age;
};
 
typedef map<string, vector<Note> > data;
 
void input(data &DATA, ifstream &in)
{
    string tmp = "";
    while (getline(in, tmp)) // считываем построчно
    {
        int i = 0;
        vector <string> s(5);
        stringstream str(tmp);
        while (getline(str, s[i++], ',')); // считали строку в вектор стрингов
 
        if (s[2].empty())
            s[2] = "<empty>";
 
        data::iterator it = DATA.find(s[0]);
        if (it != DATA.end())
        {
            Note nt;
            nt.typeOfAnimal = s[1];
            nt.name = s[2];
            nt.age = stoi(s[3]);
            it->second.push_back(nt);
        }
        else
        {
            Note nt;
            nt.typeOfAnimal = s[1];
            nt.name = s[2];
            nt.age = stoi(s[3]);
            DATA[s[0]] = { nt };
        }               
    }
}
 
unsigned countSortsForOwner(vector<Note> data)
{
    set<string> sorts;
    
    for (vector<Note>::iterator it = data.begin(); it != data.end(); ++it)
        sorts.insert(it->typeOfAnimal);
            
    return sorts.size();
}
void printCountSortsForOwner(data DATA)
{
    for (data::iterator it = DATA.begin(); it != DATA.end(); ++it)
        cout << it->first << ": " << countSortsForOwner(it->second) << endl;
}
void printAllOwnersAndNamesForAnimal(data DATA, string typeOfAnimal)
{
    set<string> owners, names;
    for (data::iterator it = DATA.begin(); it != DATA.end(); ++it)
    {
        int sz = it->second.size();
        for (int i = 0; i < sz; ++i)
        {
            if (it->second[i].typeOfAnimal.compare(typeOfAnimal) == 0)
            {
                owners.insert(it->first);
                names.insert(it->second[i].name);
            }
        }
    }
    cout << "Вид животного: " << typeOfAnimal << endl;
    if (owners.empty())
        cout << "Такого вида во входных данных нет." << endl;
    else
    {
        set<string>::iterator it1 = owners.begin();
        set<string>::iterator it2 = names.begin();
        cout << "Список владельцев: ";
        for (; it1 != owners.end(); ++it1)
            cout << *it1 << ", ";
        cout << endl << "Список кличек: ";
        for (; it2 != names.end(); ++it2)
            cout << *it2 << ", ";
        cout << endl;
    }
}
void printCountAnimalSortsForName(data DATA, string name)
{
    set<string> types;
    for (data::iterator it = DATA.begin(); it != DATA.end(); ++it)
    {
        int sz = it->second.size();
        for (int i = 0; i < sz; ++i)
            if (it->second[i].name.compare(name) == 0)
                types.insert(it->second[i].typeOfAnimal);
    }
    cout << types.size() << " вид(а)(ов) животных носит кличку " << name << endl;
}
void printMaxMinAgesForEachSort(data DATA)
{
    map<string, vector<int> > animalAges;
    for (data::iterator it = DATA.begin(); it != DATA.end(); ++it)
    {
        int sz = it->second.size();
        for (int i = 0; i < sz; ++i)
            animalAges[it->second[i].typeOfAnimal].push_back(it->second[i].age);
    }
    map<string, vector<int> >::iterator iter = animalAges.begin();
    vector<int>::iterator i;
    for (; iter != animalAges.end(); ++iter)
    {
        cout << iter->first << endl;
        sort(iter->second.begin(), iter->second.end());
        int sz = iter->second.size();
        cout << "Max: " << iter->second[0] << "  Min: " << iter->second[sz - 1] << endl;
    }
}
void print(data DATA)
{
    cout << "======ВХОДНЫЕ ДАННЫЕ======" << endl;
    for (data::iterator it = DATA.begin(); it != DATA.end(); ++it)
    {
        cout << it->first << ':' << endl;
        int sz = it->second.size();
        for (int i = 0; i < sz; ++i)
            cout << '\t' << it->second[i].typeOfAnimal << '\t' << it->second[i].name << '\t' << it->second[i].age << endl;
    }
    cout << "==========================" << endl;
}
 
int main()
{
    SetConsoleCP(1251);       // установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
 
    ifstream in("input.txt");
    data DATA;
    input(DATA, in);
    int ans;
    do
    {   
        cout << "-----------------------------------------------------------------------------------------" << endl;
        cout << "1. Посчитать количество различных видов животных у каждого владельца." << endl;
        cout << "2. Для конкретного вида животного вывести всех его владельцев и клички." << endl;
        cout << "3. Определить, сколько видов животных носит определённую кличку." << endl;
        cout << "4. Вывести информацию о возрасте самого старого и самого молодого животного каждого вида." << endl;
        cout << "5. Показать входные данные." << endl;
        cout << "6. Очистить экран." << endl;
        cout << "0. EXIT." << endl;
        cout << "-----------------------------------------------------------------------------------------" << endl << endl;
        cout << "Введите Ваш выбор: ";
        cin >> ans;     
        cout << endl;
        switch (ans)
        {
        case 1: printCountSortsForOwner(DATA); break;
        case 2:
        {
            cout << "Введите вид животного: ";
            string animal;
            cin >> animal;
            printAllOwnersAndNamesForAnimal(DATA, animal);
            break; 
        }
        case 3:
        {
            cout << "Введите кличку: ";
            string name; cin >> name;
            printCountAnimalSortsForName(DATA, name);
            break;
        }
        case 4: printMaxMinAgesForEachSort(DATA); break;
        case 5: print(DATA); break;
        case 6: system("cls"); break;
        default:
            break;
        }
        
    } while (ans != 0);
 
    in.close();
    return 0;
}

Пример input.txt

Код
Иванов,собака,,2,
Сидорова,рыбка,,5,
Иванов,собака,барбос,3,
Иванов,кот,барсик,1,
Иванов,бык,Вася,12,
Михалыч,кот,Мурзик,7,
Майорова,кот,Филька,2,
Майорова,кот,Максим,3,
Петров,собака,барбос,1,

Для input.txt существенно, чтобы каждая строка завершалась запятой.

Кстати, может, кто-нибудь объяснит, почему в строке 127 не получается писать что-то вроде:
C++
1
cout << "Max: " << *iter->second.begin() << "  Min: " << *iter->second.end() << endl;
Т.е. как вывести значения вектора, который лежит в map'e (вектор -- second в map'е), используя методы вектора begin() и end()?
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
06.02.2016, 10:11     Не могу освоить использование контейнеров STL (решить задачу) #6
011, это так и должно работать. только итератор end обычно указывает не на последний элемент, а на элемент после последнего, его нельзя разименовывать. попробуй так.
C++
1
cout << "Max: " << *iter->second.begin() << "  Min: " << *iter->second.rbegin() << endl;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.02.2016, 11:07     Не могу освоить использование контейнеров STL (решить задачу)
Еще ссылки по теме:

C++ Не могу освоить функций
Расширение stl контейнеров C++
C++ Синхронизация контейнеров (STL)

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

Или воспользуйтесь поиском по форуму:
011
9 / 9 / 0
Регистрация: 28.11.2013
Сообщений: 149
06.02.2016, 11:07     Не могу освоить использование контейнеров STL (решить задачу) #7
Babysitter, работает, благодарю.
Yandex
Объявления
06.02.2016, 11:07     Не могу освоить использование контейнеров STL (решить задачу)
Ответ Создать тему
Опции темы

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