Министерство образования Республики Беларусь
Министерство образования Республики Беларусь
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Кафедра эконмической информатики
Объектно-ориентированное программирование
“ВВЕДЕНИЕ В СТАНДАРТНУЮ БИБЛИОТЕКУ ШАБЛОНОВ. АДАПТЕРЫ КОНТЕЙНЕРОВ”
Выполнила: Студентка группы
972303
Рушева Маргарита
Владиславовна
Проверила: Григорьева Юлия
Юрьевна
Минск, 2021
Изучить стандартную библиотеку шаблонов, адаптеры контейнеров.
Контейнеры можно разделить на три категории: последовательные контейнеры, ассоциативные контейнеры и контейнеры-адаптеры.
Контейнер адаптер — это разновидность последовательного или ассоциативного контейнера, который ограничивает интерфейс для простоты и ясности. Контейнеры-адаптеры не поддерживают итераторы.
Контейнер queue соответствует семантике FIFO (первым поступил — первым обслужен). Первый элемент передается, помещается в очередь и должен первым извлекается, удаляться из очереди.
Контейнер priority_queue упорядочен таким образом, что первым в очереди всегда оказывается элемент с наибольшим значением (приоритетом).
Контейнер stack соответствует семантике LIFO (последним поступил — первым обслужен). Последний элемент, отправленный в стек, становится первым извлекаемым элементом.
Поскольку контейнеры-адаптеры не поддерживают итераторы, их нельзя использовать в алгоритмах STL.
Адаптер (adaptor) — это фундаментальная концепция библиотеки.
Адаптер stack требует только функций push(), pop(), top(), поэтому для стека можно использовать контейнер любого из остальных типов.
Адаптеру queue требуются функции back(), front(), push(), pop(), поэтому он может быть создан на основании контейнеров list и deque, но не vector.
Адаптеру priority_queue требуются функции top(), push(), pop(); он может быть основан на контейнерах vector и deque, но не list.
Стек – это структура данных, в которой элементы добавляются и удаляются в вершине стека.
Каждый контейнер-адаптер определяет собственные функции, исходя из функций, предоставленных базовым контейнером. Использовать можно только функции адаптера, а функции основного контейнера использовать нельзя.
АДАПТЕРЫ ОЧЕРЕДЕЙ
Создать контейнер, который будет хранить объекты класса по предметной области, указанной в таблице (класс должен содержать функционал по предметной области). Для контейнера реализовать добавление элементов, вывод содержимого элементов на экран, редактирование элементов. Необходимо использовать меню.
#include <iostream>
#include <iomanip>
#include <queue>
#include <stack>
#include <Windows.h>
using namespace std;
class Pharmacy
{
string name;
double price;
string country;
public:
void input()
{
while (true)
{
system("cls");
try
{
cout << "Наименование товара (или код товара) : ";
cin >> this->name;
cout << "Стоимость : ";
cin >> this->price;
cout << "Страна изготовления (или код страны цифрами) : ";
cin >> this->country;
return;
}
catch (exception ex)
{
cin.clear();
cin.ignore(32000, '\n');
cout << ex.what() << endl;
system("pause");
}
}
}
void output()
{
cout << std::setiosflags(std::ios_base::left) << setw(20) << this->name;
cout << " " << setw(8) << this->price;
cout << setw(15) << this->country;
}
static void HeadOFTheTable()
{
cout << "Название Цена Страна производитель " << endl;
}
bool comp(Pharmacy second)
{
return this->price > second.price;
}
bool NameComp(Pharmacy second)
{
if (this->name == second.name) return true;
return false;
}
bool comp(string name)
{
if (this->name == name) return true;
return false;
}
};
class ComparePrice
{
public: bool operator () (Pharmacy& first, Pharmacy& second) { return first.comp(second); }
};
class Customer
{
private:
string name;
public:
void input()
{
cout << "Введите имя : ";
cin >> this->name;
}
void output()
{
cout << this->name << endl;
}
bool comp(string name)
{
if (name == this->name) return true;
return false;
}
bool comp(Customer newSub)
{
if (newSub.name == this->name) return true;
return false;
}
void outpuT()
{
cout << std::setiosflags(std::ios_base::left) << setw(25) << this->name;
}
};
class Queue
{
public:
Customer sub;
Pharmacy tarrife;
void output()
{
this->sub.outpuT();
this->tarrife.output();
}
static void HeadOFTheTable()
{
cout << "Имя покупателя Название товара Цена Страна изготовления " << endl;
}
};
class AllInfo
{
stack<Customer> subs;
queue<Queue> tariffQueue;
priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice> tariffs;
void prQueueOutput(priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice> copy)
{
Pharmacy::HeadOFTheTable();
while (copy.size())
{
Pharmacy t = copy.top();
t.output();
copy.pop();
}
}
int getID(priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice>& copy)
{
cout << "Введите имя : ";
string name;
cin >> name;
for (int i = 0; copy.size() != 0; i++)
{
Pharmacy t = copy.top();
if (t.comp(name))
{
cout << "ИЗМЕНЕНИЕ ЗАПИСИ" << endl;
t.input();
if (this->check(t))
{
cout << "Такая запись уже существует" << endl;
system("pause");
return -1;
}
copy.pop();
copy.push(t);
return i;
}
copy.pop();
}
cout << "Неверно введен логин или пароль" << endl;
system("pause");
return -1;
}
void getAnotherPart(priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice>& oneMoreCopy, int ID)
{
priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice > oneMOREMOREstack = this->tariffs;
for (int i = 0; i < ID; i++)
{
oneMoreCopy.push(oneMOREMOREstack.top());
oneMOREMOREstack.pop();
}
}
void getNewStack(priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice> oneMoreCopy, priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice>& copy)
{
while (oneMoreCopy.size())
{
copy.push(oneMoreCopy.top());
oneMoreCopy.pop();
}
}
void newPrQueue(priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice> copy)
{
this->prQueueOutput(copy);
int ID = this->getID(copy);
if (ID == -1) return;
else if (ID == 0)
{
this->tariffs = copy;
return;
}
priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice> oneMoreCopy;
this->getAnotherPart(oneMoreCopy, ID);
this->getNewStack(oneMoreCopy, copy);
this->tariffs = copy;
}
bool check(Pharmacy newTariffe)
{
priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice> copy = this->tariffs;
while (!copy.empty())
{
Pharmacy check = copy.top();
if (check.NameComp(newTariffe)) return true;
copy.pop();
}
return false;
}
void stackOutput(stack<Customer> copy)
{
while (copy.size())
{
copy.top().output();
copy.pop();
}
}
int getID(stack<Customer>& copy)
{
cout << "Введите имя : ";
string name;
cin >> name;
for (int i = 0; copy.size() != 0; i++)
{
if (copy.top().comp(name))
{
cout << "ИЗМЕНЕНИЕ ЗАПИСИ" << endl;
Customer newSub;
newSub.input();
if (this->check(newSub))
{
cout << "Такая запись уже существует" << endl;
system("pause");
return -1;
}
copy.top() = newSub;
return i;
}
copy.pop();
}
cout << "Неверно введено имя" << endl;
system("pause");
return -1;
}
void getAnotherPart(stack<Customer>& oneMoreCopy, int ID)
{
stack<Customer> oneMOREMOREstack = this->subs;
for (int i = 0; i < ID; i++)
{
oneMoreCopy.push(oneMOREMOREstack.top());
oneMOREMOREstack.pop();
}
}
void getNewStack(stack<Customer> oneMoreCopy, stack<Customer>& copy)
{
while (oneMoreCopy.size())
{
copy.push(oneMoreCopy.top());
oneMoreCopy.pop();
}
}
void newStack(stack<Customer> copy)
{
this->stackOutput(copy);
int ID = this->getID(copy);
if (ID == -1) return;
else if (ID == 0)
{
this->subs = copy;
return;
}
stack<Customer> oneMoreCopy;
this->getAnotherPart(oneMoreCopy, ID);
this->getNewStack(oneMoreCopy, copy);
this->subs = copy;
}
bool check(Customer newSub)
{
stack<Customer> copy = this->subs;
while (!copy.empty())
{
if (copy.top().comp(newSub)) return true;
copy.pop();
}
return false;
}
bool inputT(priority_queue<Pharmacy, vector<Pharmacy>, ComparePrice> tariff, Queue& newQueue)
{
cout << "Введите наименование товара: ";
string name;
cin >> name;
for (int i = 0; tariff.size() != 0; i++)
{
Pharmacy t = tariff.top();
if (t.comp(name))
{
newQueue.tarrife = tariff.top();
return true;
}
tariff.pop();
}
cout << "Такой товар не найден" << endl;
system("pause");
return false;
}
bool input(stack<Customer> subs, Queue& newQueue)
{
this->stackOutput(this->subs);
cout << "Введите имя покупателя: ";
string name;
cin >> name;
for (int i = 0; subs.size() != 0; i++)
{
if (subs.top().comp(name))
{
this->prQueueOutput(this->tariffs);
newQueue.sub = subs.top();
this->inputT(this->tariffs, newQueue);
return true;
}
subs.pop();
}
cout << "Неверно введено имя" << endl;
system("pause");
return false;
}
bool check(Queue newQueue)
{
queue<Queue> copy = this->tariffQueue;
while (!copy.empty())
{
if (copy.front().sub.comp(newQueue.sub)) return true;
copy.pop();
}
return false;
}
void QueueOutput(queue<Queue> q)
{
while (q.size())
{
q.front().output();
q.pop();
}
}
public:
void SUBSMenu()
{
while (true)
{
system("cls");
cout << "1) Добавить покупателя в stack" << endl;
cout << "2) Просмотр stack" << endl;
cout << "3) Редактирование элемента slack" << endl;
cout << "4) Назад" << endl;
try
{
int choice;
cin >> choice;
switch (choice)
{
case 1:
{
system("cls");
Customer newSubs;
newSubs.input();
if (!this->check(newSubs)) this->subs.emplace(newSubs);
else
{
cout << "Такой покупатель уже есть в данной программе" << endl;
system("pause");
}
break;
}
case 2:
{
if (!this->subs.size())
{
cout << "Stack пуст" << endl;
system("pause");
break;
}
system("cls");
this->stackOutput(this->subs);
system("pause");
break;
}
case 3:
{
if (!this->subs.size())
{
cout << "Stack пуст" << endl;
system("pause");
break;
}
system("cls");
this->newStack(this->subs);
system("pause");
break;
}
case 4: return;
default: cout << "Неверный ввод" << endl; system("pause"); break;
}
}
catch (exception ex)
{
cin.clear();
cin.ignore(32000, '\n');
cout << ex.what() << endl;
system("pause");
}
}
}
void TARIFFMenu()
{
while (true)
{
system("cls");
cout << "1) Добавить товар в аптеку" << endl;
cout << "2) Просмотр записей" << endl;
cout << "3) Редактирование" << endl;
cout << "4) Назад" << endl;
try
{
int choice;
cin >> choice;
switch (choice)
{
case 1:
{
system("cls");
Pharmacy newPlan;
newPlan.input();
if (!this->check(newPlan)) this->tariffs.emplace(newPlan);
else
{
cout << "Товар с таким названием уже существует" << endl;
system("pause");
}