Savelyev_Vyacheslav

AIP_2021

May 23rd, 2021 (edited)
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream> // chtenie faila
  4. #include <stdlib.h>     //for using the function sleep
  5. #include <windows.h> // для Win32 систем
  6. #include <clocale>
  7. #include <typeinfo>
  8. using namespace std;
  9.  
  10.  
  11. class Otsenki {
  12.     string fizika;
  13.     string istoriya;
  14.     string informatika;
  15.     friend class List;
  16.     friend class Node;
  17. };
  18. class Node
  19. {
  20.     string FirstName;
  21.     string LastName;
  22.     string N_student;
  23.     Otsenki* OtsenkiPtr = new Otsenki();
  24.     class Node* ptr;
  25.     friend class List;
  26. };
  27.  
  28.  
  29.  
  30. class List
  31. {
  32.     Node* head;
  33.     int count = 0;
  34.     Node* Prev(Node*); // Переход к предыдущему узлу (не интерфейсный метод)
  35. public:
  36.     List() { head = NULL; } // Инициализация списка
  37.     int getCount() { return count; } // Получение количества узлов списка
  38.     bool isEmpty() { return head == NULL; }  // Проверка, пуст ли список
  39.     string getValue1(Node* p) { return p->FirstName; } // Получение значения  узла списка
  40.     string getValue2(Node* p) { return p->LastName; } // Получение значения узла списка
  41.     string getValue3(Node* p) { return p->N_student; } // Получение значения 2го узла списка
  42.     string getValue4(Node* p) { return p->OtsenkiPtr->fizika; }
  43.     string getValue5(Node* p) { return p->OtsenkiPtr->istoriya; }
  44.     string getValue6(Node* p) { return p->OtsenkiPtr->informatika; }
  45.  
  46.     Node* Add(string, string, string, string, string, string, Node*); // Добавление узла списка
  47.     Node* ChekValidALL(string, string, string, string, string, string); // Добавление узла списка
  48.     void setValue(Node* p, int val) { p->FirstName = val; } // Установка значения узла списка
  49.     Node* getFirst() { return head; } // Получение корневого узла списка
  50.     Node* getLast();            // Получение последнего узла списка
  51.     void Clear();               // Очистка списка
  52.     Node* Next(Node*);          // Переход к следующему узлу
  53.  
  54.     Node* Delete(Node*);        // Удаление узла списка
  55.     void Print();               // Вывод значений узлов списка
  56.     void Swap(Node*, Node*);    // Взаимообмен двух узлов
  57.     void Swap2(Node*, Node*);
  58.     int chekMaxID(Node*, Node*);
  59.     void sort();
  60.     void String_total_X();              // поиск X
  61.     int ValidText(string);
  62.     int ValidChislo(string);
  63.     string reedOfFile(string);
  64.     void Delete_ALL();
  65.     Node* Print_By_value();
  66.     int CountElement();
  67.  
  68.     Node* Nomer_s_kontsa_del(); // удален середина по номеру
  69.     Node* Zamena(); // замена
  70.     void Help();
  71.     Node* Zamena_ptr(); // замена по указателю
  72.     Node* HeadToEnd(); // замена местами по указателю первый назад последний вперед
  73.     Node* FILO(); // первый назад
  74.     Node* LIFO(); // последний вперед
  75.     void StekOperation(); // DZ po AIP
  76.  
  77.     Node* Dobav_n_last(string); // добавить в конец
  78.     Node* Dobav_pre_last(); // добавить перед конец
  79.     Node* Dobav_head(); // добавить перед конец
  80.     Node* Dobav_head_next(); // добавить перед конец
  81.  
  82.     Node* head_del(); // udalit golovu
  83.     Node* head_next_del(); // udalit 2 s golovu
  84.     Node* Delete_end(); // удаляет конец
  85.     Node* Delete_prev_end(); // удален предпоследний
  86.  
  87.     Node* Del_By_value(); // udalit po znacheniu
  88.     void WriteFromProgToTxt(string);
  89.     void ReedOfTxtToProg(string);
  90.    
  91. };
  92.  
  93. Node* List::ChekValidALL(string num1, string num2, string num3, string num4, string num5, string num6)
  94. {
  95.     if (!ValidChislo(num1)) { cout << " 1-N_student "; return NULL; }
  96.     if (!ValidText(num2)) { cout << " 2-FirstName "; return NULL; }
  97.     if (!ValidText(num3)) { cout << " 3-LastName "; return NULL; }
  98.     if (!ValidChislo(num4)) { cout << " 4-fizika "; return NULL; }
  99.     if (!ValidChislo(num5)) { cout << " 5-istoriya "; return NULL; }
  100.     if (!ValidChislo(num6)) { cout << " 6-informatika "; return NULL; }
  101. }
  102.  
  103. Node* List::Add(string num1, string num2, string num3, string num4, string num5, string num6, Node* node = NULL)
  104. {
  105.     ChekValidALL(num1, num2, num3, num4, num5, num6);
  106.     Node* elem = new Node();
  107.     elem->FirstName = num1;
  108.     elem->LastName = num2;
  109.     elem->N_student = num3;
  110.     elem->OtsenkiPtr->fizika = num4;
  111.     elem->OtsenkiPtr->istoriya = num5;
  112.     elem->OtsenkiPtr->informatika = num6;
  113.  
  114.     count++;
  115.     if (node == NULL) // Добавление нового корня
  116.     {
  117.         if (head == NULL) {
  118.             elem->ptr = NULL;
  119.             head = elem;
  120.         }
  121.         else {
  122.             elem->ptr = head;
  123.             head = elem;
  124.         }
  125.         return elem;
  126.     }
  127.     elem->ptr = node->ptr; // Добавление узла после текущего
  128.     node->ptr = elem;
  129.     return elem;
  130. }
  131.  
  132. Node* List::Delete(Node* node)
  133. {
  134.     if (node == NULL) { return NULL; } // В списке нет узлов
  135.     count--;
  136.     if (node == head)   // Удаление корневого узла
  137.     {
  138.         head = node->ptr;
  139.         delete node;
  140.         return head;
  141.     }
  142.     Node* prev = Prev(node); // Удаление промежуточного узла
  143.     prev->ptr = node->ptr;
  144.     delete node;
  145.     return prev;
  146. }
  147. ////////////////
  148. Node* List::Delete_end()
  149. {
  150.     Node* temp = NULL;
  151.     Node* head2 = head;
  152.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  153.     count--;
  154.     while (head2->ptr != NULL) {  // перемотка на последние указатели
  155.         temp = head2;
  156.         head2 = head2->ptr;
  157.     }
  158.     if (temp) {
  159.         //<udalenie poslednego>
  160.         temp->ptr = NULL;
  161.         delete head2;
  162.         //< /udalenie poslednego>
  163.     }
  164.     cout << temp->FirstName << " - " << temp << " - " << temp->ptr << endl;
  165. }
  166. ////////////////
  167. ////////////////
  168. Node* List::Dobav_head()
  169. {
  170.     Node* temp = NULL;
  171.     Node* head2 = head;
  172.     //Node *uzel = head;
  173.     //cout << "add to head: ";
  174.     string z1, z2, z3, z4, z5, z6;
  175.  
  176.     cout << "Введите порядковый номер:     "; cin >> z1;
  177.     cout << "Введите имя:                  "; cin >> z2;
  178.     cout << "Введите фамелию:              "; cin >> z3;
  179.     cout << "Введите оценки через ENTER:   " << endl;
  180.     cout << "                    Физика:   "; cin >> z4;
  181.     cout << "                   История:   "; cin >> z5;
  182.     cout << "               Информатика:   "; cin >> z6;
  183.  
  184.    
  185.     ChekValidALL(z1, z2, z3, z4, z5, z6);
  186.     //<opation>
  187.     Node* elem = new Node();
  188.     elem->N_student = z1;
  189.     elem->FirstName = z2;
  190.     elem->LastName = z3;
  191.     elem->OtsenkiPtr->fizika = z4;
  192.     elem->OtsenkiPtr->istoriya = z5;
  193.     elem->OtsenkiPtr->informatika = z6;
  194.     elem->ptr = head2;
  195.     head = elem;
  196.     //</opation>
  197.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  198.     count++;
  199. }
  200. ////////////////
  201. ////////////////
  202. Node* List::Dobav_head_next()
  203. {
  204.     Node* t1 = NULL;
  205.     Node* t2 = head;
  206.     t1 = head;
  207.     t2 = t2->ptr;
  208.     //<operation>
  209.     Node* elem2 = new Node();
  210.     elem2->FirstName = "88";
  211.     t1->ptr = elem2;
  212.     elem2->ptr = t2;
  213.     //<operation>
  214.     if (t2 == NULL) { return NULL; } // В списке нет узлов
  215.     count++;
  216. }
  217. ////////////////
  218. ////////////////
  219. Node* List::Dobav_n_last(string value = "88")
  220. {
  221.     Node* temp = NULL;
  222.     Node* head2 = head;
  223.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  224.     count++;
  225.     while (head2->ptr != NULL) {
  226.         temp = head2;
  227.         head2 = head2->ptr;
  228.     }
  229.     // <operation>
  230.     Node* elem2 = new Node();
  231.     elem2->FirstName = value;
  232.     elem2->ptr = NULL;
  233.     head2->ptr = elem2;
  234.     // </operation>
  235.     cout << head2->FirstName << " test " << head2 << " test " << endl;
  236.     cout << head2->ptr->FirstName << " test " << head2->ptr << " test " << endl;
  237. }
  238. ////////////////
  239. /////////////////
  240. Node* List::Dobav_pre_last()
  241. {
  242.     Node* temp = NULL;
  243.     Node* t = head;
  244.     Node* head2 = head;
  245.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  246.     count--;
  247.     while (head2->ptr != NULL) {
  248.         head2 = head2->ptr;
  249.         t = t->ptr;
  250.         if (t->ptr->ptr == NULL) {
  251.             temp = t->ptr;
  252.             cout << t->FirstName << " test2 " << t << " test2 " << endl;
  253.             cout << temp->FirstName << " test2 " << temp->ptr << " test2 " << endl;
  254.             //<operation>
  255.             Node* elem2 = new Node();
  256.             elem2->FirstName = "88";
  257.             t->ptr = elem2;
  258.             elem2->ptr = temp;
  259.             //</operation>
  260.             return NULL;
  261.         }
  262.     }
  263. }
  264. ////////////////
  265. ////////////////
  266. Node* List::Delete_prev_end()
  267. {
  268.     count++;
  269.     Node* temp = NULL;
  270.     Node* head2 = head;
  271.     Node* t = head;
  272.     Node* t2 = head;
  273.     Node* t3 = head;
  274.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  275.     if (head2->ptr == NULL) { return NULL; } // В списке нет узлов по условию
  276.     if (head2->ptr->ptr == NULL) { return NULL; } // В списке нет узлов
  277.     count--;
  278.     int j = 0;
  279.     cout << head2->FirstName << " - " << head2 << " - " << endl;
  280.     while (head2->ptr != NULL) {
  281.         j++;
  282.         head2 = head2->ptr;
  283.         temp = head2;
  284.         t = temp->ptr;
  285.         t3 = t->ptr;
  286.         cout << temp->FirstName << " - " << temp << " - " << endl;
  287.         cout << t->FirstName << " - " << t << " - " << endl;
  288.         cout << t3->FirstName << " - " << t3 << " - " << endl;
  289.  
  290.         if (head2->ptr->ptr->ptr == NULL) {
  291.             //// <operation>
  292.             temp->ptr = t3; delete t;
  293.             //// </operation>
  294.             cout << temp->FirstName << " Проверка " << temp << " - " << endl;
  295.             cout << temp->ptr->FirstName << " Проверка " << temp->ptr << " - " << endl;
  296.             cout << "temp->ptr->ptr->FirstName" << " Проверка " << temp->ptr->ptr << " - " << endl;
  297.             cout << "t3->ptr->FirstName" << " - " << t3->ptr << " - " << endl;
  298.             return NULL;
  299.         }
  300.     }
  301. }
  302. ///////////////////
  303. ////////////////
  304. Node* List::Nomer_s_kontsa_del()
  305. {
  306.     count++;
  307.     Node* temp = NULL;
  308.     Node* head2 = head;
  309.     Node* t = head;
  310.     Node* t2 = head;
  311.     Node* t3 = head;
  312.     Node* t4 = head;
  313.     int nomer_s_kontsa = 4;
  314.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  315.     count--;
  316.     int i = 0;
  317.     int vsego;
  318.     while (t2->ptr != NULL) {
  319.         t2 = t2->ptr;
  320.         i++;
  321.         vsego = i;
  322.     }
  323.     // proverka na sootvetstvie spisku
  324.     if ((vsego + 1) <= nomer_s_kontsa) { cout << " Nomer ne sootvetstvuet spisku|" << nomer_s_kontsa << "- этого номера нет " << endl;   return NULL; }
  325.  
  326.     cout << " vsego  " << (vsego + 1) << " - " << endl;
  327.     int j = 0;
  328.  
  329.     while (head2->ptr != NULL) {
  330.         if (j == (vsego - nomer_s_kontsa)) {
  331.             temp = head2;
  332.             t = temp->ptr;
  333.             t3 = t->ptr;
  334.             //// <perenos ukazatelya udalenie>
  335.             temp->ptr = t3; delete t;
  336.             //// </ perenos ukazatelya udalenie>
  337.             cout << j << " Проверка " << temp << " - " << endl;
  338.             head2 = head2->ptr;
  339.         }
  340.         else {
  341.             head2 = head2->ptr;
  342.         }
  343.         j++;
  344.     }
  345. }
  346. ///////////////////
  347. int List::CountElement()
  348. {
  349.     Node* t = head;
  350.  
  351.     int i = 0;
  352.     int vsego;
  353.     while (t->ptr != NULL) {
  354.         t = t->ptr;
  355.         i++;
  356.         vsego = i;
  357.     }
  358.     return vsego;
  359. }
  360. ////////////////
  361. Node* List::Del_By_value()
  362. {
  363.     Node* temp = NULL;
  364.     Node* head2 = head;
  365.     Node* t = head;
  366.     Node* t2 = head;
  367.     Node* t3 = head;
  368.     Node* t4 = head;
  369.     Node* tail = head;
  370.  
  371.     string value_del;
  372.     cin >> value_del;
  373.     if (head2 == NULL) { cout << "pusto "; return NULL; } // В списке нет узлов
  374.     if (head2->ptr == NULL) { cout << "udali vse ";  return NULL; } // В списке 1 узел
  375.     while (tail->ptr != NULL) {
  376.         tail = tail->ptr;
  377.         //cout << " Проверка222 " << tail->FirstName << " - " << endl;
  378.     }
  379.  
  380.     if (head2->ptr->ptr == NULL) {
  381.         if (head2->LastName == value_del) {  // kluch v golove
  382.             head_del(); //cout << "test ";
  383.         }
  384.         if (tail->LastName == value_del) { // kluch v hvoste
  385.             Delete_end();
  386.         }
  387.         return NULL;
  388.     } // В списке 2 узла
  389.     else {
  390.         int j = 0;
  391.         while (head2 != NULL) {
  392.             temp = head2;
  393.             t = temp->ptr;
  394.             if (t->LastName == value_del) {
  395.  
  396.                 t3 = t->ptr;
  397.                 //// <operation>
  398.                 temp->ptr = t3; delete t;
  399.                 //// </operation>
  400.                 //cout << j << " Проверка " << temp->FirstName << " - " << endl;
  401.                 //cout << j << " Проверка " << t->FirstName << " - " << endl;
  402.                 //cout << j << " Проверка " << t3->FirstName << " - " << endl;
  403.                 break;
  404.             }
  405.             head2 = head2->ptr;
  406.             j++;
  407.         }
  408.     }
  409. }
  410. ///////////////////
  411. ////////////////
  412. Node* List::Print_By_value()
  413. {
  414.     Node* head2 = head;
  415.  
  416.     string value_del;
  417.     cout << " Vvedite FAMELIU dlya poiska > ";
  418.     cin >> value_del;
  419.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  420.  
  421.     while (head2 != NULL) {
  422.  
  423.         if (head2->LastName == value_del) {
  424.             //typ[0];
  425.             cout << " Nomer > " << head2->N_student << " < " << head2->FirstName + ' ' << head2->LastName + ' ' << head2->OtsenkiPtr->fizika + ' ' << head2->OtsenkiPtr->istoriya + ' ' << head2->OtsenkiPtr->informatika + ' ' << endl;
  426.         }
  427.         head2 = head2->ptr;
  428.     }
  429. }
  430. ///////////////////
  431. ////////////////
  432. Node* List::head_next_del()
  433. {
  434.     Node* t1 = NULL;
  435.     Node* head2 = head;
  436.     Node* t2 = head;
  437.     Node* t3 = head;
  438.     t1 = head;
  439.     t2 = t1->ptr;
  440.     t3 = t2->ptr;
  441.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  442.     // <ukazateli dlya operatsii>
  443.     cout << t1->FirstName << " - " << t1 << " - " << endl;
  444.     cout << t2->FirstName << " - " << t2 << " - " << endl;
  445.     cout << t3->FirstName << " - " << t3 << " - " << endl;
  446.     // </ukazateli dlya operatsii>
  447.     // <operation>
  448.     t1->ptr = t3;
  449.     t2->ptr = NULL;
  450.     delete t2;
  451.     // </operation>
  452.     // <proverka>
  453.     cout << head2->FirstName << " - " << head2 << " - " << endl;
  454.     cout << head2->ptr->FirstName << " - " << head2->ptr << " - " << endl;
  455.     cout << head2->ptr->ptr->FirstName << " - " << head2->ptr->ptr << " - " << endl;
  456.     // </proverka>
  457. }
  458. ////////////////
  459. ////////////////
  460. Node* List::head_del()
  461. {
  462.     Node* h = head;
  463.     Node* t = head;
  464.     if (h == NULL) { return NULL; } // В списке нет узлов
  465.     //<operation>
  466.     head = h->ptr;
  467.     t = NULL;
  468.     delete t;
  469.     //</operation>
  470. }
  471. ////////////////
  472. ////////////////
  473. Node* List::Zamena_ptr()
  474. {
  475.     Node* temp = NULL;
  476.     Node* head2 = head;
  477.     Node* t = head;
  478.     Node* t2 = head;
  479.     Node* t3 = head;
  480.     Node* t4 = head;
  481.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  482.     int i = 0;
  483.     int n_zameny = 3;
  484.     while (head2->ptr != NULL) {
  485.         t2 = head2;
  486.         head2 = head2->ptr;
  487.         if (i == (n_zameny - 2)) {
  488.             temp = head2;
  489.             cout << " Замена " << n_zameny << endl;
  490.             head2 = head2->ptr;
  491.             t3 = temp->ptr;
  492.             // <vivod nuzhnih peremennih>
  493.             cout << t->FirstName << " - " << t << " - " << endl;
  494.             cout << t2->FirstName << " - " << t2 << " - " << endl;
  495.             cout << temp->FirstName << " - " << temp << " - " << endl;
  496.             cout << t3->FirstName << " - " << t3 << " - " << endl;
  497.             // </vivod nuzhnih peremennih>
  498.             // </ operation>
  499.             t4 = t4->ptr;  // второй
  500.             t2->ptr = t;  // связь перед t. t был первым
  501.             t->ptr = t3;  // связь после t. t был первым
  502.             head = temp; // новый хэд темп выбран по номеру n_zameny
  503.             temp->ptr = t4; // указатель на второй
  504.             // < operation>
  505.             // < proverka>
  506.             cout << head->FirstName << " 1 " << head << " - " << endl;
  507.             cout << t2->FirstName << " n " << t2 << " - " << endl;
  508.             cout << t2->ptr->FirstName << " n+1 " << t2->ptr << " - " << endl;
  509.             cout << t3->FirstName << " n+2 " << t3 << " - " << endl;
  510.             // < proverka>
  511.         }
  512.         i++;
  513.     }
  514. }
  515. ///////////////////
  516. ////////////////
  517. Node* List::HeadToEnd()
  518. {
  519.     Node* temp = NULL;
  520.     Node* head2 = head;
  521.     Node* t = head;
  522.     Node* t2 = head;
  523.     Node* t3 = head;
  524.     Node* t4 = head;
  525.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  526.     int i = 0;
  527.     int n_zameny = 10;
  528.     while (head2->ptr != NULL) {
  529.         head2 = head2->ptr;
  530.         t2 = head2;
  531.         if (t2->ptr->ptr->ptr == NULL) {
  532.             t2 = head2;
  533.             temp = t2->ptr;
  534.             cout << " Замена " << n_zameny << endl;
  535.             //head2 = head2->ptr;
  536.             t3 = temp->ptr;
  537.             // <vivod nuzhnih peremennih>
  538.             cout << t->FirstName << " - " << t << " - " << endl;
  539.             cout << t2->FirstName << " - " << t2 << " - " << endl;
  540.             cout << temp->FirstName << " - " << temp << " - " << endl;
  541.             cout << t3->FirstName << " - " << t3 << " - " << endl;
  542.             // </vivod nuzhnih peremennih>
  543.             // </ podstanovka>
  544.             t4 = t4->ptr;
  545.             head = t3;
  546.             t3->ptr = t4;
  547.             temp->ptr = t; t->ptr = NULL;
  548.             // < podstanovka>
  549.             return NULL;
  550.         }
  551.         i++;
  552.     }
  553. }
  554. ///////////////////
  555. ////////////////
  556. Node* List::LIFO()
  557. {
  558.     Node* temp = NULL;
  559.     Node* head2 = head;
  560.     Node* t = head;
  561.     Node* tt = head;
  562.     Node* t2 = head;
  563.     Node* t3 = head;
  564.     Node* t4 = head;
  565.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  566.     int i = 0;
  567.     int n_zameny = 10;
  568.  
  569.     while (head2->ptr != NULL) {
  570.         t2 = head2;
  571.         t4 = t2->ptr;
  572.  
  573.         if (t2->ptr->ptr == NULL) {
  574.             // <vivod nuzhnih peremennih>
  575.             cout << t2->FirstName << " -- " << t2 << " - " << endl;
  576.             cout << t4->FirstName << " -- " << t4 << " - " << endl;
  577.             // </vivod nuzhnih peremennih>
  578.             // </ podstanovka>
  579.             head = t4;
  580.             t4->ptr = t3;
  581.             t2->ptr = NULL;
  582.             // < podstanovka>
  583.             return NULL;
  584.         }
  585.         head2 = head2->ptr; t2 = t2->ptr;
  586.         i++;
  587.     }
  588.  
  589. }
  590. ///////////////////
  591. ////////////////
  592. Node* List::FILO()
  593. {
  594.     Node* temp = NULL;
  595.     Node* head2 = head;
  596.     Node* t = head;
  597.     Node* tt = head;
  598.     Node* t2 = head;
  599.     Node* t3 = head;
  600.     Node* t4 = head;
  601.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  602.     int i = 0;
  603.     while (head2->ptr != NULL) {
  604.         head2 = head2->ptr;
  605.         t2 = head2;
  606.         if (t2->ptr == NULL) {
  607.             t2 = head2;
  608.             temp = t2->ptr;
  609.             // <vivod nuzhnih peremennih>
  610.             //cout << t->FirstName << " -- " << t << " - " << endl;
  611.             //cout << t2->FirstName << " -- " << t2 << " - " << endl;
  612.             // </vivod nuzhnih peremennih>
  613.             // </ podstanovka>
  614.             t4 = t4->ptr;
  615.             head = t4;
  616.             t2->ptr = t;
  617.             t->ptr = NULL;
  618.             // < podstanovka>
  619.             return NULL;
  620.         }
  621.         i++;
  622.     }
  623.  
  624. }
  625. ///////////////////
  626. ////////////////
  627. Node* List::Zamena()
  628. {
  629.     Node* temp = NULL;
  630.     Node* head2 = head;
  631.     Node* t = head;
  632.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  633.     int i = 0;
  634.     int n_zameny;
  635.     cout << " Введи номер замены " << endl;
  636.     cin >> n_zameny;
  637.  
  638.     while (head2->ptr != NULL) {
  639.         if (i == (n_zameny - 1)) {
  640.             temp = head2;
  641.             cout << " Замена " << n_zameny << endl;
  642.         }
  643.         head2 = head2->ptr;
  644.         cout << i << " - " << t << " - " << endl;
  645.         cout << i << " - " << temp << " - " << endl;
  646.         cout << i << " - " << head2->ptr << " - " << endl;
  647.         i++;
  648.     }
  649.     if (temp) {
  650.         string zamen1;
  651.         zamen1 = temp->FirstName;
  652.         temp->FirstName = t->FirstName; // вставляем значение первого в выбранный
  653.         t->FirstName = zamen1; // вставляем в первый значение выбранного
  654.     }
  655. }
  656. ///////////////////
  657. void List::Help()
  658. {
  659.     cout << "Operation  Dobav_head-1 head_del-2 AddTail-3 DelTail-4 Print-5 Delet_ALL-6 ReedOf.Txt-7 \n";
  660.     cout << "WriteFromProgToTxt-8 Print_By_value-9 Del_By_value-10 Exit-anyKEY SetFileName-11 sort()-12 \n";
  661.    
  662. }
  663. ////////////////
  664. void List::StekOperation()
  665. {
  666.     string nameFile = "write.txt";
  667.     cout << "Enter any KEY operation  Help-0:  ";
  668.     while (true)
  669.     {
  670.         int opN;
  671.         cin >> opN;
  672.         switch (opN) {
  673.         case 0:
  674.             Help();
  675.             break;
  676.         case 1:
  677.             cout << "Dobav_head\n"; Dobav_head();
  678.             break;
  679.         case 2:
  680.             cout << "head_del\n"; head_del();
  681.             break;
  682.         case 3:
  683.             cout << "AddTail\n"; Dobav_head(); FILO();
  684.             break;
  685.         case 4:
  686.             cout << "DelTail\n";  LIFO(); head_del();
  687.             break;
  688.         case 5:
  689.             cout << "Print\n"; Print();
  690.             break;
  691.         case 6:
  692.             cout << "Delete_ALL\n"; Delete_ALL();
  693.             break;
  694.         case 7:
  695.             cout << "ReedOfTxtToProg\n"; ReedOfTxtToProg(nameFile);
  696.             break;
  697.         case 8:
  698.             cout << "WriteFromProgToTxt\n"; WriteFromProgToTxt(nameFile);
  699.             break;
  700.         case 9:
  701.             cout << "Print_By_value\n"; Print_By_value();
  702.             break;
  703.         case 10:
  704.             cout << "Del_By_value\n"; Del_By_value();
  705.             break;
  706.         case 11:
  707.             cout << "Set file name: "; cin >> nameFile;
  708.             break;
  709.         case 12:
  710.             cout << "sort()";
  711.             sort();
  712.             break;
  713.         default:
  714.             cout << "Exit\n"; goto tryAgain;
  715.         }
  716.     }
  717. tryAgain: // это лейбл
  718.     exit;
  719. }
  720. ///////////////////
  721.  
  722. void List::Print()
  723. {
  724.     if (isEmpty()) { cout << "Список пуст" << endl; return; }
  725.     Node* p = head;
  726.     do {
  727.         cout << getValue1(p)
  728.             << " " << getValue2(p)
  729.             << " " << getValue3(p)
  730.             << " " << getValue4(p)
  731.             << " " << getValue5(p)
  732.             << " " << getValue6(p)
  733.             << "\n";
  734.         p = Next(p);
  735.     } while (p != NULL);
  736.     cout << endl;
  737. }
  738.  
  739. void List::Clear()
  740. {
  741.     class Node* p = head;
  742.     if (p == NULL) return;
  743.     do {
  744.         Node* d = p;
  745.         p = Next(p);
  746.         delete d;
  747.     } while (p != NULL);
  748.     count = 0;
  749.     head = NULL;
  750. }
  751. void List::Delete_ALL()
  752. {
  753.     class Node* p = head;
  754.     if (p == NULL) return;
  755.     do {
  756.         Node* d = p;
  757.         p = p->ptr;
  758.         delete d;
  759.     } while (p != NULL);
  760.     count = 0;
  761.     head = NULL;
  762. }
  763.  
  764. Node* List::getLast()
  765. {
  766.     Node* p = head;
  767.     while (Next(p) != NULL)
  768.         p = Next(p);
  769.     return p;
  770. }
  771.  
  772. Node* List::Next(Node* node)
  773. {
  774.     if (isEmpty()) return NULL;
  775.     return node->ptr;
  776. }
  777.  
  778. Node* List::Prev(Node* node)
  779. {
  780.     if (isEmpty()) return NULL;
  781.     if (node == head) return NULL;
  782.     Node* p = head;
  783.     while (p->ptr != node)
  784.         p = p->ptr;
  785.     return p;
  786. }
  787.  
  788. void List::String_total_X() {
  789.  
  790.     string nameFile = "students.txt";
  791.     string s = reedOfFile(nameFile);
  792.     //<podschet vseh simvolov v tekste>
  793.     ifstream inf(nameFile);
  794.     //cout << "start str";
  795.     int p = 0;
  796.     int i = 0;
  797.     while (inf)
  798.     {
  799.         i++;
  800.         cout << "\n<-----str#" << i << "/---->" << endl;
  801.         // то перемещаем то, что можем прочитать, в строку, а затем выводим эту строку на экран
  802.         string str;
  803.         getline(inf, str);
  804.         cout << str;
  805.  
  806.         p = 0;
  807.         if (str.find('X') != -1) {
  808.             //ValidText(s);
  809.             cout << "\n<----/str#" << i << "----->";
  810.             cout << " Elementov v stroke - ";
  811.             for (auto c : str)
  812.                 if (c == 'X') {
  813.                     p++;
  814.                 }
  815.             cout << p << "\n";
  816.         }
  817.  
  818.     }
  819.  
  820.     p = 0;
  821.     if (s.find('X') != -1) {
  822.         cout << "\n" << "\nVsego elementov v spiske ";
  823.         for (auto c : s)
  824.             if (c == 'X') {
  825.                 p++;
  826.             }
  827.         cout << p << "\n\n";
  828.     }
  829.     std::system("pause");
  830.     //</podschet vseh simvolov v tekste>
  831.  
  832. }
  833. ////////////////
  834. int List::ValidText(string s) {
  835.     for (auto c : s)
  836.         if ((c <= '9') && (c >= '0')) {
  837.             cout << "Vi vveli cislo ne tuda";
  838.             return 0;
  839.         }
  840.     return 1;
  841. }
  842. ////////////////
  843. ////////////////
  844. int List::ValidChislo(string s) {
  845.     for (auto c : s) {
  846.         if ((c <= 'z') && (c >= 'a')) {
  847.             cout << "Vi vveli text ne tuda"; return 0;
  848.         }
  849.         else if ((c <= 'Z') && (c >= 'A')) {
  850.             cout << "Vi vveli text  ne tuda"; return 0;
  851.         }
  852.         else if ((c <= 'Я') && (c >= 'А')) {
  853.             cout << "Vi vveli text  ne tuda"; return 0;
  854.         }
  855.         else if ((c <= 'я') && (c >= 'а')) {
  856.             cout << "Vi vveli text  ne tuda"; return 0;
  857.         }
  858.     }
  859.     return 1;
  860. }
  861. ////////////////
  862. void List::WriteFromProgToTxt(string path = "write.txt")
  863. {
  864.     //string path = "write.txt";
  865.     ofstream fout;
  866.     fout.open(path, ofstream::app);
  867.     if (!fout.is_open()) {
  868.         cout << "Ошибка открытия фаила" << endl;
  869.         Sleep(5000);
  870.     }
  871.     else {
  872.         if (isEmpty()) { cout << "Список пуст" << endl; return; }
  873.         Node* p = head;
  874.         do {
  875.             fout << getValue1(p)
  876.                 << " " << getValue2(p)
  877.                 << " " << getValue3(p)
  878.                 << " " << getValue4(p)
  879.                 << " " << getValue5(p)
  880.                 << " " << getValue6(p)
  881.                 << "\n";
  882.             p = Next(p);
  883.         } while (p != NULL);
  884.     }
  885.     fout.close();
  886. }
  887. ///////////////////
  888. ////////////////
  889. void List::ReedOfTxtToProg(string nameFile = "write.txt")
  890. {
  891.     ifstream inf(nameFile);
  892.     // Если мы не можем открыть файл для чтения его содержимого,
  893.     if (!inf)
  894.     {
  895.         // то выводим следующее сообщение об ошибке и выполняем функцию exit()
  896.         cerr << "SetText.txt could not be opened for reading!" << endl;
  897.         cerr << "Perezagruzi programmu" << endl;
  898.         Sleep(5000);
  899.         exit(1);
  900.     }
  901.  
  902.     string z1, z2, z3, z4, z5, z6;
  903.     // Пока есть, что читать,
  904.     while (inf)
  905.     {
  906.  
  907.         // то перемещаем то, что можем прочитать, в строку, а затем выводим эту строку на экран
  908.         string strInput;
  909.         getline(inf, strInput);
  910.  
  911.         int ci = 0;
  912.         string word = "";
  913.         int probels = 0;
  914.  
  915.         while ((strInput[ci] != NULL)) {
  916.             strInput[ci];
  917.             if (strInput[ci] != ' ') { word += strInput[ci]; }
  918.             if ((strInput[ci] == ' ') || (strInput[ci + 1] == NULL)) {
  919.                 probels++;
  920.                 switch (probels) {
  921.                 case 1:  z1 = word;
  922.                 case 2:  z2 = word;
  923.                 case 3:  z3 = word;
  924.                 case 4:  z4 = word;
  925.                 case 5:  z5 = word;
  926.                 case 6:  z6 = word;
  927.                 default: word = "";
  928.                 }
  929.             }
  930.             ci++;
  931.         }
  932.         Node* s = getLast();
  933.         if (strInput != "\0") { s = Add(z1, z2, z3, z4, z5, z6, s); }
  934.     }
  935.     Sleep(500);
  936.     //cout << nameFile << " - zagruzhen\nSoderzhanie: " << '"';
  937.     //std::system("pause");
  938.     //return strInput2;
  939. }
  940.  
  941. ///////////////////
  942. ////////////////
  943. string List::reedOfFile(string nameFile)
  944. {
  945.     ifstream inf(nameFile);
  946.     // Если мы не можем открыть файл для чтения его содержимого,
  947.     if (!inf)
  948.     {
  949.         // то выводим следующее сообщение об ошибке и выполняем функцию exit()
  950.         cerr << "SetText.txt could not be opened for reading!" << endl;
  951.         cerr << "Perezagruzi programmu" << endl;
  952.         Sleep(5000);
  953.         exit(1);
  954.     }
  955.     string strInput2;
  956.     // Пока есть, что читать,
  957.     while (inf)
  958.     {
  959.         // то перемещаем то, что можем прочитать, в строку, а затем выводим эту строку на экран
  960.         string strInput;
  961.         getline(inf, strInput);
  962.         strInput2 = strInput2 + strInput;
  963.     }
  964.     Sleep(500);
  965.     cout << nameFile << " - zagruzhen\nSoderzhanie: " << '"';
  966.     //std::system("pause");
  967.     cout << strInput2;
  968.     cout << '"' << endl;
  969.     return strInput2;
  970.  
  971. }
  972. ///////////////////
  973. void List::sort() {
  974.  
  975.     Node* ptr = NULL;
  976.     Node* headCop = head;
  977.     int p = 0;
  978.     if (headCop == NULL) {  } // В списке нет узлов
  979.     while (headCop != NULL) {
  980.         //cout << "-------------" << headCop->N_student << typeid(number).name()<< '\n';
  981.         if (chekMaxID(headCop, headCop->ptr)) {
  982.             Swap(headCop, headCop->ptr);
  983.             p++;
  984.         }
  985.         headCop = headCop->ptr;
  986.     }
  987.     if (p != 0) {
  988.         sort();
  989.     }
  990.    
  991. }
  992.  
  993. int List::chekMaxID(Node* head, Node* iPtr) {
  994.  
  995.     if (iPtr == NULL) return 0;
  996.     int number1 = std::stoi(head->N_student);
  997.     int number2 = std::stoi(iPtr->N_student);
  998.     //if (head == iPtr) return 1;
  999.     if (number1 > number2) {
  1000.         //cout << "|||||||||||||||||||||||||||||||||||||||||||";
  1001.         return 1;
  1002.     }
  1003.     else {return 0;}
  1004. }
  1005. void List::Swap(Node* ptr1, Node* ptr2)
  1006. {
  1007.     if (ptr1 == NULL || ptr2 == NULL) return;
  1008.     if (ptr1 == ptr2) return;
  1009.  
  1010.     if (ptr2->ptr == ptr1)
  1011.     {
  1012.         Node* p = ptr1;
  1013.         ptr1 = ptr2;
  1014.         ptr2 = p;
  1015.     }
  1016.    
  1017.     Node* prev1 = Prev(ptr1);
  1018.     Node* prev2 = Prev(ptr2);
  1019.     Node* next1 = Next(ptr1);
  1020.     Node* next2 = Next(ptr2);
  1021.     if (next1 == ptr2)
  1022.     {
  1023.         if (prev1 != NULL)
  1024.             prev1->ptr = ptr2;
  1025.         else
  1026.             head = ptr2;
  1027.         ptr2->ptr = ptr1;
  1028.         ptr1->ptr = next2;
  1029.         return;
  1030.     }
  1031.     if (prev1 != NULL)
  1032.         prev1->ptr = ptr2;
  1033.     else
  1034.         head = ptr2;
  1035.     if (prev2 != NULL)
  1036.         prev2->ptr = ptr1;
  1037.     else
  1038.         head = ptr1;
  1039.     ptr2->ptr = next1;
  1040.     ptr1->ptr = next2;
  1041.  
  1042. }
  1043.  
  1044. void List::Swap2(Node* node1, Node* Otsenki)
  1045. {
  1046.     if (node1 == NULL || Otsenki == NULL) return;
  1047.     if (node1 == Otsenki) return;
  1048.     if (Otsenki->ptr == node1)
  1049.     {
  1050.         Node* p = node1;
  1051.         node1 = Otsenki;
  1052.         Otsenki = p;
  1053.     }
  1054.     Node* prev1 = Prev(node1);
  1055.     Node* prev2 = Prev(Otsenki);
  1056.     Node* next1 = Next(node1);
  1057.     Node* next2 = Next(Otsenki);
  1058.     if (next1 == Otsenki)
  1059.     {
  1060.         if (prev1 != NULL)
  1061.             prev1->ptr = Otsenki;
  1062.         else
  1063.             head = Otsenki;
  1064.         Otsenki->ptr = node1;
  1065.         node1->ptr = next2;
  1066.         return;
  1067.     }
  1068.     if (prev1 != NULL)
  1069.         prev1->ptr = Otsenki;
  1070.     else
  1071.         head = Otsenki;
  1072.     if (prev2 != NULL)
  1073.         prev2->ptr = node1;
  1074.     else
  1075.         head = node1;
  1076.     Otsenki->ptr = next1;
  1077.     node1->ptr = next2;
  1078.  
  1079. }
  1080.  
  1081.  
  1082.  
  1083. int main()
  1084. {   //setlocate(LC_ALL, "Russian");
  1085.     using std::string;
  1086.     using std::cin;
  1087.     using std::cout;
  1088.     using std::getline;
  1089.     SetConsoleOutputCP(1251);
  1090.     SetConsoleCP(1251);
  1091.     system("chcp 1251");
  1092.     system("cls");
  1093.  
  1094.     List list;
  1095.     Otsenki Otsenki;
  1096.  
  1097.     list.Print();
  1098.     Node* s = list.getLast();
  1099.     for (int i = 0; i < 0; i++) {
  1100.         string z1;
  1101.         string z2;
  1102.         string z3;
  1103.         string z4;
  1104.         string z5;
  1105.         string z6;
  1106.         cout << ">> N_student  ";
  1107.         cin >> z1;
  1108.         cout << ">> FirstName  ";
  1109.         cin >> z2;
  1110.         cout << ">> LastName  ";
  1111.         cin >> z3;
  1112.  
  1113.         cout << ">> fizika  ";
  1114.         cin >> z4;
  1115.         cout << ">> istoriya  ";
  1116.         cin >> z5;
  1117.         cout << ">> informatika  ";
  1118.         cin >> z6;
  1119.         s = list.Add(z1, z2, z3, z4, z5, z6, s);
  1120.     }
  1121.  
  1122.  
  1123.                                     list.StekOperation();
  1124.  
  1125.  
  1126.  
  1127.  
  1128.     return 0;
  1129.  
  1130. }
  1131.  
  1132.  
  1133.  
Add Comment
Please, Sign In to add comment