С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 16.01.2019
Сообщений: 10
1

Использование map для хранения класса

18.12.2019, 00:25. Показов 1976. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть класс Day в котором было два поля string date и vector <Task> tasks<<вектор хранит в себе другой класс с полями типа int string и тд. Тоесть мы сощдаем подобие ежедневника,но на данный момент есть возможность задания целей только на один день. Нужно добавить возможность создания второго дня в котором также будут цели(все то что есть в структуре Task),сказали использовать только map.
C++
1
2
3
4
5
6
Class Task
{
int time;
string name;
bool made;
}
C++
1
2
3
4
5
Class Day
{
string date;
vector <Task>tasks;
}
Думал написать так:
map<string,Day*> Days;
Но вот добавить сюда что-то не могу ругается на аргументы
Days.insert(pair<string,Day*>{ключ(время из класса Day),d});

Само задание:
1. Возможность добавление задачи на любой день (как на конкретное время, так и просто "в течение дня").
2. Просмотр расписания с фильтрацией: "все задачи/выполненные/не выполненные", с возможностью сортировки по приоритету/времени. Фильтры и тип сортировки задаются в настройках программы.
3. Поиск задач и их редактирование (изменение статуса "Выполнено")/удаление, как по одной, так и сразу всех найденных. Поле поиска указывает пользователь: по имени задачи (части имени)/дате.
4. Сохранение ежедневника в файл/загрузка из файла.
5. Предупреждение пользователя, если есть несохраненные данные (при выходе и загрузке нового ежедневника из файла)
Day.h
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
#pragma once
#ifndef _DAY_H_
#define _DAY_H_
#include "Task.h" 
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <ostream>
#include <sstream>
#include <algorithm>
#include <map>
using namespace std;
 
class Day 
{
    public:
        string date = "undefined";
        vector <Task> tasks;
        Day InputDay(const Day& d, const Task& t);  
        void PrintDay(const Day& d);
        void PrintForSaveDay(ostream& save, const Day& d);
        Day GetDay(istream& get);
    
};
 
 
void PrintDay(const Day& d, ChangeF Pd)
{
    cout << "Текущая дата:" << d.date << endl << "\n=============================================" << endl << "Количество задач к выполнению:" << d.tasks.size();
    cout << "\n=============================================" << endl;
    for (auto& t : d.tasks)
        PrintTask(t, Pd);
}
 
Day InputDay()
{
    setlocale(LC_ALL, "Russian");
    Day d;
    cout << "\nВвесте дату в виде дд ENTER мм ENTER гггг ENTER друг за другом" << endl;
    int dd, mm, yyyy;
    dd = DigitInputCheck(1, 30);
    mm = DigitInputCheck(1, 12);
    yyyy = DigitInputCheck(0, 4000);
    ostringstream WriteDate;
    WriteDate << dd << "." << mm << "." << yyyy << endl;
    d.date = WriteDate.str();
    cout << "Количество задач:" << endl;
    int aims;
    cin >> aims;
    for (int i = 0; i < aims; i++)
    {
        d.tasks.push_back(InputTask());
    }
 
    return d;
 
}
 
void PrintForSaveDay(ostream& save, const Day& d)
{
    save << d.date << endl << d.tasks.size();
    for (auto& t : d.tasks)
        PrintForSaveTask(save, t);
    }
 
Day GetDay(istream& get)
{
    Day d;
    int aims;
    get >> d.date >>aims ;
    for (int i = 0; i < aims; i++)
        d.tasks.push_back(GetTask(get));
    return d;
    }
 
 
 
#endif
Task.h
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
#pragma once
#ifndef _TASK_H_
#define _TASK_H_
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <ostream>
#include <sstream>
#include <algorithm>
#include <map>
using namespace std;
 
class Task
{   
public:
    string study;
    int time;
    bool made;
    int priority;
    template <typename T>
    T DigitInputCheck(T min, T max);
    Task InputTask(const Task& t);
    void PrintTask(const Task& t);
    void Change();
    string format1(int time);
    string format2(int time);
    void PrintForSaveTask(ostream& save, const Task& t);
    Task GetTask(istream& get);
    
};
 
 
 
template <typename T>
T DigitInputCheck(T min, T max)
{
    int x;
    do
    {
        cout << "Введите число (от" << min << ", " << max << "до)" << endl;
        while (!(cin >> x))
        {
            cin.clear();
            cin.ignore(10000, '\n');
        }
        
    } while (x< min || x> max);
    return x;
}
typedef string(*ChangeF)(int);
string format1(int time)
{ 
    setlocale(LC_ALL, "Russian");
    ostringstream format;
    format << time / 100 << " ч " << time % 100 << " м " << endl;
    return format.str();
}
string format2(int time)
{
    stringstream format;
    format << time / 100 << " : " << time % 100 << endl;
    return format.str();
}
void PrintTask(const Task& t, ChangeF Pt)
{
    setlocale(LC_ALL, "Russian");
    cout << "Задание:\n" << t.study << "\n\nПриоритетность: " << t.priority << endl;
    string stime = Pt(t.time);
    cout << "\nВремя начала выполнения:\n" << stime << endl << "\nВыполнение:" << t.made << "\n=============================================" << endl;
};
 
void change(Task& t)
{
    t.made = !t.made;
}
 
Task InputTask()
{
    Task t;
    setlocale(LC_ALL, "Russian");
    cout << "Задание:" << endl;
    cin >> t.study;
    cout << "Приоритетность задания: ";
    cin >> t.priority;
    cout << "Время начала выполнения задания:" << endl;
    int hours, minutes;
    hours = DigitInputCheck(0, 23);
    minutes = DigitInputCheck(0, 59);
    t.time = hours * 100 + minutes;
    t.made = false;
    return t;
}
 
void PrintForSaveTask(ostream& save, const Task& t)
{
    save << t.study << endl << t.time << endl << t.made << endl << t.priority;
}
 
 
Task GetTask(istream& get)
{
    Task t;
    getline(get, t.study);
    get >> t.time >> t.made >> t.priority;
    return t;
}
#endif
main.cpp
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
#include "Day.h" 
#include "Task.h"
class Day;
class Task;
int Menu()
{
    setlocale(LC_ALL, "Russian");int action;
    cout << "1.Ввести информацию по дню" << endl << "2.Вывести информацию по дню" << endl << "3.Изменение признака Выполнено у задачи" << endl << "4.Добавить/Удалить задачу/Поиск задачи" << endl;
    cout << "5.Выбрать формат" << endl << "6.Сохранить в файл" << endl << "7.Считать из файла" << endl<< "8.Новый день"<< "0.Введите для выхода" << endl;
    cin >> action;return action;
}
int  MenuSort()
{
    setlocale(LC_ALL, "Russian");cout << "Отсортировать задачи?" << endl << "1.Да" << endl << "2.Нет" << endl;int  action1=DigitInputCheck(1,2);return action1;
}
int  MenuSort2()
{   
    setlocale(LC_ALL, "Russian");
    cout << "По какому признаку отсортировать?" << endl << "1.По приоритету" << endl << "2.По времени" << endl;int action2 = DigitInputCheck(1,2);return action2;
}
 
int main()
{
    Day* ptr = NULL;
    map<string,Day*> Days;
    setlocale(LC_ALL, "Russian");
    int k = 0;
    Day d;
    Task t;
    vector <Task> result;
    for (;;)
    {
        ChangeF TimeFormats[2] = { format1,format2 };
        int act = Menu();
        switch (act)
        {
 
        case 0:
        {
            cout << 0;
            return 0;
        }
        case 1:
        {
            system("cls");
            cout << "Введите информацию по дню" << endl; d = InputDay();
            break;
        }
        case 2:
        {
 
            if (d.tasks.size() == 0)
            {
                system("cls");
                cout << "Введеная информация по дню" << endl << "\n";
                PrintDay(d, TimeFormats[1]);
                cout << "\n";
                break;
            }
            else
            {
                int act1 = MenuSort();
                switch (act1)
                {
                case 1:
                {
                    int act2 = MenuSort2();
                    switch (act2)
                    {
                    case 1:
                    { 
                        system("cls"); cout << "Отсортированный массив по приоритету" << endl; sort(d.tasks.begin(), d.tasks.end(), [](const Task& t1, const Task& t2) { return t1.priority < t2.priority; }); if (k == 0) { PrintDay(d, TimeFormats[1]); break; }else{ PrintDay(d, TimeFormats[k-1]); break; }
                    }
                    case 2:
                    {
                    system("cls"); cout << "отсортированный массив по времени" << endl;   sort(d.tasks.begin(), d.tasks.end(), [](const Task& t1, const Task& t2) { return t1.time < t2.time; }); if (k == 0) { PrintDay(d, TimeFormats[1]); break; }else { PrintDay(d, TimeFormats[k - 1]); break; }
                    }
                    break;
                    }
                    break;
                }
 
                case 2:
                {   
                system("cls"); cout << "Неотсортированное:"; cout << "Введеная информация по дню" << endl; if (k == 0) { PrintDay(d, TimeFormats[1]); cout << "\n"; break; }else{ PrintDay(d, TimeFormats[k - 1]); cout << "\n"; break; }
                }
                break;
                }
            }
            break;
        }
 
 
        case 3:
        {
            if (d.tasks.size() == 0) { system("cls"); cout << "Ничего не введено" << endl << "\n"; break; }
            else {
                system("cls"); cout << "Задачи пронумерованы по порядку от 0 до заданного количнства задач,введите номер задания чтобы изменить его статус" << endl << "Введите номер задания ";
                int Complete = DigitInputCheck(0, (int)d.tasks.size() - 1);
                change(d.tasks[Complete]);
                for (int i = 0; i < d.tasks.size(); i++)
                {
                    cout << i + 1 << ".";  PrintTask(d.tasks[i], TimeFormats[1]);  cout << "================================" << endl;
                }break;
            }
        }
        case 4:
        {
            int opt;
            cout << "1.Добавить задачу в ежедневник\n" << "2.Удалить задачу из ежедневника\n" << "3.Поиск задачи\n"; opt = DigitInputCheck(1, 3);
            if (opt == 1) { d.tasks.push_back(InputTask()); PrintDay(d, TimeFormats[1]); break; break; }
            else if (opt == 2) {
                if (d.tasks.size() == 0) { cout << "no tasks entered" << endl; break; }
                else {
                    string name; cin >> name;
                    d.tasks.erase(remove_if(d.tasks.begin(), d.tasks.end(), [name](const Task& rem) {return rem.study == name; }), d.tasks.end());
                    PrintDay(d, TimeFormats[1]); break;
                }
            }
            else if (opt == 3)
            {
                string nameee;cin >> nameee;copy_if(d.tasks.begin(), d.tasks.end(), back_inserter(result), [nameee](const Task& find){return  find.study == nameee; });
                for (auto ft : result)
                {cout << "\nЗадание\t" << ft.study << "\tВремя начала выполнения\t" << ft.time << "\tПриоритетность\t" << ft.priority << endl;}
                result.clear();
                break;
            }
        }
        case 5:
        {
            cout << "В каком формате вывести время?" << endl << "1. 00 ч 00 м" << endl << "2. 00:00" << endl; k = DigitInputCheck(1, 2); string stime = TimeFormats[k - 1](t.time);  break;
        }
        case 6:
        {
            string name; cout << "Задайте имя файла  "; cin >> name; ofstream Save(name); if (!Save)continue; PrintForSaveDay(Save, d); Save.close();    cout << "Сохранение выполнено,название файла :" << name << "\n"; break;
        }
        case 7:
        {
            cout << "Напишите имя файла   "; string name; cin >> name; ifstream Read(name); d = GetDay(Read); if (!Read.is_open()) { cout << "Файл не найден..\n"; }
            else { cout << "\nВыгрузка из файла " << name << "  выполнена\n"; }; continue; break;   }
        case 8:
        {
            
        }
        }
    }
 
}
код g но блин учусь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Блог
18.12.2019, 00:25
Ответы с готовыми решениями:

Контейнер Map. Использование класса как ключ
class A{ int X;}; class B{ public: int y;}; int main() { A objA; B objB; map&lt;A,B&gt;...

Использование файлов для обработки и хранения данных
https://www.cyberforum.ru/attachment.php?attachmentid=927921&amp;stc=1&amp;d=1523447181 Дан файл f1 ,...

Использование линейного списка для хранения последовательности
Разработать программу, которая организует с использованием линейного списка хранение...

Std::function для хранения функции класса
class test { public: test() { f = display5; //Как правильно написать? } void...

3
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
18.12.2019, 00:46 2
Цитата Сообщение от aigoo038 Посмотреть сообщение
Думал написать так:
map<string,Day*> Days;
Но вот добавить сюда что-то не могу ругается на аргументы
Days.insert(pair<string,Day*>{ключ(время из класса Day),d});
Раз уж на то пошло, то map<string,Day> Days;

Однако map - это ключ - значение,
если ключом является какая то характеристика значения, то map не подойдет(для хранения достаточно set с самописным компаратором, а редактирование поля ключа не доступно для set или нарушает логику в случае с map). Наверное вам нужен multimap<date, task>
0
0 / 0 / 0
Регистрация: 16.01.2019
Сообщений: 10
10.01.2020, 20:06  [ТС] 3
zayats80888,
C++
1
2
3
4
5
6
7
      multimap<string, Day>Days;
            multimap<string, Day>::iterator it;
            Days.insert(pair<string, Day>(s, d));
            for (it = Days.begin(); it != Days.end(); ++it)
            {
                cout << it->first << " " << it->second << '\n';
            }
Добавлено через 1 минуту
zayats80888,
такие вот ошибки выдает
E0349 отсутствует оператор "<<", соответствующий этим операндам
C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа "_Ty2" (или приемлемое преобразование отсутствует)
with
[ _Ty2=Day ]
0
6340 / 3511 / 1427
Регистрация: 07.02.2019
Сообщений: 8,977
11.01.2020, 07:20 4
Цитата Сообщение от aigoo038 Посмотреть сообщение
такие вот ошибки выдает
нужно определить std::ostream& operator<<(std::ostream&, const Day&);
0
11.01.2020, 07:20
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
11.01.2020, 07:20
Помогаю со студенческими работами здесь

Использование класса для хранения данных.
Можно ли использовать класс как структуру (struct) для хранения и преобразования данных? Все...

Использование googleusercontent для хранения файлов
стоит ли использовать ссылки на https://doc-00-0g-docs.googleusercontent.com?

Предусмотреть использование типизированного файла для хранения информации
Здравствуйте.По заданию мне нужно предусмотреть использование типизированного файла для хранения...

Разработать шаблон класса для хранения данных (контейнер)
Я не понял как описать шаблон класса для хранения данных (контейнер). Данные должны хранится,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru