Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/19: Рейтинг темы: голосов - 19, средняя оценка - 4.68
23 / 21 / 2
Регистрация: 04.09.2019
Сообщений: 425

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

12.05.2020, 13:07. Показов 4092. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru