3 Индивидуальное задание
Создать контейнеры, которые будут хранить объекты классов по предметной области, указанной в таблице (класс должен содержать функционал по предметной области). Для контейнера реализовать добавление, удаление, редактирование, вывод содержимого контейнера на экран и в файл, поиск и сортировку элементов. Необходимо создать удобное пользовательское меню.
4 Код решения индивидуального задания
#include "A_menu.h"
#include "Menu.h"
#include "Files.h"
#include <iostream>
#include <algorithm>
#include "User.h"
#include"Staff.h"
#include <iomanip>
#include <ios>
#include <vector>
#include <tuple>
#include <type_traits>
#include <cassert>
#include <cmath>
#include "Person.h"
using namespace std;
// Конструктор
Menu::Menu()
{
}
// Деструктор
Menu::~Menu()
{
}
/************************************************** функция для редактирования информации***********************************************/
// Редактирование (case 4)
void Menu::edit_info()
{
int v;
while (1)
{
system("cls");
cout << "РЕДАКТИРОВАНИЕ\n";
cout << "1) Сотрудник\n";
cout << "2) НАЗАД\n";
cout << "Ваш выбор: ";
cin >> v;
Checks::checkInt(v);
switch (v)
{
case 1:
{ system("cls"); staffEditMenu(); break; }
case 2: return;
default: cout << "Ошибка!\n"; break;
}
}
}
// Редактирование информации о пользователе (case 3)
void Menu::userEditMenu()
{
if (All_info::getInstance().getUsers().empty())
{
cout << "Список пуст.\n";
system("pause");
return;
}
printUser(All_info::getInstance().getUsers());
int id;
do
{
cout << "Введите id пользователя:";
cin >> id;
Checks::checkInt(id);
} while (All_info::getInstance().userIdIsValid(id));
User newUser;
string login, password;
memset(&newUser, 0, sizeof(newUser));
cout << "Введите логин:\n";
cin >> login;
cout << "Введите пароль:\n";
cin >> password;
newUser.setUser(login, password, id);
All_info::getInstance().editUser(id, newUser);
}
void Menu::staffEditMenu()
{
int ch;
if (All_info::getInstance().getStaff().empty())
{
cout << "Список пуст.\n";
system("pause");
return;
}
printStaff(All_info::getInstance().getStaff());
int id;
do
{
cout << "Введите map:";
cin >> id;
Checks::checkInt(id);
} while (All_info::getInstance().staffIdIsValid(id));
Staff newStaff;
string name, surname, patronymic, phone, position;
char salaryStaff[10];
int salary, day, month, year;
memset(&newStaff, 0, sizeof(newStaff));
do {
cout << "Фамилия: ";
cin >> surname;
if (Checks::checkNoNumbers(surname))
{
break;
}
else
cout << "Ошибка!.\n";
} while (1);
do {
cout << "Имя: ";
cin >> name;
if (Checks::checkNoNumbers(name))
{
break;
}
else
cout << "Ошибка!.\n";
} while (1);
do {
cout << "Отчество: ";
cin >> patronymic;
if (Checks::checkNoNumbers(patronymic))
{
break;
}
else
cout << "Ошибка!\n";
} while (1);
do {
cout << "Введите номер телефона:\n";
cin >> phone;
if (Checks::checkNoLetters(phone))
{
break;
}
else
cout << "Ошибка!\n";
} while (1);
while (1)
{
cout << "Выберите должность:\n";
cout << "1) Бухгалтер.\n";
cout << "2) Финансовый аналитик.\n";
cout << "3) Кредитный эксперт.\n";
cout << "4) Аудитор.\n";
cout << "Ваш выбор: ";
cin >> ch;
Checks::checkInt(ch);
if (ch > 0 && ch < 5)
{
position = positionStaff[ch - 1];
break;
}
else
{
cout << "Ошибка!\n";
continue;
}
}
do {
cout << "Введите зарплату:\n";
cin >> salaryStaff;
if (Checks::checkNoLetters(salaryStaff))
{
salary = atoi(salaryStaff);
break;
}
else
cout << "Ошибка!\n";
} while (1);
cout << "Введите дату принятия на работу:\n";
cout << "День :";
cin >> day;
Checks::checkInt(day);
while (day < 0 || day > 31)
{
cout << "Введите корректную дату\n";
cin >> day;
}
cout << "Месяц :";
cin >> month;
Checks::checkInt(month);
while (month < 0 || month > 12)
{
cout << "Введите корректную дату\n";
cin >> month;
}
cout << "Год :";
cin >> year;
Checks::checkInt(year);
while (year < 2000 || year > 2020)
{
cout << "Введите корректную дату\n";
cin >> year;
}
newStaff.setStaff(name, surname, patronymic, phone, position, salary, day, month, year, id);
All_info::getInstance().editStaff(id, newStaff);
}
/**************************************************функция для удаления информации***********************************************/
void Menu::removeMenu()
{
int ch;
while (1)
{
system("cls");
cout << "УДАЛЕНИЕ\n";
cout << "1) Сотрудник\n";
cout << "2) НАЗАД\n";
cout << "Ваш выбор: ";
cin >> ch;
Checks::checkInt(ch);
switch (ch)
{
case 1:
{
int sw;
while (1)
{
system("cls");
cout << "УДАЛЕНИЕ\n";
cout << "1) Удалить сотрудника\n";
cout << "2) Удалить всех сотрудников\n";
cout << "3) Назад\n";
cout << "Ваш выбор: ";
cin >> sw;
Checks::checkInt(sw);
switch (sw)
{
case 1:
system("cls");
printStaff(All_info::getInstance().getStaff());
int id;
cout << "Введите map сотрудника: ";
cin >> id;
Checks::checkInt(id);
if (!All_info::getInstance().removeStaff(id)) cout << "Ошибка!\n";
break;
case 2:
system("cls");
All_info::getInstance().removeAllStaff();
break;
case 3:
return;
default:
cout << "Ошибка!\n";
break;
}
}
break;
}
case 2: return;
default: cout << "Ошибка!\n";
system("pause");
break;
}
}
}
// Функция добавления пользователей админом
void Menu::addUserMenu()
{
User newUser;
string login, password;
memset(&newUser, 0, sizeof(newUser));
cout << "Введите логин:\n";
cin >> login;
cout << "Введите пароль:\n";
cin >> password;
newUser.setUser(login, password);
All_info::getInstance().addUser(newUser);
}
// Функция для просмотра пользователей администратором
void Menu::printUser(vector<User> users)
{
if (users.empty())
{
cout << "Список пуст.\n";
return;
}
for (auto i : users)
{
cout << i;
cout << endl;
}
}
ostream & operator<<(ostream & out, User & obj)
{
out << "id: " << obj.getId() << endl;
out << "login: " << obj.getLogin() << endl;
out << "password: " << obj.getPassword() << endl;
return out;
}
ostream & operator<<(ostream & out, Staff & obj)
{
out << "map: " << obj.getId() << endl;
out << "Имя: " << obj.getName() << endl;
out << "Фамилия: " << obj.getSurname() << endl;
out << "Отчество: " << obj.getPatronymic() << endl;
out << "Номер телефона: " << obj.getPhone() << endl;
out << "Должность: " << obj.getPosition() << endl;
out << "Заработная плата: " << obj.getSalary() << endl;
out << "Дата принятия на работу: " << obj.getHiringDay() << "." << obj.getHiringMonth() << "." << obj.getHiringYear() << endl;
return out;
}
// Функция для просмотра сотрудников администратором
void Menu::printStaff(vector<Staff> staff)
{
if (staff.empty())
{
cout << "Список пуст.\n";
return;
}
cout << "____________________________________________________________________________________________________" << endl;
cout << "|" << setw(3) << "индекс" << "|" << setw(37) << "ФИО" << "|" << setw(24) << "Должность" << "|" << setw(8) << "Зарплата" << "|" << setw(10) << "Номер" << "|" << setw(11) << "Дата найма" << "|" << endl;
cout << "|___|_____________________________________|________________________|________|__________|___________|" << endl;
for (auto i : staff)
{
cout << "|" << setw(3) << i.getId() << "|" << setw(13) << i.getSurname() << setw(12) << i.getName() << setw(12) << i.getPatronymic() << "|" << setw(24) << i.getPosition() << "|" << setw(8) << i.getSalary() << "|";
cout << setw(10) << i.getPhone() << "|" << setw(3) << i.getHiringDay() << "." << setw(2) << i.getHiringMonth() << "." << setw(4) << i.getHiringYear() << "|" << endl;
cout << "|___|_____________________________________|________________________|________|__________|___________|" << endl;
}
}
// Поиск информации (case 3)
void A_menu::search_info()
{
while (1)
{
int sw;
cout << "1) Поиск сотрудников.\n";
cout << "2) Назад.\n";
cout << "Ваш выбор: ";
cin >> sw;
Checks::checkInt(sw);
switch (sw)
{
case 1:
{ system("cls");
staffSearchMenu(); break; }
case 2: return;
default: cout << "Неверный выбор. Повторите попытку.\n"; break;
}
}
}
bool sr(Staff staffc, Staff staff)
{
return staff.salary > staffc.salary;
}
// сортир
void A_menu::sortir(vector<Staff> result)
{
system("cls");
vector<Staff> tmp = All_info::getInstance().getStaff();
if (tmp.size() == 0)
{
cout << "Список пуст.\n";
return;
}
system("pause");
sort(tmp.begin(), tmp.end(), sr);
printStaff(tmp);
system("pause");
}
// Функция добавления сотрудников
void Menu::addStaffMenu()
{
int ch;
Staff newStaff;
string name, surname, patronymic, phone, position;
char salaryStaff[10];
int salary, day, month, year;
memset(&newStaff, 0, sizeof(newStaff));
cout << "Введите ФИО сотрудника:\n";
do {
cout << "Фамилия: ";
cin >> surname;
if (Checks::checkNoNumbers(surname))
{
break;
}
else
cout << "Некорректный ввод. Повторите попытку.\n";
} while (1);
do {
cout << "Имя: ";
cin >> name;
if (Checks::checkNoNumbers(name))
{
break;
}
else
cout << "Некорректный ввод. Повторите попытку.\n";
} while (1);
do {
cout << "Отчество: ";
cin >> patronymic;
if (Checks::checkNoNumbers(patronymic))
{
break;
}
else
cout << "Некорректный ввод. Повторите попытку.\n";
} while (1);
do {
cout << "Введите номер телефона:\n";
cin >> phone;
if (Checks::checkNoLetters(phone))
{
break;
}
else
cout << "Некорректный ввод. Повторите попытку.\n";
} while (1);
while (1)
{
cout << "Выберите должность:\n";
cout << "1) Бухгалтер.\n";
cout << "2) Финансовый аналитик.\n";
cout << "3) Кредитный эксперт.\n";
cout << "4) Аудитор.\n";
cout << "Ваш выбор: ";
cin >> ch;
Checks::checkInt(ch);
if (ch > 0 && ch < 5)
{
position = positionStaff[ch - 1];
break;
}
else
{
cout << "Неверный выбор. Повторите попытку.\n";
continue;
}
}
do {
cout << "Введите зарплату:\n";
cin >> salaryStaff;
if (Checks::checkNoLetters(salaryStaff))
{
salary = atoi(salaryStaff);
break;
}
else
cout << "Ошибка!\n";
} while (1);
cout << "Введите дату принятия на работу:\n";
cout << "День :";
cin >> day;
Checks::checkInt(day);
while (day < 0 || day > 31)
{
cout << "Введите корректную дату\n";
cin >> day;
}
cout << "Месяц :";
cin >> month;
Checks::checkInt(month);
while (month < 0 || month > 12)
{
cout << "Введите корректную дату\n";
cin >> month;
}
cout << "Год :";
cin >> year;
Checks::checkInt(year);
while (year < 2000 || year > 2020)
{
cout << "Введите корректную дату\n";
cin >> year;
}
newStaff.setStaff(name, surname, patronymic, phone, position, salary, day, month, year);
All_info::getInstance().addStaff(newStaff);
}
// Функция для поиска сотрудников
void Menu::staffSearchMenu()
{
int ch;
while (1)
{
system("cls");
cout << "ПОИСК\n";
cout << "1) Должность\n";
cout << "2) поиск по индексу // map\n";
cout << "3) Фамилия\n";
cout << "4) Назад\n";
cout << "Ваш выбор: ";
cin >> ch;
Checks::checkInt(ch);
switch (ch)
{
case 1:
{
system("cls");
vector<Staff> result;
auto getPosition = []() -> string {
string position;
int ch;
while (1)
{
cout << "Выберите должность:\n";
cout << "1) Бухгалтер.\n";
cout << "2) Финансовый аналитик.\n";
cout << "3) Кредитный эксперт.\n";
cout << "4) Аудитор.\n";
cout << "Ваш выбор: ";
cin >> ch;
Checks::checkInt(ch);
if (ch > 0 && ch < 5)
{
position = positionStaff[ch - 1];
break;
}
else
{
cout << "Неверный выбор. Повторите попытку.\n";
continue;
}
}
return position;
};
result = All_info::getInstance().staffSearchByPosition(getPosition());
if (result.empty()) cout << "Совпадений не найдено\n";
printStaff(result);
system("pause");
break;
}
case 2:
{
system("cls");
vector<Staff> result;
auto getId = []() -> int { int _n; cout << "Введите map сотрудника: "; cin >> _n; return _n; };
result = All_info::getInstance().staffSearchById(getId());
if (result.empty()) cout << "Совпадений не найдено\n";
printStaff(result);
system("pause");
break;
}
case 3:
{
system("cls");
vector<Staff> result;
auto getSurname = []() -> string { string _n; cout << "Введите фамилию сотрудника: "; cin >> _n; return _n; };
result = All_info::getInstance().staffSearchByName(getSurname());
if (result.empty()) cout << "Совпадений не найдено\n";
printStaff(result);
system("pause");
break;
}
case 4: return;
default: cout << "Некорректный выбор. Повторите попытку\n";
system("pause");
break;
}
}
}
//
bool compare1(Staff obj1, Staff obj2)
{
if (strcmp(obj1.getSurname().c_str(), obj2.getSurname().c_str()) < 0)
return true;
else
return false;
}
// Конструктор
A_menu::A_menu()
{
}
// Деструктор
A_menu::~A_menu()
{
}
void A_menu::start(int uid)
{
loggedUserId = uid;
int v;
while (1)
{
system("cls");
cout << "*******МЕНЮ*******\n";
cout << "1) Просмотр банковских сотруников\n";
cout << "2) добавление банковских сотрудников\n";
cout << "3) Редактирование данных банковских сотрудников\n";
cout << "4) Удаление\n";
cout << "5) поиск\n";
cout << "6) сортировка\n";
cout << "7) Выход\n";
cout << "==================================" << endl;
cout << "Ваш выбор: ";
cin >> v;
Checks::checkInt(v);
switch (v)
{
case 1:
{ system("cls");
look_info(); break; }
case 2:
{ system("cls");
add_info(); break; }
case 3:
{ system("cls");
edit_info(); break; }
case 4:
{ system("cls");
removeMenu(); break; }
case 5:
{ system("cls");
search_info(); break; }
case 6:
{ system("cls");
cout << "сортировка по зарплатам банковских сотрудников:" << endl;
system("pause");
sortir(All_info::getInstance().getSalary()); break; }
case 7:
return;
default: cout << "Выберите другой пункт меню.\n"; break;}
}
}
// Просмотр информации (case 1)
void A_menu::look_info()
{
int v;
while (1)
{
system("cls");
cout << "1) Просмотр сотрудников.\n";
cout << "2) Назад.\n";
cout << "Ваш выбор: ";
cin >> v;
Checks::checkInt(v);
switch (v)
{
case 1:
{ system("cls");
printStaff(All_info::getInstance().getStaff());
system("pause"); break; }
case 2: return;
default: cout << "Такого действия нет. Введите другой выбор.\n"; break;
}
}
}
void A_menu::add_info()
{
int v;
while (1)
{
system("cls");
cout << "1) Добавление сотрудников.\n";
cout << "2) Назад.\n";
cout << "Ваш выбор: ";
cin >> v;
Checks::checkInt(v);
switch (v)
{
case 1:
{ addStaffMenu(); break; }
case 2: return;
default: cout << "Такого действия нет. Введите другой выбор.\n"; break;
}
}
}