23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425

Ввод с клавиатуры multimap

12.05.2020, 13:07. Показов 4151. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, как можно добавлять элементы с клавиатуры в multimap? Вот код. Я понял только как вводить вручную...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//books.h
#pragma once
#include <string.h>
#include <iostream>
using namespace std;
 
class Books {
public:
    Books()
        : LastName(" "), FirstName(" "), phone(0)
    {}
 
    Books(string ln, string fn, int ph)
        : LastName(ln), FirstName(fn), phone(ph)
    {}
 
private:
    string LastName;
    string FirstName;
    int phone;
 
    friend ostream &operator<<(ostream &o, const Books &p);
};
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
//SonsoleApp.cpp
#include <map>
#include <string>
#include "Books.h"
using namespace std;
 
//--------------------------------------------------------------------------------------
 
//--------------------------------------------------------------------------------------
ostream &operator<<(ostream &o, const Books &p)
{
    o << "FirstName: " << p.FirstName << endl;
    o << "LastName: " << p.LastName << endl;
    o << "Phone: " << p.phone << endl;
    return o;
}
 
int main()
{
    multimap<char, Books> Nboock;
 
    Nboock.insert(make_pair('A', Books("Artem1", "Kalugniy1", 345678)));
    Nboock.insert(make_pair('B', Books("Artem2", "Kalugniy2", 345678)));
    Nboock.insert(make_pair('C', Books("Artem3", "Kalugniy3", 345679)));
;
    for (multimap<char, Books>::iterator It = Nboock.begin(); It != Nboock.end(); ++It)
        cout << It->second << endl;
    return 0;
    
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2020, 13:07
Ответы с готовыми решениями:

Ввод с клавиатуры, анализ, multimap
Пытаюсь сделать переводчик на основе multimap, по заданию словарь небольшой ~20 слов, с файла считываю, создаю карту, а вот с анализом...

Multimap. Ошибка operator+ not implemented in type multimap
Я начинающий в си, есть задача подсчета частоты встречаемости символов, делал через ассоциативный массив map&lt;char, int&gt;, программа...

Как правильно заменить ввод данных простой на ввод с клавиатуры?
#include &quot;stdafx.h&quot; #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) ...

41
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.05.2020, 13:54
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Понял, хорошо, спасибо. То есть, first и second - ключи. И для того, чтобы удалить, необходимо ввести либо first, либо second соответственно, верно?
Нет. Ключ - это first.
second - это данные
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
13.05.2020, 14:09  [ТС]
Получается следовательно, если мы введём тут first - то все данные абсолютно удалятся?
C++
1
2
3
4
5
6
7
case 3:
{
    std::string key;
    std::cin >> key;
    Nbook.erase(key);
 
}; break;
После ввода в key "first" - у меня программа вообще завершает работу, почему-то выходит из цикло do while видимо
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.05.2020, 14:16
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Получается следовательно, если мы введём тут first - то все данные абсолютно удалятся?
Вообще ничего не удалится. Здесь надо вводить фамилию и инициалы

Добавлено через 2 минуты
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
После ввода в key "first" - у меня программа вообще завершает работу, почему-то выходит из цикло do while видимо
Наверное потому, что накосячил опять где-то
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
13.05.2020, 14:19  [ТС]
ФИО: koresh
Название: 1
Год: 2001
Кол-во: 1
///////////////
При вводе "koresh" программа просто завершает работу.

Добавлено через 33 секунды
Вроде бы нет, не коясчил..
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
#include <map>
#include <string>
#include "Books.h"
using namespace std;
 
ostream &operator<<(ostream &o, const Books &p)
{
    o << "ФИО: " << p.FirstName << endl;
    o << "Название: " << p.LastName << endl;
    o << "Год издания: " << p.phone << endl;
    o << "Количество экземпляров: " << p.num << endl;
    return o;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    multimap<std::string, Books> Nboock;
 
    int e;
    do 
    {
        system("pause");
        system("cls");
        cout << "=> Введите номер выбора: " << endl;
        cout << "1. Заполнить.  " << endl;
        cout << "2. Показать" << endl;
        cout << "3. Удалить списанные книги" << endl;
        cin >> e;
        switch (e)
        {
        case 1:
        {
            for (int i = 0;i < 2;i++)
            {
                string LastName;
                string FirstName;
                int phone;
                int num;
                cout << "ФИО: ";
                cin >> FirstName;
                cout << "Название: ";
                cin >> LastName;
                cout << "Год: ";
                cin >> phone;
                cout << "Кол-во экземпляров: ";
                cin >> num;
                /*std::string key = LastName + " " + FirstName[0];*/
                string key;
                Nboock.insert({ key, Books(FirstName, LastName, phone, num) });
            }
        }; break;
        case 2:
        {
            for (auto &item : Nboock)
            {
                std::cout << item.first << std::endl;
                std::cout << item.second << std::endl;
            }
        }; break;
        case 3:
        {
            string key;
            cout << "Введите ключ книги: " << endl;
            cin >> key;
            Nboock.erase(key);
 
        }; break;
        
        }
    } while (e != 3);
 
 
 
 
 
 
 
 
}
Добавлено через 1 минуту
Нашёл ошибку.
C++
1
while (e != 4);
Вот так должно быть. Но оно все равно не хочет удалять
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.05.2020, 14:20
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
/*std::string key = LastName + " " + FirstName[0];*/
            string key;
            Nboock.insert({ key, Books(FirstName, LastName, phone) });
А зачем ты здесь закоментарил ключ? Они у тебя все пустые будут, как ты собираешься идентифицировать запись?
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
13.05.2020, 14:25  [ТС]
Вернул данную запись. Теперь при удалении нужно как раз таки вводить название этого ключа?
Фрагмент консоли:

///////
Lol L
ФИО: lol
Название: Lol
Год: 2001
Кол-во: 1
....................
При вводе в key Lol L, или же lol - программа крашится
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.05.2020, 14:34
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
При вводе в key Lol L, или же lol - программа крашится
Запусти под отладчиком, F5, посмотри, где именно
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
13.05.2020, 15:22  [ТС]
Она как бы не крашится, просто при удалении пишет: "для продолжения нажмите любую клавишу", и так всё, зависает. В VS 2017 откладка показывает ошибки только тогда, когда программа вылетает или находит ошибки

Добавлено через 19 минут
C++
1
2
3
4
5
6
7
8
        case 3:
        {
            string key1;
            cout << "Введите ключ книги: " << endl;
            cin >> key1;
            Nboock.erase(key);
        
        }; break;
Попробовал поменять тут переменную key на key1, ибо key уже существовала, и подумал, что они могут между друг другом конфликтовать. Всё равно та же беда, не удаляет

Добавлено через 26 минут
На данный момент вот что у меня:
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
#include <map>
#include <string>
#include "Books.h"
using namespace std;
 
ostream &operator<<(ostream &o, const Books &p)
{
    o << "ФИО: " << p.FirstName << endl;
    o << "Название: " << p.LastName << endl;
    o << "Год издания: " << p.phone << endl;
    o << "Количество экземпляров: " << p.num << endl;
    return o;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    multimap<std::string, Books> Nboock;
 
    int e;
    do 
    {
        system("pause");
        system("cls");
        cout << "=> Введите номер выбора: " << endl;
        cout << "1. Заполнить.  " << endl;
        cout << "2. Показать" << endl;
        cout << "3. Удалить списанные книги" << endl;
        cin >> e;
        switch (e)
        {
        case 1:
        {
            int pop;
            cout << "Введмте количество книг, которое хотите добавить в библиотеку: " << endl;
            cin >> pop;
            for (int i = 0;i < pop;i++)
            {
                string LastName;
                string FirstName;
                int phone;
                int num;
                cout << "ФИО: ";
                cin >> FirstName;
                cout << "Название: ";
                cin >> LastName;
                cout << "Год: ";
                cin >> phone;
                cout << "Кол-во экземпляров: ";
                cin >> num;
                std::string key = LastName + " " + FirstName[0];
                
                Nboock.insert({ key, Books(FirstName, LastName, phone, num) });
            }
        }; break;
        case 2: //просмотр
        {
            for (auto &item : Nboock)
            {
                std::cout << item.first << std::endl; //ключ
                std::cout << item.second << std::endl; //данные
            }
        }; break;
        case 3: //удаление
        {
            for (auto &item : Nboock)
            {
                std::cout << item.first << std::endl; //ключ
                std::cout << item.second << std::endl; //данные
            }
            string key;
            cout << "Введите ключ книги: " << endl;
            cin >> key;
            Nboock.erase(key);
        
        }; break;
        
        }
    } while (e != 4);
 
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.05.2020, 15:26
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
На данный момент вот что у меня:
Всё должно работать
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
13.05.2020, 15:32  [ТС]
Так, может что-то путаю тут. Загрузил картинку с консоли. Для того, чтобы удалить, нужно ввести: "1 1", так?
Изображения
 
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.05.2020, 15:33
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Так, может что-то путаю тут. Загрузил картинку с консоли. Для того, чтобы удалить, нужно ввести: "1 1", так?
Ну да
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
13.05.2020, 15:35  [ТС]
Странно очень. Он просто не хочет удалять ничего
Миниатюры
Ввод с клавиатуры multimap   Ввод с клавиатуры multimap  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.05.2020, 15:44
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Странно очень. Он просто не хочет удалять ничего
Ты как-то смотри, что вводится
C++
1
2
3
4
5
            string key;
            cout << "Введите ключ книги: " << endl;
            std::cin.ignore();
            std::getline(std::cin, key);
            Nboock.erase(key);
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
13.05.2020, 15:47  [ТС]
Ааа, блин, точно, считывать же ввод нужно, а я просто тупо переменную вводил))
Спасибо большое, Олег, вы мне очень помогли! <3
0
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
14.05.2020, 15:18  [ТС]
Я столкнулся ещё с кое какой проблемой. Сделал я сортировку по фамилиям(в задании было такое, но не вижу смысла этого делать, поскольку multimap сам сортирует по ключам), но вот чтобы сортировать данные после заполнения по годам издания - не выходит. Вычитал на одном форуме, что нужно сначала все данные пихать в вектор, а затем как-то сортировать. Есть ли варианты попроще?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2020, 15:20
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Вычитал на одном форуме, что нужно сначала все данные пихать в вектор, а затем как-то сортировать. Есть ли варианты попроще?
Нет, только копировать дынные в массив и потом сотрировать
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
14.05.2020, 15:23  [ТС]
Я ещё слышал о некой сортировке по ключам, так не выйдет сделать?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2020, 15:27
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Я ещё слышал о некой сортировке по ключам, так не выйдет сделать?
Это std::multimap и есть. Можно и через него, без разницы, по-любому новый контейнер создавать.

В массив, кстати, можно не копировать, а сделать массив указателей
1
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425
14.05.2020, 15:31  [ТС]
Это выходит приблизительно так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    setlocale(LC_ALL, "Russian");
    multimap<std::string, Books> Nboock; //имеющаяся мапа, в которую идет запись с сортом по авторам
multimap<std::string, Books> SortDate;//для сортировки по датам(только что создали)
SortDate = Nboock;
......
cout << "ФИО: ";
                cin >> FirstName;
                cout << "Название: ";
                cin >> LastName;
                cout << "Год: ";
                cin >> phone;
                cout << "Кол-во экземпляров: ";
                cin >> num;
//это всё, что мы заполняем.
и далее, просто брать phone и сравнивать
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2020, 15:34
Цитата Сообщение от Pandaprogrammer Посмотреть сообщение
Это выходит приблизительно так?
Сделай тогда уж

C++
1
2
multimap<std::string, std::shared_ptr<Books>> Nboock; //имеющаяся мапа, в которую идет запись с сортом по авторам
multimap<std::string, std::shared_ptr<Books>> SortDate;//для сортировки по датам(только что создали)
Чтоб не копировать объекты
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2020, 15:34

Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур
Добрый вечер)) У меня небольшой вопрос. Почему первые буквы (в названии книг) не выводит на экран? Само задание: О каждой книге ...

Переделать ввод из файла на ввод с клавиатуры
void openfile(int**a) { std::ifstream file(&quot;input.txt&quot;, std::ios_base::binary); file.seekg(0, std::ios::end); int txtlen =...

Ввод с клавиатуры - требовать у пользователя ввод, пока он не будет корректным
Поискал в интернете и тут - не могу найти ответ на свой вопрос. Основная проблема - фильтровать введённые данные пользователя (введённые...

Ввод символов с клавиатуры в ОЗУ с использованием режима ожидания готовности контроллера клавиатуры
. Разработать алгоритм ввода символов с клавиатуры в ОЗУ с использованием режима ожидания готовности контроллера клавиатуры. Текст ввода...

Для задания исходной матрицы предусмотреть ввод с клавиатуры или ввод с помощью датчика случайных чисел
Разработать алгоритм и написать программу на языке Turbo Pascal. Задана матрица (двумерный массив) A размером N x М, состоящая из...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru