Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68

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

04.03.2013, 22:46. Показов 2263. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Последняя (надеюсь) лаба по СТЛ...
Котегорически в них ничего не понимаю
Буду очень блогодарен за решение этой задачки с как можно большим количеством коментариев к нему
и примером текста во входном файле.

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

Заранее спасибо))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.03.2013, 22:46
Ответы с готовыми решениями:

Использование двух контейнеров из STL
Нужно, чтобы: 1) Каждый объект имел свой уникальный ключ. 2) Быстрая выборка по ключу. 3) Быстрое прохождение по всем объектам. ...

не могу освоить задачу в екселе
перенос даныых в таблицу через бланк по поиску строки

не могу решить задачу(
Даны 2 массива x и y, состоящие из n элементов каждый. Найти для массива x среднее арифметическое значение ex элементов, имеющих чётные...

6
0 / 0 / 0
Регистрация: 02.03.2013
Сообщений: 8
04.03.2013, 23:01
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;
}
0
6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68
05.03.2013, 00:15  [ТС]
Оу... что не то это...

Добавлено через 42 минуты
Хелп ми!!! Завтра сдать уже нужно
0
6 / 6 / 2
Регистрация: 19.02.2013
Сообщений: 68
05.03.2013, 18:41  [ТС]
Ну да STL

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

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

Добавлено через 8 часов 47 минут
Время уже не критично, просто помогите выполнить.
Буду очень признателен.
0
10 / 10 / 1
Регистрация: 28.11.2013
Сообщений: 153
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

Code
1
2
3
4
5
6
7
8
9
Иванов,собака,,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()?
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
06.02.2016, 10:11
011, это так и должно работать. только итератор end обычно указывает не на последний элемент, а на элемент после последнего, его нельзя разименовывать. попробуй так.
C++
1
cout << "Max: " << *iter->second.begin() << "  Min: " << *iter->second.rbegin() << endl;
1
10 / 10 / 1
Регистрация: 28.11.2013
Сообщений: 153
06.02.2016, 11:07
Babysitter, работает, благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2016, 11:07
Помогаю со студенческими работами здесь

Синхронизация контейнеров (STL)
Добрый день, задание следующее: 1) написать функцию которая принимает в качестве аргумента ссылку или указатель на вектор, заполняет...

Расширение stl контейнеров
Собственно сабж. Из идей: 1. class MyC { public: .... //reimplement stl func

Таблица STL контейнеров
Привет. Есть у кого может такая таблица, как по этой ссылке? https://ru.cppreference.com/w/cpp/container хочу скачать и себе распечатать.

Сортировка STL контейнеров
Почему выдается ошибка &quot; request for member 'sort' in 'vec', which is of non-class type 'std :: pair&lt;int, std::vector&lt;int&gt; &gt; '&quot;...

Не могу тех задачу решить
Не могу тех задачу решить. Может у тебя есть мысль? Нужно распечатать изображение из пришедшего по е-почте файла, формат которого всегда...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru