Advertisement
Guest User

Untitled

a guest
May 31st, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. struct learner{         //подсписок
  8.     learner *pNext;     //указатель на пред элемент
  9.     string fname,lname;
  10.     int clas,ysp;
  11.  
  12. };
  13.  
  14. struct schol{                   //подсписок
  15.     schol *pNext;               //указатель на пред элемент
  16.     int size,usp;
  17.     string city,name;
  18. };
  19.  
  20. struct list                     //кольцевой список
  21. {
  22.     list *pPrev,*pNext;         //указатели на след и пред элементы
  23.     int tupe;                   //тип подсписка хранящегося в этом элементе
  24.     string name;                //имя элемента
  25.  
  26.     learner *pLea;
  27.     schol *pSch;
  28.  
  29.  
  30. }*pFirst = NULL;                                            //указатель на вершину списка
  31.  
  32. string arr_of_errors[] = {"",                               //массив ошибок
  33.                         "Ошибка №1! Память не выделена!",
  34.                         "Ошибка №2! Список пуст!",
  35.                         "Ошибка №3! Неправильный аргумент!",
  36.                         "Ошибка №4! Неизвестная ошибка!",
  37.                         "Ошибка №5! Нехватает памяти для создания файла!",
  38.                         "Ошибка №6! Файл не найден!",
  39.                         "Ошибка №7! Файл пуст!"};
  40.  
  41. int new_lea(learner *);                                 //создание подсписока студентов(добавление в конец)
  42. int new_sch(schol *);                               //создание подсписока стран(добавление в конец)
  43. int file_read_lea(learner *);
  44. int file_read_sch(schol *);
  45. int lea_sort(learner *);
  46. int sch_sort(schol *);
  47.  
  48. //
  49. int add_item();                                             //создание нового элемента в основном списке
  50. int del_item();                                             //удаление элемента из основного списка
  51. int show_list();                                            //показать элементы списка
  52. int write_file();                                           //запись информации в файл
  53. int eXit();
  54. //
  55. int (*menu[])() = {add_item,del_item,show_list,write_file,eXit};    //массив указателей на ф-ии менюшки
  56.  
  57. int main(){
  58.     setlocale(LC_ALL,"russian");
  59.     char c = 0;                    
  60.     int err = 0;                                            //здесь будет хранится код ошбки, возвращенной функцией
  61.     while (c!='5')
  62.     {
  63.         system("cls");
  64.         cout<<"Для добавления элемента введите '1';"<<endl;
  65.         cout<<"Для удаления элемента введите '2';"<<endl;
  66.         cout<<"Для вывода списка на экран введите '3';"<<endl;
  67.         cout<<"Для вывода списка в файл введите '4';"<<endl;
  68.         cout<<"Для выхода из программы введите '5';"<<endl;
  69.         cin>>c;
  70.         if(!isdigit(c)||c-'0'>5||c=='0'){
  71.             cout<<"Ввод не корректный, повторите ввод!"<<endl;
  72.             system("pause");
  73.             continue;
  74.         }
  75.         if((err = (*menu[(int)(c-'0'-1)])())!=0){                   //вызов нужной ф-ии через масив указателей на ф-ии
  76.             cout<<endl<<arr_of_errors[err]<<endl;       //и обработка кода ошибки возвращаемого этой функцией
  77.             system("pause");
  78.             exit(err);
  79.         }
  80.     }
  81.  
  82.  
  83.  
  84.     return 0;
  85. }
  86.  
  87. int eXit(){
  88.     exit(0);
  89. }
  90.  
  91. int write_file(){                                       //запись информации в файл
  92.     system("cls");
  93.     if(pFirst == NULL)
  94.         return 2;
  95.     ofstream fOut;
  96.     string name;
  97.     cout<<"Введите имя файла: ";
  98.     cin>>name;
  99.     fOut.open(name,std::ios_base::out);     //перезапись файла
  100.     if(!fOut.is_open()){                    //проверка на открытия файла
  101.         return 5;
  102.     }
  103.     list *p = pFirst;
  104.     do{
  105.         fOut<<"//////////////////////"<<endl;
  106.         fOut<<"Имя элемента: "<<p->name<<endl<<endl;
  107.         switch (p->tupe)                    //в tupe хранится тип подсписка(студенты или страны)
  108.         {
  109.             learner *plea;
  110.             schol *psch;
  111.         case 1:                     //выводим весь подсписок студентов
  112.             plea = p->pLea;
  113.             fOut<<"Тип подсписка: ученики"<<endl<<endl;
  114.             while(plea != NULL){        //вывожу все элементы подсписка(поочередно)
  115.                 fOut<<"Имя: "<<plea->fname<<endl;
  116.                 fOut<<"Фамилия: "<<plea->lname<<endl;
  117.                 fOut<<"Успеваемость: "<<plea->ysp<<endl;
  118.                 fOut<<"Класс: "<<plea->clas<<endl<<endl;
  119.                 plea = plea->pNext;
  120.             }
  121.             break;
  122.         case 2:                                     //аналогично подсписку студентов(он выше)
  123.             psch = p->pSch;
  124.             fOut<<"Тип подсписка: школы"<<endl<<endl;
  125.             while(psch != NULL){
  126.                 fOut<<"Название города: "<<psch->city<<endl;
  127.                 fOut<<"Название школы: "<<psch->name<<endl;
  128.                 fOut<<"Кол-во учеников: "<<psch->size<<endl;
  129.                 fOut<<"Кол-во хорошистов и отличников: "<<psch->usp<<endl<<endl;
  130.                 psch = psch->pNext;
  131.             }
  132.             break;
  133.         default:                        //сюда мы не должны попасть(если попали - то произошол неизвестный сбой)
  134.             return 4;                   //поэтому возвращаю код 4(неизвестная ошибка)
  135.             break;
  136.         }
  137.         p = p->pNext;
  138.     }while(p!=pFirst);
  139.     cout<<"данные занесены в файл "<<name<<endl;
  140.     system("pause");
  141.     system("cls");
  142. }
  143.  
  144. int show_list(){                                            //показать элементы списка
  145.     system("cls");
  146.     list *p = pFirst;
  147.     string name;
  148.     if(pFirst == NULL)              //если список пуст, вернуть код ошибки №2
  149.         return 2;
  150.     do{                             //выводим имена всех элементов
  151.         cout<<p->name<<endl;
  152.         p = p->pNext;
  153.     }while(p!=pFirst);
  154.     cout<<endl<<"Ведите имя элемента, который нужно показать: ";
  155.     cin>>name;
  156.     cin.ignore();
  157.     int i = 0;
  158.     while(p->name!=name){                       //ищем нужный элемент по имени
  159.         p = p->pNext;  
  160.         i++;
  161.         if(i>100)                               //мента с таким именем нету
  162.             return 3;                           //вернем код ошибки - 3
  163.     }
  164.         system("cls");
  165.         switch (p->tupe)                        //в tupe хранится тип подсписка(студенты или страны)
  166.         {
  167.             learner *plea;
  168.             schol *psch;
  169.         case 1:                                 //выводим весь подсписок студентов
  170.             plea = p->pLea;
  171.             while(plea != NULL){                //вывожу все элементы подсписка(поочередно)
  172.                 system("cls");
  173.                 cout<<"Имя: "<<plea->fname<<endl;
  174.                 cout<<"Фамилия: "<<plea->lname<<endl;
  175.                 cout<<"Успеваемость: "<<plea->ysp<<endl;
  176.                 cout<<"Класс: "<<plea->clas<<endl;
  177.                 system("pause");
  178.                 plea = plea->pNext;
  179.             }
  180.             cout<<"конец подсписка!"<<endl;
  181.             system("cls");
  182.             break;
  183.         case 2:                                     //аналогично подсписку студентов(он выше)
  184.             psch = p->pSch;
  185.             while(psch != NULL){
  186.                 system("cls");
  187.                 cout<<"Название города: "<<psch->city<<endl;
  188.                 cout<<"Название школы: "<<psch->name<<endl;
  189.                 cout<<"Кол-во учеников: "<<psch->size<<endl;
  190.                 cout<<"Кол-во хорошистов и отличников: "<<psch->usp<<endl;
  191.                 system("pause");
  192.                 psch = psch->pNext;
  193.             }
  194.             cout<<"конец подсписка!"<<endl;
  195.             system("cls");
  196.             break;
  197.         default:                        //сюда мы не должны попасть(если попали - то произошол неизвестный сбой)
  198.             return 4;                   //поэтому возвращаю код 4(неизвестная ошибка)
  199.             break;
  200.         }
  201.    
  202.     return 0;
  203. }
  204.  
  205. int del_item(){                     //удаление элемента из основоного списка
  206.     system("cls");
  207.     string name;
  208.     if(pFirst == NULL)              //если список пуст, вернуть код ошибки №2
  209.         return 2;
  210.     list *p = pFirst;
  211.     do{                             //выводим имена всех элементов
  212.         cout<<p->name<<endl;
  213.         p = p->pNext;
  214.     }while(p!=pFirst);
  215.     cout<<endl<<"Ведите имя элемента, который нужно удалить: ";
  216.     cin>>name;
  217.     cin.ignore();
  218.     int i = 0;
  219.     while(p->name!=name){                       //ищем нужный элемент по имени
  220.         p = p->pNext;  
  221.         i++;
  222.         if(i>100)                               //мента с таким именем нету
  223.             return 3;                           //вернем код ошибки - 3
  224.     }
  225.  
  226.     p->pNext->pPrev = p->pPrev;
  227.     p->pPrev->pNext = p->pNext;
  228.     if(p == pFirst)                     //если мы удаляем первый элемент, то надо перекинуть указатель
  229.         pFirst = pFirst->pNext;
  230.     if(p == pFirst)                     //если мы удаляет единственный элемент, то надо занулить указатель
  231.         pFirst = NULL;
  232.     delete p;
  233.     system("cls");
  234.     return 0;
  235. }
  236.  
  237. int add_item(){                                         //добавление элемента в основой список
  238.     system("cls");
  239.     int err = 0;
  240.     list *p;
  241.     if((p = new list)==NULL)                            //если память не была выделена, то вернем код 1(это ошибка такая)
  242.         return 1;
  243.     cout<<"Введите название элемента списка: ";
  244.     cin>>p->name;
  245.     system("cls");
  246.     cout<<"Выберите тип подсписка(1 - ученики, 2 - школы) ";
  247.     cin>>p->tupe;
  248.     char c = 0;
  249.     switch (p->tupe)                    //соответственно добавляем в нужный подсписок
  250.     {
  251.     case 1:
  252.         p->pLea = new learner;
  253.         p->pLea->pNext = NULL;      //немного костыля
  254.         cout<<"Прочитать данные из файла?(у - да, n - нет): ";
  255.         cin>>c;
  256.         if(c=='y'){
  257.             if(err = file_read_lea(p->pLea))
  258.                 return err;
  259.         }
  260.         else
  261.             if(err = new_lea(p->pLea))
  262.                 return err;
  263.         lea_sort(p->pLea);
  264.         break;
  265.     case 2:
  266.         p->pSch = new schol;
  267.         p->pSch->pNext = NULL;
  268.         cout<<"Прочитать данные из файла?(у - да, n - нет): ";
  269.         cin>>c;
  270.         if(c=='y'){
  271.             if(err = file_read_sch(p->pSch))
  272.                 return err;
  273.         }
  274.         else
  275.             if(err = new_sch(p->pSch))
  276.                 return err;
  277.         sch_sort(p->pSch);
  278.         break;
  279.     default:
  280.         return 3;
  281.     }
  282.     system("cls");
  283.     if(pFirst==NULL){               //если это первый элемент основного списка
  284.         pFirst = p;                 //устанавливаем указатель pFirst
  285.         pFirst->pNext = pFirst;     //ну и закольцовываем на негоже
  286.         pFirst->pPrev = pFirst;     //т.к. это единственный элемент
  287.     }else{                          //если это не первый элемент
  288.         p->pNext = pFirst;          //то добавляем элемент в конец
  289.         p->pPrev = pFirst->pPrev;   //ну а тут просто перебрасываем указатели
  290.         pFirst->pPrev->pNext = p;
  291.         pFirst->pPrev = p;
  292.     }
  293.  
  294.     return 0;
  295. }
  296. int file_read_sch(schol *tos){
  297.     system("cls");
  298.     ifstream fIn;
  299.     string name;
  300.  
  301.     cout<<"Введите имя файла: ";
  302.     cin>>name;
  303.     cin.ignore();
  304.     fIn.open(name,ios_base::in);
  305.     if(!fIn.is_open())
  306.         return 6;
  307.     if(fIn.eof())
  308.         return 7;
  309.     do
  310.     {
  311.         while (tos->pNext!=NULL)        //получаем указатель на последни элемент спискка
  312.                 tos=tos->pNext;
  313.         schol *p;                       //создаем новый указатель(буферный)
  314.         if(tos->city == "")                     //если подсписок пуст(вершина подсписка не заполнена данными), то заполним ее
  315.             p = tos;
  316.         else
  317.             if((p = new schol) == NULL)     //выделяем память под новый элемент, если память не выделена вернем 1
  318.                 return 1;
  319.         fIn>>p->city;
  320.         fIn>>p->name;
  321.         fIn>>p->size;
  322.         if(!(fIn>>p->usp))
  323.             return 0;
  324.         tos->pNext = p;
  325.         p->pNext = NULL;
  326.     }while (!fIn.eof());
  327.  
  328.     return 0;
  329. }
  330.  
  331. int file_read_lea(learner *tos){
  332.     system("cls");
  333.     ifstream fIn;
  334.     string name;
  335.  
  336.     cout<<"Введите имя файла: ";
  337.     cin>>name;
  338.     cin.ignore();
  339.     fIn.open(name,ios_base::in);
  340.     if(!fIn.is_open())
  341.         return 6;
  342.     if(fIn.eof())
  343.         return 7;
  344.     do
  345.     {
  346.         while (tos->pNext!=NULL)        //получаем указатель на последни элемент спискка
  347.                 tos=tos->pNext;
  348.             learner *p;                     //создаем новый указатель(буферный)
  349.             if(tos->fname==""){                 //если подсписок пуст(вершина подсписка не заполнена данными), то заполним ее
  350.             p = tos;
  351.             }
  352.             else
  353.                 if((p = new learner) == NULL)       //выделяем память под новый элемент, если память не выделена вернем 1
  354.                     return 1;
  355.         fIn>>p->fname;
  356.         fIn>>p->lname;
  357.         if(!(fIn>>p->ysp))
  358.             return 0;
  359.         fIn>>p->clas;
  360.         tos->pNext = p;
  361.         p->pNext = NULL;
  362.     }while (!fIn.eof());
  363.  
  364.     return 0;
  365. }
  366.  
  367. int new_lea(learner *tos){              //создание нового элемента подсписка
  368.     char c;
  369.    
  370.     do{
  371.         system("cls");
  372.             while (tos->pNext!=NULL)        //получаем указатель на последни элемент спискка
  373.                 tos=tos->pNext;
  374.             learner *p;                     //создаем новый указатель(буферный)
  375.             if(tos->fname=="")                      //если подсписок пуст(вершина подсписка не заполнена данными), то заполним ее
  376.             p = tos;
  377.         else
  378.             if((p = new learner) == NULL)       //выделяем память под новый элемент, если память не выделена вернем 1
  379.                 return 1;
  380.         cout<<"введите имя: ";
  381.         cin>>p->fname;
  382.         cout<<"введите фамилию: ";
  383.         cin>>p->lname;
  384.         cout<<"введите успеваемость: ";
  385.         cin>>p->ysp;           
  386.         cout<<"введите класс: ";
  387.         cin>>p->clas;
  388.         tos->pNext = p;
  389.         p->pNext = NULL;
  390.         cout<<"создать следующи элемент подсписка?(у-да, n-нет): ";
  391.         cin>>c;
  392.     }while (c=='y');
  393.     return 0;
  394.    
  395. }
  396.  
  397.  
  398. int new_sch(schol *tos){                        //создание нового элемента подсписка подключений
  399.     char c;
  400.     do{
  401.         system("cls");
  402.         while (tos->pNext!=NULL)        //получаем указатель на последни элемент спискка
  403.                 tos=tos->pNext;
  404.         schol *p;                       //создаем новый указатель(буферный)
  405.         if(tos->city=="")
  406.             p = tos;
  407.         else
  408.             if((p = new schol) == NULL)     //выделяем память под новый элемент, если память не выделена вернем 1
  409.                 return 1;
  410.         cout<<"введите название города: ";
  411.         cin>>p->city;
  412.         cout<<"введите название школы: ";
  413.         cin>>p->name;
  414.         cout<<"введите кол-во обучающихся: ";
  415.         cin>>p->size;
  416.         cout<<"введите кол-во отличников и хорошистов: ";
  417.         cin>>p->usp;
  418.         tos->pNext = p;
  419.         p->pNext = NULL;
  420.         cout<<"создать следующи элемент подсписка?(у-да, n-нет): ";
  421.             cin>>c;
  422.     }while (c=='y');
  423.     return 0;
  424. }
  425. int sch_sort(schol *tos){
  426.     schol *p = tos,b;
  427.     int i = 1;
  428.     while(i){
  429.         p = tos;
  430.         i = 0;
  431.         while(p->pNext!=NULL){
  432.             if(p->usp<p->pNext->usp){
  433.                 b.usp = p->usp;
  434.                 b.name = p->name;
  435.                 b.city = p->city;
  436.                 b.size = p->size;
  437.                 p->usp = p->pNext->usp;
  438.                 p->name = p->pNext->name;
  439.                 p->city = p->pNext->city;
  440.                 p->size = p->pNext->size;
  441.                 p->pNext->usp = b.usp;
  442.                 p->pNext->name = b.name;
  443.                 p->pNext->city = b.city;
  444.                 p->pNext->size = b.size;
  445.                 i++;   
  446.             }
  447.             p = p->pNext;
  448.         }
  449.     }
  450.     return 0;
  451.  
  452. }
  453.  
  454. int lea_sort(learner *tos){
  455.     learner *p = tos,b;
  456.     int i = 1;
  457.     while(i){
  458.         p = tos;
  459.         i = 0;
  460.         while(p->pNext!=NULL){
  461.             if(p->ysp<p->pNext->ysp){
  462.                 b.fname = p->fname;
  463.                 b.lname = p->lname;
  464.                 b.ysp = p->ysp;
  465.                 b.clas = p->clas;
  466.                 p->fname = p->pNext->fname;
  467.                 p->lname = p->pNext->lname;
  468.                 p->ysp = p->pNext->ysp;
  469.                 p->clas = p->pNext->clas;
  470.                 p->pNext->fname = b.fname;
  471.                 p->pNext->lname = b.lname;
  472.                 p->pNext->ysp = b.ysp;
  473.                 p->pNext->clas= b.clas;
  474.                 i++;
  475.             }
  476.                 p = p->pNext;
  477.         }
  478.     }
  479.     return 0;
  480.  
  481. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement