Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- #include <iomanip>
- using namespace std;
- class List
- {
- public:
- List();
- ~List();
- //удаление первого элемента в списке
- void pop_front();
- //добавление элемента в конец списка
- void push_back(string part_number, string name, int price, int weight);
- // очистить список
- void clear();
- // получить количество элементов в списке
- int GetSize() { return Size; }
- // вывод детали
- int number(const int index, string str);
- //добавление элемента в начало списка
- void push_front(string part_number, string name, int price, int weight);
- //удаление элемента в списке по указанному индексу
- void removeAt(int index);
- //удаление последнего элемента в списке
- void pop_back();
- // Возвращение номера детали или наименования
- string str(const int index, string str);
- private:
- class Node
- {
- public:
- Node* pNext;
- Node* pPrev;
- int price = 0, weight = 0;
- string part_number = "", name = "";
- Node(string part_number, string name, int price, int weight, Node* pNext = nullptr, Node* pPrev = nullptr)
- {
- this->part_number = part_number;
- this->name = name;
- this->price = price;
- this->weight = weight;
- this->pNext = pNext;
- this->pPrev = pPrev;
- }
- };
- int Size;
- Node* head;
- Node* tail;
- };
- List::List()
- {
- Size = 0;
- head = nullptr;
- tail = nullptr;
- }
- List::~List()
- {
- clear();
- }
- void List::pop_front()
- {
- Node* temp = head;
- if (head->pNext == nullptr)
- {
- delete temp;
- Size--;
- }
- else
- {
- head = head->pNext;
- head->pPrev = temp->pPrev;
- delete temp;
- Size--;
- }
- }
- void List::push_back(string part_number, string name, int price, int weight)
- {
- if (head == nullptr)
- {
- head = new Node(part_number, name, price, weight);
- tail = head;
- }
- else
- {
- Node* temp = tail;
- tail = new Node(part_number, name, price, weight, nullptr, temp);
- temp->pNext = tail;
- }
- Size++;
- }
- void List::clear()
- {
- while (Size)
- {
- pop_back();
- }
- }
- int List::number(const int index, string str)
- {
- int counter = 0;
- Node* current = this->head;
- while (current != nullptr)
- {
- if (counter == index)
- {
- if (str == "price") return current->price;
- if (str == "weight") return current->weight;
- }
- current = current->pNext;
- counter++;
- }
- return 0;
- }
- void List::push_front(string part_number, string name, int price, int weight)
- {
- if (head == nullptr)
- {
- head = new Node(part_number, name, price, weight);
- tail = head;
- }
- else
- {
- Node* temp = head;
- head = new Node(part_number, name, price, weight);
- head->pNext = temp;
- temp->pPrev = head;
- }
- Size++;
- }
- void List::removeAt(int index)
- {
- if (index == 0)
- {
- pop_front();
- }
- else
- {
- if (index == Size - 1)
- {
- pop_back();
- }
- else
- {
- if (index + 1 <= Size / 2)
- {
- Node* previous = this->head;
- for (int i = 0; i < index - 1; i++)
- {
- previous = previous->pNext;
- }
- Node* toDelete = previous->pNext;
- previous->pNext = toDelete->pNext;
- previous = toDelete->pNext;
- previous->pPrev = toDelete->pPrev;
- delete toDelete;
- }
- else
- {
- Node* next = this->tail;
- for (int i = Size - 1; i > index - 1; i--)
- {
- next = next->pPrev;
- }
- Node* toDelete = next->pNext;
- next->pNext = toDelete->pNext;
- next = toDelete->pNext;
- next->pPrev = toDelete->pPrev;
- delete toDelete;
- }
- Size--;
- }
- }
- }
- void List::pop_back()
- {
- Node* temp = tail;
- if (tail->pPrev == nullptr)
- {
- delete temp;
- Size--;
- }
- else
- {
- tail = tail->pPrev;
- tail->pNext = temp->pNext;
- delete temp;
- Size--;
- }
- }
- string List::str(const int index, string str)
- {
- int counter = 0;
- Node* current = this->head;
- while (current != nullptr)
- {
- if (counter == index)
- {
- if (str == "name") return current->name;
- if (str == "part_number") return current->part_number;
- }
- current = current->pNext;
- counter++;
- }
- return str;
- }
- int namesakes(List* lst, int size)
- {
- int i = 0, j = i + 1;
- while (i < size - 1)
- {
- while (j < size)
- {
- if (lst->str(i, "part_number") == lst->str(j, "part_number"))
- {
- lst->removeAt(j);
- j--;
- size--;
- }
- j++;
- }
- i++;
- j = i + 1;
- }
- return size;
- }
- bool flag(List* lst, int size)
- {
- string str1 = "", str2 = "";
- for (int i = 0; i < size - 1; i++)
- {
- str1 = lst->str(i, "part_number");
- str2 = lst->str(i + 1, "part_number");
- for (unsigned short int k = 0; k < str1.length(); k++)
- if (str1[k] > str2[k])
- return false;
- else
- break;
- }
- return true;
- }
- bool revers_flag(List* lst, int size)
- {
- string str1 = "", str2 = "";
- for (int i = 0; i < size - 1; i++)
- {
- str1 = lst->str(i, "part_number");
- str2 = lst->str(i + 1, "part_number");
- for (unsigned short int k = 0; k < str1.length(); k++)
- if (str1[k] < str2[k])
- return false;
- else
- break;
- }
- return true;
- }
- int counter(List* lst, int size)
- {
- int count = 0;
- cout << "Элементы списка, шифры деталей, в которых встречаются в списке только 1 раз:" << endl;
- size = lst->GetSize();
- for (int i = 0; i < size; i++)
- {
- bool flag = true;
- for (int j = 0; j < size; j++)
- {
- if (i == j)
- j++;
- else if (lst->str(i, "part_number") == lst->str(j, "part_number"))
- {
- flag = false;
- break;
- }
- }
- if (flag)
- {
- count++;
- cout << lst->str(i, "part_number") << endl;
- }
- }
- cout << "Кол-во элементов = ";
- return count;
- }
- int multi_sum(List* lst, int size)
- {
- int sum = 0, max = lst->number(0, "price"), min = max;
- string name_max = lst->str(0, "name") + ' ', name_min = name_max;
- for (int i = 0; i < size; i++)
- {
- sum += lst->number(i, "price");
- if (max < lst->number(i, "price"))
- {
- max = lst->number(i, "price");
- name_max = lst->str(i, "name") + ' ';
- }
- if (min > lst->number(i, "price"))
- {
- min = lst->number(i, "price");
- name_min = lst->str(i, "name") + ' ';
- }
- }
- cout << "Максимальный элемент: " << name_max << max << endl;
- cout << "Минимальный элемент: " << name_min << min << endl;
- cout << "Сумма = ";
- return sum;
- }
- void start(List* lst)
- {
- lst->push_front("2313", "gtu", 390, 101);
- lst->push_front("1231", "ghy", 912, 900);
- lst->push_front("8132", "hut", 832, 799);
- }
- void add(List* lst)
- {
- string part_number = "", name = "", str = "";
- int price = 0, weight = 0;
- ifstream text;
- bool flag = true;
- while (flag)
- {
- cout << "Шифр детали: "; cin >> part_number;
- cout << "Название детали: "; cin >> name;
- cout << "Цена детали: "; cin >> price;
- cout << "Вес детали: "; cin >> weight;
- lst->push_front(part_number, name, price, weight);
- cout << "Желаете ещё добавить элементы? " << endl;
- tryAgain:
- cin >> str;
- if (str == "Да" or str == "да" or str == "ДА" or str == "lf" or str == "Lf" or str == "LF")
- flag = true;
- else if (str == "Нет" or str == "нет" or str == "НЕТ" or str == "Ytn" or str == "YTN" or str == "ytn")
- flag = false;
- else
- {
- cout << "Введите \"Да\" или \"Нет\" " << endl;
- goto tryAgain;
- }
- }
- }
- int remove(List* lst, int size)
- {
- int i = 0;
- string str = "", name = "";
- bool flag = true;
- while (flag)
- {
- cout << "Введите наименование, по которому сделать удаление: "; cin >> name;
- i = 0;
- while (i < size)
- {
- if (name == lst->str(i, "name"))
- {
- lst->removeAt(i);
- size--;
- i--;
- }
- i++;
- }
- cout << "Желаете снова удалить по наименованию? " << endl;
- tryAgain:
- cin >> str;
- if (str == "Да" or str == "да" or str == "ДА" or str == "lf" or str == "Lf" or str == "LF")
- flag = true;
- else if (str == "Нет" or str == "нет" or str == "НЕТ" or str == "Ytn" or str == "YTN" or str == "ytn")
- flag = false;
- else
- {
- cout << "Введите \"Да\" или \"Нет\" " << endl;
- goto tryAgain;
- }
- }
- return size;
- }
- void print(List* lst, int size)
- {
- for (int i = 0; i < size; i++)
- {
- cout << lst->str(i, "part_number") << setw(15) << right;
- cout << lst->str(i, "name") << setw(22) << right;
- cout << lst->number(i, "price") << setw(20) << right;
- cout << lst->number(i, "weight") << endl;
- }
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- system("chcp 1251 >> null");
- List lst;
- int N = 0;
- string command = "show";
- start(&lst);
- int size = lst.GetSize();
- do {
- if (command == "show")
- {
- cout << "Шифр" << setw(16) << right << "Название" << setw(23) << right << "Цена" << setw(20) << right << "Вес" << endl;
- print(&lst, size);
- }
- else if (command == "del1")
- {
- lst.removeAt(size - 3);
- size--;
- }
- else if (command == "del2")
- {
- cout << "Введите номер элемента, который хотите удалить(с начала)" << endl; cin >> N;
- lst.removeAt(N - 1);
- size--;
- }
- else if (command == "del3")
- {
- cout << "Введите номер элемента, который хотите удалить(с конца)" << endl; cin >> N;
- lst.removeAt(size - N);
- size--;
- }
- else if (command == "del4")
- size = namesakes(&lst, size);
- else if (command == "check1")
- {
- if (flag(&lst, size))
- cout << "Верно" << endl;
- else
- cout << "Ложно" << endl;
- }
- else if (command == "check2")
- {
- if (revers_flag(&lst, size))
- cout << "Верно" << endl;
- else
- cout << "Ложно" << endl;
- }
- else if (command == "count")
- cout << counter(&lst, size) << endl;
- else if (command == "sum")
- cout << multi_sum(&lst, size) << endl;
- else if (command == "del")
- {
- size = remove(&lst, size);
- }
- else if (command == "add")
- {
- add(&lst);
- size = lst.GetSize();
- }
- cout << "______________________________________________\n\nВведите команду.\nshow - Показать вывод эл-тов.\ndel1 - Удалить элемент, предшествующий 2-му с конца списка элементу.\ndel2 - Удалить элемент с заданным номером К от начала списка.\ndel3 - Удалить элемент с заданным номером от конца списка.\ndel4 - Удалить повторяющиеся элементы списка DSP, если в них совпадает шифр и наименование.\ncheck1 - Проверить упорядочены ли элементы списка по возрастанию шифра детали от начала к концу.\ncheck2 - Проверить упорядочены ли элементы списка DSP от конца к началу по возрастанию шифра детали.\ncount - Подсчитать количество элементов списка, шифры деталей, в которых встречаются в списке только 1 раз, и вывести их на печать.\nsum - Найти сумму расценок по всем деталям, наибольшую и наименьшую расценки и соответ-ствующие наименования деталей.\ndel - Удаление по наименованию\nadd - Добавление в начало\nexit - Выход.";
- cout << "\n______________________________________________\n" << endl;
- cin >> command;
- } while (command != "exit");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement