Использование map для хранения класса
18.12.2019, 00:25. Показов 1976. Ответов 3
Есть класс 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
|