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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Создайте функцию, заменяющую содержимое двух переменных их суммой и разностью. http://www.cyberforum.ru/cpp-beginners/thread800781.html
1. Создайте функцию, заменяющую содержимое двух переменных их суммой и разностью.
C++ первая или последняя? :wall: задано трицифровое число. Как определить, какая цифра в нем есть большей – первая или последняя. http://www.cyberforum.ru/cpp-beginners/thread800777.html
C++ Разработать шаблон класса для работы с очередью с двусторонним доступом выполненной в виде двусвязного списка
Разработать шаблон класса для работы с очередью с двусторонним доступом выполненной в виде двусвязного списка. Тип элементов задается как параметр шаблона. Написать тестовую програм- му.
Шаблоны функций. В одномерном массиве, состоящем из n вещественных элементов, вычислить номер максимального по модулю элемента массива C++
Задание 1: Работа с одномерными массивами. В одномерном массиве, состоящем из n вещественных элементов, вычислить: 1. Номер максимального по модулю элемента массива. Ознакомьтесь с правилами форума и не выкладывайте в одной теме больше одного задания. А также называйте темы так, чтобы было понятно, о чем идет речь.
C++ дружественные функции и классы http://www.cyberforum.ru/cpp-beginners/thread800767.html
Создайте программу с классом Phone, который включает в себя следующие данные-элемен¬ты о разговорах на междугородней АТС: ►дату разговора; ► код и название города; ►продолжительность разговора; ► тариф; ► номер телефона в этом городе; ►номер телефона абонента. В класс...
C++ Перегрузка операторов. Класс VECTOR Задание 1: Разработка класса. Разработайте класс VECTOR. Элемент класса: координаты вектора. Методы: конструктор без параметров ( по умолчанию); конструктор с параметрами; конструктор копирования; деструктор; подробнее

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

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