Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 21.81 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <string>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <cstdlib>
  6.  
  7. using namespace std;
  8. //Catalog_element *mainhead;
  9.  
  10. class CatFile//элемент побочного списка
  11. {
  12. public:
  13.     int size;
  14.     string name;
  15.     CatFile *prev;
  16.     CatFile *next;
  17. public:
  18.     CatFile(string file_name, int file_num)
  19.     {
  20.         size = file_num;
  21.         name = file_name;
  22.     }
  23.     CatFile()
  24.     {
  25.         size = NULL;
  26.         name = "";
  27.     }
  28.     void set_size(int file_size)
  29.     {
  30.         size = file_size;
  31.     }
  32.     int get_size()
  33.     {
  34.         return size;
  35.     }
  36.  
  37.     void set_name(string file_name)
  38.     {
  39.         name = file_name;
  40.     }
  41.     string get_name()
  42.     {
  43.         return name;
  44.     }
  45.     void set_prev(CatFile *file_prev)
  46.     {
  47.         prev = file_prev;
  48.     }
  49.     CatFile* get_prev()
  50.     {
  51.         return prev;
  52.     }
  53.     void set_next(CatFile *file_next)
  54.     {
  55.         next = file_next;
  56.     }
  57.     CatFile* get_next()
  58.     {
  59.         return next;
  60.     }
  61.     ~CatFile()
  62.     {
  63.         size = NULL;
  64.         name = "";
  65.         next = nullptr;
  66.         prev = nullptr;
  67.     }
  68. };
  69.  
  70. class Catalog//побочный список
  71. {
  72. private:
  73.     int info;
  74.     CatFile *tempsub;//список указывает на первый элемент
  75.     CatFile *prev;
  76.     CatFile *next;
  77.     //CatFile *first;
  78.  
  79. public:
  80.     Catalog()
  81.     {
  82.         tempsub = new CatFile;
  83.         tempsub->set_name("");
  84.         tempsub->set_size(NULL);
  85.         tempsub->set_next(tempsub);
  86.         tempsub->set_prev(tempsub);
  87.     }
  88.     void InitialSub()
  89.     {
  90.         tempsub = new CatFile;
  91.         tempsub->set_name("");
  92.         tempsub->set_size(NULL);
  93.         tempsub->set_next(tempsub);
  94.         tempsub->set_prev(tempsub);
  95.         //return tempsub;
  96.     }
  97.     void set_next(CatFile *nextt)
  98.     {
  99.         *next = *nextt;
  100.     }
  101.     CatFile get_next()
  102.     {
  103.         return *next;
  104.     }
  105.     void set_prev(CatFile *prevv)
  106.     {
  107.         *prev = *prevv;
  108.     }
  109.     CatFile get_prev()
  110.     {
  111.         return *prev;
  112.     }
  113.     void set_info(int infoo)
  114.     {
  115.         info = infoo;
  116.     }
  117.     int get_info()
  118.     {
  119.         return info;
  120.     }
  121.  
  122.     void traverse_head()
  123.     {
  124.         CatFile *t = tempsub;
  125.         t = t->get_next();
  126.         int c = 0;
  127.         while (t != tempsub)
  128.         {
  129.             cout << t->get_name() << "\t";
  130.             cout << t->get_size() << "\n";
  131.             t = t->get_next();
  132.         }
  133.         cout << endl;
  134.     }
  135.      
  136.     void traverse_tail()
  137.     {
  138.         CatFile *t = tempsub;
  139.         t = t->get_prev();
  140.         int c = 0;
  141.         while (t != tempsub)
  142.         {
  143.             cout << t->get_name() << "\t";
  144.             cout << t->get_size() << "\n";
  145.             t = t->get_prev();
  146.         }
  147.         cout << endl;
  148.     }
  149.  
  150.     int SearchFile(string sname)
  151.     {
  152.         CatFile *t = tempsub;
  153.         t = t->get_next();
  154.         while (t != tempsub)
  155.         {
  156.             if (t->get_name() == sname)
  157.             {
  158.                 return 1;
  159.             }
  160.             else
  161.             {
  162.                 t = t->get_next();
  163.                 continue;
  164.             }
  165.         }
  166.         return 0;
  167.     }
  168.  
  169.     int SearchFileReverse(string sname)
  170.     {
  171.         CatFile *t = tempsub;
  172.         t = t->get_prev();
  173.         while (t != tempsub)
  174.         {
  175.             if (t->get_name() == sname)
  176.             {
  177.                 return 1;
  178.             }
  179.             else
  180.             {
  181.                 t = t->get_prev();
  182.                 continue;
  183.             }
  184.         }
  185.         return 0;
  186.     }
  187.  
  188.     CatFile *SearchFileToDelete(string sname)
  189.     {
  190.         CatFile *t = tempsub;
  191.         t = t->get_next();
  192.         while (t != tempsub)
  193.         {
  194.             if (t->get_name() == sname)
  195.             {
  196.  
  197.                 return t;
  198.                  
  199.             }
  200.             else
  201.             {
  202.                 t = t->get_next();
  203.                 continue;
  204.             }
  205.         }
  206.     }
  207.  
  208.     void AddCatFile(string name, int size)//готово
  209.     {
  210.         if (tempsub->get_next() == tempsub)//список пуст
  211.         {
  212.             CatFile *temp = new CatFile(name, size);
  213.             tempsub->set_next(temp);
  214.             tempsub->set_prev(temp);
  215.             temp->set_next(tempsub);
  216.             temp->set_prev(tempsub);
  217.         }
  218.         else
  219.         {
  220.             //список не пустой-> ищем место куда добавить
  221.             CatFile *temp = tempsub->get_next();
  222.             if ( (name) <  (tempsub->get_next()->get_name()))//отдельный случай для добавления первого
  223.             {
  224.                 CatFile *newtemp = new CatFile(name, size);
  225.                 tempsub->get_next()->set_prev(newtemp);
  226.                 newtemp->set_next(tempsub->get_next());
  227.                 tempsub->set_next(newtemp);
  228.                 newtemp->set_prev(tempsub);
  229.             }
  230.             else
  231.             {
  232.                 if ( (name) >  (tempsub->get_prev()->get_name()))
  233.                 {
  234.                     CatFile *newtemp = new CatFile(name, size);
  235.                     tempsub->get_prev()->set_next(newtemp);
  236.                     newtemp->set_next(tempsub);
  237.                     newtemp->set_prev(tempsub->get_prev());
  238.                     tempsub->set_prev(newtemp);
  239.                 }
  240.                 else
  241.                 {
  242.  
  243.                     CatFile *newtemp = new CatFile(name, size);
  244.                     CatFile *temp = tempsub->get_next();
  245.                     //отдельно для добавления последнего
  246.                     while (temp != tempsub)//между
  247.                     {
  248.                         if ( (name) <  (temp->get_name()))//новый меньше , то вставляем перед
  249.                         {
  250.                             newtemp->set_prev(temp->get_prev()->get_next());
  251.                             temp->get_prev()->set_next(newtemp);
  252.                             temp->set_prev(newtemp);
  253.                             newtemp->set_next(temp);
  254.                             break;
  255.                         }
  256.                         temp = temp->get_next();
  257.                     }
  258.                 }
  259.             }
  260.         }
  261.     }
  262.     void traverse_head_file()
  263.     {
  264.         ofstream file;
  265.         file.open("myfile.txt", ofstream::app);
  266.         if (!file)
  267.         {
  268.             cout << "couldn't open file." << endl;
  269.         }
  270.  
  271.         else {
  272.             //file.seekp(0, file.end);
  273.             file << "  ";//какого-то фига первые 2 символа иначе сотрет
  274.             CatFile *t = tempsub;
  275.             t = t->get_next();
  276.             int c = 0;
  277.             while (t != tempsub)
  278.             {
  279.                 file << t->get_name();
  280.                 file << "(";
  281.                 file << t->get_size();
  282.                 file << ")";
  283.                 if (t->get_next() == tempsub)
  284.                 {
  285.                     file << "." << endl;
  286.                     //file.close();
  287.                 }
  288.                 else {
  289.                     file << ",";
  290.                 }
  291.                 t = t->get_next();
  292.             }
  293.              
  294. /*
  295. e.
  296. 2-f(1).
  297. 6-z(4).
  298. */
  299.         }
  300.        
  301.     }
  302.     void RemoveCatFile(string sname)
  303.     {
  304.         {
  305.             //список не пустой-> ищем место откуда удалить
  306.             CatFile *todel = SearchFileToDelete(sname);
  307.             if (todel != NULL)
  308.             {
  309.                 todel->get_prev()->set_next(todel->get_next());
  310.                 todel->get_next()->set_prev(todel->get_prev());
  311.                 delete todel;
  312.  
  313.             }
  314.             else
  315.             {
  316.                 cout << "not found" << endl;
  317.  
  318.             }
  319.             /*if ((todel->get_name()) < (tempsub->get_next()->get_name()))//отдельный случай для удаления первого
  320.             {
  321.                 tempsub->set_next(todel->get_next());
  322.                 todel->get_next()->set_prev(tempsub);
  323.                 //free(todel);
  324.                 return;
  325.             }*/
  326.         }
  327.     }
  328.  
  329.     ~Catalog()
  330.     {
  331.         CatFile *my = tempsub;
  332.         CatFile *catfile = my;//голова
  333.         while (my != nullptr)
  334.         {
  335.             tempsub = my->get_next();
  336.             my->~CatFile();
  337.             my = catfile;
  338.         }
  339.         info = 0;
  340.     }
  341. };
  342.  
  343. class Catalog_element//элемент главного стека
  344. {
  345. private:
  346.     string Catalog_name;
  347.     Catalog *HeadSub;
  348. public:
  349.     Catalog_element(string Catalog_name)
  350.     {
  351.         Catalog_name = Catalog_name;
  352.         HeadSub = NULL;
  353.     }
  354.     Catalog_element()
  355.     {
  356.         Catalog_name = "";
  357.         HeadSub = NULL;//NULL
  358.     }
  359.     void set_name(string Catalog_nam)
  360.     {
  361.         Catalog_name = Catalog_nam;
  362.     }
  363.     string get_name()
  364.     {
  365.         return Catalog_name;
  366.     }
  367.     void set_list(Catalog *list)
  368.     {
  369.         HeadSub = list;
  370.     }
  371.     Catalog* get_list(int num)
  372.     {
  373.         return HeadSub;
  374.     }
  375.     ~Catalog_element()
  376.     {
  377.         Catalog_name = ("");
  378.         if (HeadSub != nullptr)
  379.         {
  380.             HeadSub->~Catalog();
  381.         }
  382.     }
  383.  
  384. };
  385. class Device//готово
  386. {
  387. private:
  388.     string deviceName;
  389.     Catalog_element *substack;
  390.     int top;
  391. public:
  392.     Device(string devName)
  393.     {
  394.         deviceName = devName;
  395.         substack = new Catalog_element[5];
  396.         top = -1;
  397.     }
  398.     void set_deviceName(string deviceNamee)
  399.     {
  400.         deviceName = deviceNamee;
  401.     }
  402.     string get_name()
  403.     {
  404.         return deviceName;
  405.     }
  406.     int get_top()
  407.     {
  408.         return top;
  409.     }
  410.     Catalog_element* get_substack(int num)
  411.     {
  412.         return &substack[num];
  413.     }
  414.     void set_top(int topp)
  415.     {
  416.         top = topp;
  417.     }
  418.     int StackIsEmpty()
  419.     {
  420.         if (top == -1)
  421.             return 1;
  422.         else
  423.         return 0;
  424.     }
  425.  
  426.     int StackIsFull()
  427.     {
  428.         if (top == 4)
  429.             return 1;
  430.         else
  431.             return 0;
  432.     }
  433.  
  434.     int Search(string name)
  435.     {
  436.         int i;
  437.         int flag = 0;
  438.         for (i = 0; i <= top;)
  439.         {
  440.             if (name == substack[i].get_name())
  441.             {
  442.                 cout << "catalog was found, its' index: " << i << endl;
  443.                 flag = 1;
  444.                 break;
  445.             }
  446.             else
  447.             {
  448.                 i++;
  449.             }
  450.         }
  451.         if (flag == 0)
  452.         {
  453.             cout << "catalog wasn't found" << endl;
  454.             return 6;
  455.         }
  456.         return i;
  457.     }
  458.  
  459.     int SearchSub(string sname)
  460.     {
  461.         if (StackIsEmpty() != 1)
  462.         {
  463.             int i;
  464.             for (i = top; i >= 0; i--)
  465.             {
  466.                 if (substack[i].get_list(i) != NULL)
  467.                 {
  468.                     if (substack[i].get_list(i)->SearchFile(sname) == 1&& substack[i].get_list(i)->SearchFileReverse(sname) == 1)
  469.                     {
  470.                         return 1;
  471.                     }
  472.                 }
  473.             }
  474.         }
  475.         else
  476.         {
  477.             cout << "empty" << endl;
  478.         }
  479.     }
  480.  
  481.     int AddToSub(string main, int snum, string sname)//добавление в подсписок
  482.     {
  483.  
  484.         int i = Search(main);
  485.         Catalog *tempcatalog = new Catalog;
  486.         if (substack[i].get_list(i) != nullptr)
  487.         {
  488.             tempcatalog = substack[i].get_list(i);
  489.         }
  490.         tempcatalog->AddCatFile(sname, snum);
  491.         substack[i].set_list(tempcatalog);
  492.         return 1;
  493.     }
  494.  
  495.     int RemoveFromSub(string main, int snum, string sname)//добавление в подсписок
  496.     {
  497.  
  498.         int i = Search(main);
  499.         Catalog *tempcatalog = new Catalog;
  500.         if (substack[i].get_list(i) != nullptr)
  501.         {
  502.             tempcatalog = substack[i].get_list(i);
  503.         }
  504.         tempcatalog->RemoveCatFile(sname);
  505.         substack[i].set_list(tempcatalog);
  506.         return 1;
  507.     }
  508.  
  509.     void AddCatalog(string Catalog_name)//добавление в главный стек
  510.     {
  511.         int temp = 0;
  512.  
  513.         int i = 0;
  514.         if(get_top() == 4)
  515.         {
  516.             cout << "stack overflow" << endl;
  517.         }
  518.         else if (get_top() < 4)
  519.         {
  520.             Catalog_element *temp = new Catalog_element(Catalog_name);
  521.             temp->set_name(Catalog_name);
  522.             substack[top + 1].set_name(temp->get_name());
  523.             top++;
  524.             cout << "catalog #" << substack[top].get_name() << " was added " << endl;
  525.         }
  526.     }
  527.  
  528.     void DeleteCatalog()
  529.     {
  530.         if (top == -1) {
  531.             cout << "error" << endl;
  532.             return;
  533.         }
  534.         else
  535.         {
  536.             if (substack[top].get_list(top) != nullptr)
  537.             {
  538.                 while (substack[top].get_list(top)->get_info()!=NULL)
  539.                 {
  540.                     substack[top].get_list(top)->RemoveCatFile("");
  541.                 }
  542.                 substack[top].set_name("");
  543.                 substack[top].set_list(nullptr);
  544.             }
  545.         }
  546.         top--;
  547.     }
  548.  
  549.     void PrintCatalog() {
  550.         int i;
  551.         string name = get_name();
  552.         cout << "device's name: " << name << endl;
  553.         for (i = top; i >= 0; i--)
  554.         {
  555.             cout << "catalog #" << substack[i].get_name() << endl;
  556.             //проверка на пустоту списка
  557.             if (substack[i].get_list(i) != NULL)
  558.             {
  559.                 substack[i].get_list(i)->traverse_head();
  560.             }
  561.             else
  562.                 cout << "no files." << endl;
  563.         }
  564.     }
  565.  
  566.     void PrintCatalogReverse() {
  567.         int i;
  568.         string name = get_name();
  569.         cout <<"device's name:"<< name << endl;
  570.         for (i = top; i >= 0; i--)
  571.         {
  572.             cout << "catalog #" << substack[i].get_name() << endl;
  573.             //проверка на пустоту списка
  574.             if (substack[i].get_list(i) != NULL)
  575.             {
  576.                 substack[i].get_list(i)->traverse_tail();
  577.             }
  578.             else
  579.                 cout << "no files." << endl;
  580.         }
  581.     }
  582.  
  583.    
  584.     void SaveToFile()
  585.     {
  586.         int i;
  587.         ofstream file;
  588.         file.open("myfile.txt", ofstream::out);
  589.         if (!file)
  590.         {
  591.             cout << "couldn't open file." << endl;
  592.         }
  593.         else
  594.         {
  595.             file.clear();
  596.             if (!StackIsEmpty())
  597.             {
  598.                 string name = get_name();
  599.                 file << name << "." << endl;
  600.                 for (i = top; i >= 0;i--)
  601.                 {
  602.                     file << substack[i].get_name() << "-";
  603.                     if (substack[i].get_list(i) != NULL)
  604.                     {
  605.                         //file << "flag" << endl; //видит элементы со списками - нормально
  606.                         //вывести список как q(1),w(2).
  607.                         substack[i].get_list(i)->traverse_head_file();//только один раз?
  608.                        
  609.                     }
  610.                     else
  611.                     {
  612.                         file << "." << endl;
  613.                     }
  614.                    
  615.                 }
  616.  
  617.  
  618.             }
  619.             else
  620.             {
  621.                 cout << "empty." << endl;
  622.             }
  623.             file.close();
  624.             cout << "success." << endl;
  625.         }
  626.  
  627.     }
  628.  
  629.     bool is_empty(std::ifstream&file)
  630.     {
  631.         return file.peek() == std::ifstream::traits_type::eof();
  632.     }
  633.  
  634.     bool CheckString(string tmp, int type)
  635.     {
  636.         int i = 1, r = 0, l = 0, z = 0, zplace = 0, lin = 0;
  637.         string number;
  638.         bool find = false, line = false, bracket = false, onlynum = false;
  639.         if (type != NULL)
  640.         {
  641.             if (tmp[int(tmp.length()) - 1] == '.')
  642.             {
  643.                 find = true;
  644.             }
  645.             else
  646.             {
  647.                 find = false;
  648.             }
  649.         }
  650.         else
  651.         {
  652.             if (tmp[int(tmp.length() - 1)] == '.'&& tmp[int(tmp.length()) - 2] == '-')
  653.             {
  654.                 lin = int(tmp.length()) - 2;
  655.                 find = true;
  656.                 onlynum = true;
  657.             }
  658.             if (tmp[int(tmp.length()) - 1] == '.'&& tmp[int(tmp.length()) - 2] == ')')
  659.             {
  660.                 find = true;
  661.             }
  662.             else
  663.             {
  664.                 if (onlynum == false)
  665.                 {
  666.                     find = false;
  667.                 }
  668.             }
  669.             if (find == true && onlynum == false)
  670.             {
  671.                 find = false;
  672.                 while (i < int(tmp.length() - 1))
  673.                 {       //наличие -
  674.                     if (tmp[i] == '-' && tmp[i - 1] != ' ' && tmp[i + 1] != ' ')
  675.                     {
  676.                         lin = i;
  677.                         line = true;
  678.                     }
  679.                     //чекнуть скобки и ,
  680.                     if (tmp[i] == '(' && tmp[i + 1] != ')' && tmp[i + 1] != '('  && tmp[i + 1] != ' '  && tmp[i - 1] != ' ')//(
  681.                     {
  682.                         l++;
  683.                     }
  684.                     else
  685.                     {
  686.                         if (tmp[i] == ')'&& tmp[i + 1] != ' '  && tmp[i - 1] != ' ')//)
  687.                         {
  688.                             r++;
  689.                             if (tmp[i + 1] == ',' && tmp[i + 2] != ' ')
  690.                             {
  691.                                 zplace++;
  692.                             }
  693.                         }
  694.                     }
  695.                     i++;
  696.                 }
  697.                 if (r = l == zplace + 1)
  698.                 {
  699.                     bracket = true;
  700.                 }
  701.                 if (bracket == true && line == true)
  702.                 {
  703.                     find = true;
  704.                 }
  705.                 else
  706.                 {
  707.                     if (onlynum == false)
  708.                     {
  709.                         find = false;
  710.                     }
  711.                 }
  712.             }
  713.         }
  714.         i = 0;
  715.         if (find == true && type == NULL)
  716.         {
  717.             number = "";
  718.             while (i < lin)
  719.             {
  720.                 number += tmp[i];
  721.                 i++;
  722.             }
  723.             if (number != "")
  724.             {
  725.                 try
  726.                 {
  727.                     stoi(number);
  728.                 }
  729.                 catch (const std::exception&)
  730.                 {
  731.                     find = true;
  732.                 }
  733.             }
  734.             else
  735.             {
  736.                 find = false;
  737.             }
  738.             if (onlynum == false && find == true)
  739.             {
  740.                 while (tmp[i] != '.' && find != false)
  741.                 {
  742.                     number = "";
  743.                     if (tmp[i] == '(')//просто отрежем букву, если попадется в номере
  744.                     {
  745.                         i++;
  746.                         while (tmp[i] != ')')
  747.                         {
  748.                             number += tmp[i];
  749.                             i++;
  750.                         }
  751.                         if (number != "")
  752.                         {
  753.                             try
  754.                             {
  755.                                 stoi(number);
  756.                             }
  757.                             catch (const std::exception&)
  758.                             {
  759.                                 find = false;
  760.                             }
  761.                         }
  762.                         else
  763.                         {
  764.                             find = false;
  765.                         }
  766.                     }
  767.                     i++;
  768.                 }
  769.             }
  770.         }
  771.         return(find);
  772.     }
  773.  
  774.    
  775.     void File(Device *dev)
  776.     {
  777.          
  778.         int num = 0;
  779.         ifstream file("myfile.txt");
  780.         if (!file.is_open())
  781.         {
  782.             cout << "couldn't open file." << endl;
  783.         }
  784.         else if (dev->is_empty(file))
  785.         {
  786.             cout << "file is empty. switching to console." << endl;
  787.         }
  788.         else
  789.         {
  790.             string tmp, tmp2, name;
  791.             string name2, tm;
  792.             int i = 0;
  793.             //char p = ' ';
  794.             getline(file, tmp);
  795.             bool point, stop = false;
  796.             point = CheckString(tmp, 1);//проверка формы ввода
  797.             if (point != true)
  798.             {
  799.                 cout << "Name was corrupted, changing to some_name" << endl;
  800.                 dev->set_deviceName("some_name");
  801.             }
  802.             else
  803.             {
  804.                 while (tmp[i] != '.')
  805.                 {
  806.                     tmp2 += tmp[i];
  807.                     i++;
  808.                 }
  809.                 dev->set_deviceName(tmp2);
  810.             }
  811.             i = 0;
  812.             while (!file.eof() && !dev->StackIsFull())
  813.             {
  814.                 point = false;
  815.                 i = 0;
  816.                 getline(file, name);
  817.                 if (name != "")
  818.                 {
  819.                     cout << name << endl;
  820.                     system("pause");
  821.                     point = CheckString(name, NULL);
  822.                     if (point == true)
  823.                     {
  824.                         name2 = "";
  825.                         while (name[i] != '-')
  826.                         {
  827.                             name2 += name[i];
  828.                             i++;
  829.                         }
  830.                         if (!dev->StackIsEmpty())
  831.                         {
  832.                             num = dev->Search((name2));
  833.                         }
  834.                         {
  835.                             dev->AddCatalog((name2));//стек
  836.                             if (name[int(name.length() - 1)] == '.'&& name[int(name.length()) - 2] == '-')
  837.                             {
  838.                                 cout << "In string " << name << " there's no list's elements." << endl;
  839.                             }
  840.                             else //списки
  841.                             {
  842.                                 tmp2 = name2;
  843.                                 while (name[i] != '.')
  844.                                 {
  845.                                     i++;
  846.                                     name2 = "";
  847.                                     while (name[i] != '(')
  848.                                     {
  849.                                         name2 += name[i];
  850.                                         i++;
  851.                                     }
  852.                                     i++;
  853.                                     tm = name2;
  854.                                     name2 = "";
  855.                                     while (name[i] != ')')
  856.                                     {
  857.                                         name2 += name[i];
  858.                                         i++;
  859.                                     }
  860.                                     i++;
  861.                                      
  862.                                     num = dev->Search((tmp2));//stoi(name) номер, tm - название - нормально находит
  863.                                     //cout << tmp2 << endl;//каталог, куда добавлять
  864.                                     //cout << num << endl;
  865.                                     //cout << stoi(name2) << endl;//2 - номер
  866.                                     //cout << tm << endl;//w - название
  867.                                     dev->AddToSub(tmp2, stoi(name2), tm);
  868.  
  869.                                 }
  870.                             }
  871.                         }
  872.                        
  873.                     }
  874.                     else
  875.                     {
  876.                         cout << "string ( " << name << " ) was corrupted." << endl;
  877.                     }
  878.                 }
  879.             }
  880.             cout << "success." << endl;
  881.             file.close();
  882.         }
  883.     }
  884.  
  885.     ~Device()
  886.     {
  887.         deviceName = "";
  888.         top = -1;
  889.         while (top < 5)
  890.         {
  891.             Catalog_element *el = &substack[top];
  892.             el->~Catalog_element();
  893.             top++;
  894.         }
  895.         top = 0;
  896.     }
  897. };
  898.  
  899.  
  900. int main()
  901. {
  902.     setlocale(LC_ALL, "Russian");
  903.     string name;
  904.     cout << "enter the device's name: ";
  905.     cin >> name;
  906.     Device *dev = new Device(name);
  907.     int menu = 99;
  908.     int menu2 = 0;
  909.     while (menu2 != 1 && menu2 != 2)
  910.     {
  911.         cout << "1 - use console" << endl;
  912.         cout << "2 - use file" << endl;
  913.         cin >> menu2;
  914.         while (cin.fail())
  915.         {
  916.             cin.clear();
  917.             cin.ignore(INT_MAX, '\n');
  918.             cout << "enter only numbers" << endl << "try again" << endl;
  919.             cin >> menu2;
  920.         }
  921.         switch (menu2)
  922.         {
  923.         case(2):
  924.         {
  925.             dev->File(dev);
  926.             break;
  927.         }
  928.         case(1):
  929.         {
  930.             break;
  931.         }
  932.         default:
  933.             break;
  934.         }
  935.     }
  936.     while (menu != 0)
  937.     {
  938.         cout << "------------------------------------------------------------------------------" << endl;
  939.         cout << "main stack:" << endl;
  940.         cout << "1 - add catalog" << endl;
  941.         cout << "2 - delete catalog" << endl;
  942.         cout << "3 - search catalog" << endl;
  943.         cout << "4 - print catalogs" << endl;
  944.         cout << "------------------------------------------------------------------------------" << endl;
  945.         cout << "sublists:" << endl;
  946.         cout << "5 - add file" << endl;
  947.         cout << "6 - delete file" << endl;
  948.         cout << "7 - search file" << endl;
  949.         cout << "8 - print catalogs with reversed lists" << endl;
  950.         cout << "------------------------------------------------------------------------------" << endl;
  951.         cout << "9 - save to file" << endl;
  952.         cout << "10 - exit" << endl;
  953.         cout << "------------------------------------------------------------------------------" << endl;
  954.         cout << "11 - change device's name" << endl;
  955.         cout << "------------------------------------------------------------------------------" << endl;
  956.         cout << "enter your choice:" << endl;
  957.         cout << "------------------------------------------------------------------------------" << endl;
  958.         cin >> menu;
  959.         while (cin.fail())
  960.         {
  961.             cin.clear();
  962.             cin.ignore(INT_MAX, '\n');
  963.             cout << "enter only numbers" << endl << "try again" << endl;
  964.             cin>>menu;
  965.         }
  966.         switch (menu)
  967.         {
  968.  
  969.         case (1):
  970.         {
  971.             if (dev->StackIsFull() != 1) {
  972.                 dev->get_top();
  973.                 string catnum;
  974.                 cout << "enter the element: ";
  975.                 cin >> catnum;
  976.                 dev->AddCatalog(catnum);
  977.             }
  978.             else
  979.             {
  980.                 cout << "stack overflow" << endl;
  981.             }
  982.             break;
  983.         }
  984.         case (2):
  985.         {
  986.  
  987.             if (dev->StackIsEmpty())
  988.             {
  989.                 cout << "empty." << endl;
  990.             }
  991.             else
  992.             {
  993.                 dev->DeleteCatalog();
  994.             }
  995.             break;
  996.         }
  997.         case (3):
  998.         {
  999.             if (dev->StackIsEmpty())
  1000.             {
  1001.                 cout << "empty." << endl;
  1002.                 break;
  1003.             }
  1004.             else
  1005.             {
  1006.                 string name;
  1007.                 cout << "enter catalog's name" << endl;
  1008.                 cin >> name;
  1009.                 dev->Search(name);
  1010.                 break;
  1011.             }
  1012.             break;
  1013.         }
  1014.         case (4):
  1015.         {
  1016.             if (dev->StackIsEmpty())
  1017.             {
  1018.                 cout << "device is empty." << endl;
  1019.             }
  1020.             else
  1021.             {
  1022.                 dev->PrintCatalog();
  1023.             }
  1024.             break;
  1025.         }
  1026.         case (5):
  1027.         {
  1028.             if (dev->StackIsEmpty())
  1029.             {
  1030.             cout << "empty - nowhere to add." << endl;
  1031.             break;
  1032.             }
  1033.             else
  1034.             {
  1035.                 string mainelement;
  1036.                 string sname;
  1037.                 int size = 0;
  1038.                 cout << "to which catalog should we add?" << endl;
  1039.                 cin >> mainelement;
  1040.                 if ((dev->Search(mainelement)) != 6) {
  1041.                     cout << "enter file's size" << endl;
  1042.                     cin >> size;
  1043.                     while (cin.fail())
  1044.                     {
  1045.                         cin.clear();
  1046.                         cin.ignore(INT_MAX, '\n');
  1047.                         cout << "enter only numbers" << endl << "try again" << endl;
  1048.                         cin >> size;
  1049.                     }
  1050.                     cout << "enter file's name" << endl;
  1051.                     cin >> sname;
  1052.                     if ((dev->SearchSub(sname)) != 1)
  1053.                     {
  1054.                         dev->AddToSub(mainelement, size, sname);
  1055.                     }
  1056.                     //cout << "success" << endl;
  1057.                     else
  1058.                         cout << "duplicates are not allowed. try again." << endl;
  1059.                 }
  1060.                 else
  1061.                 {
  1062.                     break;
  1063.                 }
  1064.                 break;
  1065.             }
  1066.         }
  1067.         case (6):
  1068.         {
  1069.             if (dev->StackIsEmpty())
  1070.             {
  1071.                 cout << "empty." << endl;
  1072.                 break;
  1073.             }
  1074.             else
  1075.             {
  1076.                 string mainelement, sname;
  1077.                 int size = 0;
  1078.                 cout << "from which catalog should we delete?" << endl;
  1079.                 cin >> mainelement;
  1080.                 cout << "enter file's size" << endl;
  1081.                 cin >> size;
  1082.                 while (cin.fail())
  1083.                 {
  1084.                     cin.clear();
  1085.                     cin.ignore(INT_MAX, '\n');
  1086.                     cout << "enter only numbers" << endl << "try again" << endl;
  1087.                     cin >> size;
  1088.                 }
  1089.                 cout << "enter file's name" << endl;
  1090.                 cin >> sname;
  1091.                 if ((dev->SearchSub(sname)) == 1)
  1092.                 {
  1093.                     dev->RemoveFromSub(mainelement, size, sname);
  1094.                 }
  1095.  
  1096.                 else
  1097.                     cout << "element not found." << endl;
  1098.                 break;
  1099.             }
  1100.         }
  1101.         case(7):
  1102.         {
  1103.             string sname;
  1104.             cout << "enter file's name" << endl;
  1105.             cin >> sname;
  1106.             if (dev->SearchSub(sname) == 1)
  1107.             {
  1108.                 cout << "found" << endl;
  1109.                 break;
  1110.             }
  1111.             else
  1112.             {
  1113.                 cout << "not found" << endl;
  1114.                 break;
  1115.             }
  1116.            }
  1117.         case(8):
  1118.         {
  1119.             if (dev->StackIsEmpty())
  1120.             {
  1121.                 cout << "device is empty." << endl;
  1122.             }
  1123.             else
  1124.             {
  1125.                 dev->PrintCatalogReverse();
  1126.             }
  1127.             break;
  1128.         }
  1129.         case(9):
  1130.         {
  1131.             dev->SaveToFile();
  1132.             break;
  1133.         }
  1134.         case(10):
  1135.             exit(1);
  1136.             dev->~Device();
  1137.         case(11):
  1138.             string name;
  1139.             cout << "enter new name for a device: " << endl;
  1140.             cin >> name;
  1141.             dev->set_deviceName(name);
  1142.             break;
  1143.         }
  1144.     }
  1145.     return 0;
  1146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement