Advertisement
ProgNeo

Untitled

May 19th, 2021
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include <iomanip>
  5. using namespace std;
  6.  
  7. class List
  8. {
  9. public:
  10.     List();
  11.     ~List();
  12.     //удаление первого элемента в списке
  13.     void pop_front();
  14.     //добавление элемента в конец списка
  15.     void push_back(string part_number, string name, int price, int weight);
  16.     // очистить список
  17.     void clear();
  18.     // получить количество элементов в списке
  19.     int GetSize() { return Size; }
  20.     // вывод детали
  21.     int number(const int index, string str);
  22.     //добавление элемента в начало списка
  23.     void push_front(string part_number, string name, int price, int weight);
  24.     //удаление элемента в списке по указанному индексу
  25.     void removeAt(int index);
  26.     //удаление последнего элемента в списке
  27.     void pop_back();
  28.     // Возвращение номера детали или наименования
  29.     string str(const int index, string str);
  30. private:
  31.     class Node
  32.     {
  33.     public:
  34.         Node* pNext;
  35.         Node* pPrev;
  36.         int price = 0, weight = 0;
  37.         string part_number = "", name = "";
  38.         Node(string part_number, string name, int price, int weight, Node* pNext = nullptr, Node* pPrev = nullptr)
  39.         {
  40.             this->part_number = part_number;
  41.             this->name = name;
  42.             this->price = price;
  43.             this->weight = weight;
  44.             this->pNext = pNext;
  45.             this->pPrev = pPrev;
  46.         }
  47.     };
  48.     int Size;
  49.     Node* head;
  50.     Node* tail;
  51. };
  52.  
  53. List::List()
  54. {
  55.     Size = 0;
  56.     head = nullptr;
  57.     tail = nullptr;
  58. }
  59.  
  60. List::~List()
  61. {
  62.     clear();
  63. }
  64.  
  65.  
  66. void List::pop_front()
  67. {
  68.     Node* temp = head;
  69.     if (head->pNext == nullptr)
  70.     {
  71.         delete temp;
  72.         Size--;
  73.     }
  74.     else
  75.     {
  76.         head = head->pNext;
  77.         head->pPrev = temp->pPrev;
  78.         delete temp;
  79.         Size--;
  80.     }
  81. }
  82.  
  83. void List::push_back(string part_number, string name, int price, int weight)
  84. {
  85.     if (head == nullptr)
  86.     {
  87.         head = new Node(part_number, name, price, weight);
  88.         tail = head;
  89.     }
  90.     else
  91.     {
  92.         Node* temp = tail;
  93.         tail = new Node(part_number, name, price, weight, nullptr, temp);
  94.         temp->pNext = tail;
  95.     }
  96.     Size++;
  97. }
  98.  
  99. void List::clear()
  100. {
  101.     while (Size)
  102.     {
  103.         pop_back();
  104.     }
  105. }
  106.  
  107. int List::number(const int index, string str)
  108. {
  109.     int counter = 0;
  110.     Node* current = this->head;
  111.     while (current != nullptr)
  112.     {
  113.         if (counter == index)
  114.         {
  115.             if (str == "price") return current->price;
  116.             if (str == "weight") return current->weight;
  117.         }
  118.         current = current->pNext;
  119.         counter++;
  120.     }
  121.     return 0;
  122. }
  123.  
  124. void List::push_front(string part_number, string name, int price, int weight)
  125. {
  126.     if (head == nullptr)
  127.     {
  128.         head = new Node(part_number, name, price, weight);
  129.         tail = head;
  130.     }
  131.     else
  132.     {
  133.         Node* temp = head;
  134.         head = new Node(part_number, name, price, weight);
  135.         head->pNext = temp;
  136.         temp->pPrev = head;
  137.     }
  138.     Size++;
  139. }
  140.  
  141. void List::removeAt(int index)
  142. {
  143.     if (index == 0)
  144.     {
  145.         pop_front();
  146.     }
  147.     else
  148.     {
  149.         if (index == Size - 1)
  150.         {
  151.             pop_back();
  152.         }
  153.         else
  154.         {
  155.             if (index + 1 <= Size / 2)
  156.             {
  157.                 Node* previous = this->head;
  158.                 for (int i = 0; i < index - 1; i++)
  159.                 {
  160.                     previous = previous->pNext;
  161.                 }
  162.                 Node* toDelete = previous->pNext;
  163.                 previous->pNext = toDelete->pNext;
  164.                 previous = toDelete->pNext;
  165.                 previous->pPrev = toDelete->pPrev;
  166.                 delete toDelete;
  167.             }
  168.             else
  169.             {
  170.                 Node* next = this->tail;
  171.                 for (int i = Size - 1; i > index - 1; i--)
  172.                 {
  173.                     next = next->pPrev;
  174.                 }
  175.                 Node* toDelete = next->pNext;
  176.                 next->pNext = toDelete->pNext;
  177.                 next = toDelete->pNext;
  178.                 next->pPrev = toDelete->pPrev;
  179.                 delete toDelete;
  180.             }
  181.             Size--;
  182.         }
  183.     }
  184. }
  185.  
  186. void List::pop_back()
  187. {
  188.     Node* temp = tail;
  189.     if (tail->pPrev == nullptr)
  190.     {
  191.         delete temp;
  192.         Size--;
  193.     }
  194.     else
  195.     {
  196.         tail = tail->pPrev;
  197.         tail->pNext = temp->pNext;
  198.         delete temp;
  199.         Size--;
  200.     }
  201. }
  202.  
  203. string List::str(const int index, string str)
  204. {
  205.     int counter = 0;
  206.     Node* current = this->head;
  207.     while (current != nullptr)
  208.     {
  209.         if (counter == index)
  210.         {
  211.             if (str == "name") return current->name;
  212.             if (str == "part_number") return current->part_number;
  213.         }
  214.         current = current->pNext;
  215.         counter++;
  216.     }
  217.     return str;
  218. }
  219.  
  220. int namesakes(List* lst, int size)
  221. {
  222.     int i = 0, j = i + 1;
  223.     while (i < size - 1)
  224.     {
  225.         while (j < size)
  226.         {
  227.             if (lst->str(i, "part_number") == lst->str(j, "part_number"))
  228.             {
  229.                 lst->removeAt(j);
  230.                 j--;
  231.                 size--;
  232.             }
  233.             j++;
  234.         }
  235.         i++;
  236.         j = i + 1;
  237.     }
  238.     return size;
  239. }
  240.  
  241. bool flag(List* lst, int size)
  242. {
  243.     string str1 = "", str2 = "";
  244.     for (int i = 0; i < size - 1; i++)
  245.     {
  246.         str1 = lst->str(i, "part_number");
  247.         str2 = lst->str(i + 1, "part_number");
  248.         for (unsigned short int k = 0; k < str1.length(); k++)
  249.             if (str1[k] > str2[k])
  250.                 return false;
  251.             else
  252.                 break;
  253.     }
  254.     return true;
  255. }
  256.  
  257. bool revers_flag(List* lst, int size)
  258. {
  259.     string str1 = "", str2 = "";
  260.     for (int i = 0; i < size - 1; i++)
  261.     {
  262.         str1 = lst->str(i, "part_number");
  263.         str2 = lst->str(i + 1, "part_number");
  264.         for (unsigned short int k = 0; k < str1.length(); k++)
  265.             if (str1[k] < str2[k])
  266.                 return false;
  267.             else
  268.                 break;
  269.     }
  270.     return true;
  271. }
  272.  
  273. int counter(List* lst, int size)
  274. {
  275.     int count = 0;
  276.     cout << "Элементы списка, шифры деталей, в которых встречаются в списке только 1 раз:" << endl;
  277.     size = lst->GetSize();
  278.     for (int i = 0; i < size; i++)
  279.     {
  280.         bool flag = true;
  281.         for (int j = 0; j < size; j++)
  282.         {
  283.             if (i == j)
  284.                 j++;
  285.             else if (lst->str(i, "part_number") == lst->str(j, "part_number"))
  286.             {
  287.                 flag = false;
  288.                 break;
  289.             }
  290.         }
  291.         if (flag)
  292.         {
  293.             count++;
  294.             cout << lst->str(i, "part_number") << endl;
  295.         }
  296.     }
  297.     cout << "Кол-во элементов = ";
  298.     return count;
  299. }
  300.  
  301. int multi_sum(List* lst, int size)
  302. {
  303.     int sum = 0, max = lst->number(0, "price"), min = max;
  304.     string name_max = lst->str(0, "name") + ' ', name_min = name_max;
  305.     for (int i = 0; i < size; i++)
  306.     {
  307.         sum += lst->number(i, "price");
  308.         if (max < lst->number(i, "price"))
  309.         {
  310.             max = lst->number(i, "price");
  311.             name_max = lst->str(i, "name") + ' ';
  312.         }
  313.         if (min > lst->number(i, "price"))
  314.         {
  315.             min = lst->number(i, "price");
  316.             name_min = lst->str(i, "name") + ' ';
  317.         }
  318.     }
  319.     cout << "Максимальный элемент: " << name_max << max << endl;
  320.     cout << "Минимальный элемент: " << name_min << min << endl;
  321.     cout << "Сумма = ";
  322.     return sum;
  323. }
  324.  
  325. void start(List* lst)
  326. {
  327.     lst->push_front("2313", "gtu", 390, 101);
  328.     lst->push_front("1231", "ghy", 912, 900);
  329.     lst->push_front("8132", "hut", 832, 799);
  330. }
  331.  
  332. void add(List* lst)
  333. {
  334.     string part_number = "", name = "", str = "";
  335.     int price = 0, weight = 0;
  336.     ifstream text;
  337.     bool flag = true;
  338.     while (flag)
  339.     {
  340.         cout << "Шифр детали: "; cin >> part_number;
  341.         cout << "Название детали: "; cin >> name;
  342.         cout << "Цена детали: "; cin >> price;
  343.         cout << "Вес детали: "; cin >> weight;
  344.         lst->push_front(part_number, name, price, weight);
  345.         cout << "Желаете ещё добавить элементы? " << endl;
  346.     tryAgain:
  347.         cin >> str;
  348.         if (str == "Да" or str == "да" or str == "ДА" or str == "lf" or str == "Lf" or str == "LF")
  349.             flag = true;
  350.         else if (str == "Нет" or str == "нет" or str == "НЕТ" or str == "Ytn" or str == "YTN" or str == "ytn")
  351.             flag = false;
  352.         else
  353.         {
  354.             cout << "Введите \"Да\" или \"Нет\" " << endl;
  355.             goto tryAgain;
  356.         }
  357.     }
  358. }
  359.  
  360. int remove(List* lst, int size)
  361. {
  362.     int i = 0;
  363.     string str = "", name = "";
  364.     bool flag = true;
  365.     while (flag)
  366.     {
  367.         cout << "Введите наименование, по которому сделать удаление: "; cin >> name;
  368.         i = 0;
  369.         while (i < size)
  370.         {
  371.             if (name == lst->str(i, "name"))
  372.             {
  373.                 lst->removeAt(i);
  374.                 size--;
  375.                 i--;
  376.             }
  377.             i++;
  378.         }
  379.         cout << "Желаете снова удалить по наименованию? " << endl;
  380.     tryAgain:
  381.         cin >> str;
  382.         if (str == "Да" or str == "да" or str == "ДА" or str == "lf" or str == "Lf" or str == "LF")
  383.             flag = true;
  384.         else if (str == "Нет" or str == "нет" or str == "НЕТ" or str == "Ytn" or str == "YTN" or str == "ytn")
  385.             flag = false;
  386.         else
  387.         {
  388.             cout << "Введите \"Да\" или \"Нет\" " << endl;
  389.             goto tryAgain;
  390.         }
  391.     }
  392.     return size;
  393. }
  394.  
  395. void print(List* lst, int size)
  396. {
  397.     for (int i = 0; i < size; i++)
  398.     {
  399.         cout << lst->str(i, "part_number") << setw(15) << right;
  400.         cout << lst->str(i, "name") << setw(22) << right;
  401.         cout << lst->number(i, "price") << setw(20) << right;
  402.         cout << lst->number(i, "weight") << endl;
  403.     }
  404. }
  405.  
  406. int main()
  407. {
  408.     setlocale(LC_ALL, "Russian");
  409.     system("chcp 1251 >> null");
  410.     List lst;
  411.     int N = 0;
  412.     string command = "show";
  413.     start(&lst);
  414.     int size = lst.GetSize();
  415.  
  416.     do {
  417.         if (command == "show")
  418.         {
  419.             cout << "Шифр" << setw(16) << right << "Название" << setw(23) << right << "Цена" << setw(20) << right << "Вес" << endl;
  420.             print(&lst, size);
  421.         }
  422.         else if (command == "del1")
  423.         {
  424.             lst.removeAt(size - 3);
  425.             size--;
  426.         }
  427.         else if (command == "del2")
  428.         {
  429.             cout << "Введите номер элемента, который хотите удалить(с начала)" << endl; cin >> N;
  430.             lst.removeAt(N - 1);
  431.             size--;
  432.         }
  433.         else if (command == "del3")
  434.         {
  435.             cout << "Введите номер элемента, который хотите удалить(с конца)" << endl; cin >> N;
  436.             lst.removeAt(size - N);
  437.             size--;
  438.         }
  439.         else if (command == "del4")
  440.             size = namesakes(&lst, size);
  441.         else if (command == "check1")
  442.         {
  443.             if (flag(&lst, size))
  444.                 cout << "Верно" << endl;
  445.             else
  446.                 cout << "Ложно" << endl;
  447.         }
  448.         else if (command == "check2")
  449.         {
  450.             if (revers_flag(&lst, size))
  451.                 cout << "Верно" << endl;
  452.             else
  453.                 cout << "Ложно" << endl;
  454.         }
  455.         else if (command == "count")
  456.             cout << counter(&lst, size) << endl;
  457.         else if (command == "sum")
  458.             cout << multi_sum(&lst, size) << endl;
  459.         else if (command == "del")
  460.         {
  461.             size = remove(&lst, size);
  462.         }
  463.         else if (command == "add")
  464.         {
  465.             add(&lst);
  466.             size = lst.GetSize();
  467.         }
  468.         cout << "______________________________________________\n\nВведите команду.\nshow - Показать вывод эл-тов.\ndel1 - Удалить элемент, предшествующий 2-му с конца списка элементу.\ndel2 - Удалить элемент с заданным номером К от начала списка.\ndel3 - Удалить элемент с заданным номером от конца списка.\ndel4 - Удалить повторяющиеся элементы списка DSP, если в них совпадает шифр и наименование.\ncheck1 - Проверить упорядочены ли элементы списка по возрастанию шифра детали от начала к концу.\ncheck2 - Проверить упорядочены ли элементы списка DSP от конца к началу по возрастанию шифра детали.\ncount - Подсчитать количество элементов списка, шифры деталей, в которых встречаются в списке только 1 раз, и вывести их на печать.\nsum - Найти сумму расценок по всем деталям, наибольшую и наименьшую расценки и соответ-ствующие наименования деталей.\ndel - Удаление по наименованию\nadd - Добавление в начало\nexit - Выход.";
  469.         cout << "\n______________________________________________\n" << endl;
  470.         cin >> command;
  471.     } while (command != "exit");
  472.     return 0;
  473. }
  474.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement