Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <fstream>
- using namespace std;
- struct learner{ //подсписок
- learner *pNext; //указатель на пред элемент
- string fname,lname;
- int clas,ysp;
- };
- struct schol{ //подсписок
- schol *pNext; //указатель на пред элемент
- int size,usp;
- string city,name;
- };
- struct list //кольцевой список
- {
- list *pPrev,*pNext; //указатели на след и пред элементы
- int tupe; //тип подсписка хранящегося в этом элементе
- string name; //имя элемента
- learner *pLea;
- schol *pSch;
- }*pFirst = NULL; //указатель на вершину списка
- string arr_of_errors[] = {"", //массив ошибок
- "Ошибка №1! Память не выделена!",
- "Ошибка №2! Список пуст!",
- "Ошибка №3! Неправильный аргумент!",
- "Ошибка №4! Неизвестная ошибка!",
- "Ошибка №5! Нехватает памяти для создания файла!",
- "Ошибка №6! Файл не найден!",
- "Ошибка №7! Файл пуст!"};
- int new_lea(learner *); //создание подсписока студентов(добавление в конец)
- int new_sch(schol *); //создание подсписока стран(добавление в конец)
- int file_read_lea(learner *);
- int file_read_sch(schol *);
- int lea_sort(learner *);
- int sch_sort(schol *);
- //
- int add_item(); //создание нового элемента в основном списке
- int del_item(); //удаление элемента из основного списка
- int show_list(); //показать элементы списка
- int write_file(); //запись информации в файл
- int eXit();
- //
- int (*menu[])() = {add_item,del_item,show_list,write_file,eXit}; //массив указателей на ф-ии менюшки
- int main(){
- setlocale(LC_ALL,"russian");
- char c = 0;
- int err = 0; //здесь будет хранится код ошбки, возвращенной функцией
- while (c!='5')
- {
- system("cls");
- cout<<"Для добавления элемента введите '1';"<<endl;
- cout<<"Для удаления элемента введите '2';"<<endl;
- cout<<"Для вывода списка на экран введите '3';"<<endl;
- cout<<"Для вывода списка в файл введите '4';"<<endl;
- cout<<"Для выхода из программы введите '5';"<<endl;
- cin>>c;
- if(!isdigit(c)||c-'0'>5||c=='0'){
- cout<<"Ввод не корректный, повторите ввод!"<<endl;
- system("pause");
- continue;
- }
- if((err = (*menu[(int)(c-'0'-1)])())!=0){ //вызов нужной ф-ии через масив указателей на ф-ии
- cout<<endl<<arr_of_errors[err]<<endl; //и обработка кода ошибки возвращаемого этой функцией
- system("pause");
- exit(err);
- }
- }
- return 0;
- }
- int eXit(){
- exit(0);
- }
- int write_file(){ //запись информации в файл
- system("cls");
- if(pFirst == NULL)
- return 2;
- ofstream fOut;
- string name;
- cout<<"Введите имя файла: ";
- cin>>name;
- fOut.open(name,std::ios_base::out); //перезапись файла
- if(!fOut.is_open()){ //проверка на открытия файла
- return 5;
- }
- list *p = pFirst;
- do{
- fOut<<"//////////////////////"<<endl;
- fOut<<"Имя элемента: "<<p->name<<endl<<endl;
- switch (p->tupe) //в tupe хранится тип подсписка(студенты или страны)
- {
- learner *plea;
- schol *psch;
- case 1: //выводим весь подсписок студентов
- plea = p->pLea;
- fOut<<"Тип подсписка: ученики"<<endl<<endl;
- while(plea != NULL){ //вывожу все элементы подсписка(поочередно)
- fOut<<"Имя: "<<plea->fname<<endl;
- fOut<<"Фамилия: "<<plea->lname<<endl;
- fOut<<"Успеваемость: "<<plea->ysp<<endl;
- fOut<<"Класс: "<<plea->clas<<endl<<endl;
- plea = plea->pNext;
- }
- break;
- case 2: //аналогично подсписку студентов(он выше)
- psch = p->pSch;
- fOut<<"Тип подсписка: школы"<<endl<<endl;
- while(psch != NULL){
- fOut<<"Название города: "<<psch->city<<endl;
- fOut<<"Название школы: "<<psch->name<<endl;
- fOut<<"Кол-во учеников: "<<psch->size<<endl;
- fOut<<"Кол-во хорошистов и отличников: "<<psch->usp<<endl<<endl;
- psch = psch->pNext;
- }
- break;
- default: //сюда мы не должны попасть(если попали - то произошол неизвестный сбой)
- return 4; //поэтому возвращаю код 4(неизвестная ошибка)
- break;
- }
- p = p->pNext;
- }while(p!=pFirst);
- cout<<"данные занесены в файл "<<name<<endl;
- system("pause");
- system("cls");
- }
- int show_list(){ //показать элементы списка
- system("cls");
- list *p = pFirst;
- string name;
- if(pFirst == NULL) //если список пуст, вернуть код ошибки №2
- return 2;
- do{ //выводим имена всех элементов
- cout<<p->name<<endl;
- p = p->pNext;
- }while(p!=pFirst);
- cout<<endl<<"Ведите имя элемента, который нужно показать: ";
- cin>>name;
- cin.ignore();
- int i = 0;
- while(p->name!=name){ //ищем нужный элемент по имени
- p = p->pNext;
- i++;
- if(i>100) //мента с таким именем нету
- return 3; //вернем код ошибки - 3
- }
- system("cls");
- switch (p->tupe) //в tupe хранится тип подсписка(студенты или страны)
- {
- learner *plea;
- schol *psch;
- case 1: //выводим весь подсписок студентов
- plea = p->pLea;
- while(plea != NULL){ //вывожу все элементы подсписка(поочередно)
- system("cls");
- cout<<"Имя: "<<plea->fname<<endl;
- cout<<"Фамилия: "<<plea->lname<<endl;
- cout<<"Успеваемость: "<<plea->ysp<<endl;
- cout<<"Класс: "<<plea->clas<<endl;
- system("pause");
- plea = plea->pNext;
- }
- cout<<"конец подсписка!"<<endl;
- system("cls");
- break;
- case 2: //аналогично подсписку студентов(он выше)
- psch = p->pSch;
- while(psch != NULL){
- system("cls");
- cout<<"Название города: "<<psch->city<<endl;
- cout<<"Название школы: "<<psch->name<<endl;
- cout<<"Кол-во учеников: "<<psch->size<<endl;
- cout<<"Кол-во хорошистов и отличников: "<<psch->usp<<endl;
- system("pause");
- psch = psch->pNext;
- }
- cout<<"конец подсписка!"<<endl;
- system("cls");
- break;
- default: //сюда мы не должны попасть(если попали - то произошол неизвестный сбой)
- return 4; //поэтому возвращаю код 4(неизвестная ошибка)
- break;
- }
- return 0;
- }
- int del_item(){ //удаление элемента из основоного списка
- system("cls");
- string name;
- if(pFirst == NULL) //если список пуст, вернуть код ошибки №2
- return 2;
- list *p = pFirst;
- do{ //выводим имена всех элементов
- cout<<p->name<<endl;
- p = p->pNext;
- }while(p!=pFirst);
- cout<<endl<<"Ведите имя элемента, который нужно удалить: ";
- cin>>name;
- cin.ignore();
- int i = 0;
- while(p->name!=name){ //ищем нужный элемент по имени
- p = p->pNext;
- i++;
- if(i>100) //мента с таким именем нету
- return 3; //вернем код ошибки - 3
- }
- p->pNext->pPrev = p->pPrev;
- p->pPrev->pNext = p->pNext;
- if(p == pFirst) //если мы удаляем первый элемент, то надо перекинуть указатель
- pFirst = pFirst->pNext;
- if(p == pFirst) //если мы удаляет единственный элемент, то надо занулить указатель
- pFirst = NULL;
- delete p;
- system("cls");
- return 0;
- }
- int add_item(){ //добавление элемента в основой список
- system("cls");
- int err = 0;
- list *p;
- if((p = new list)==NULL) //если память не была выделена, то вернем код 1(это ошибка такая)
- return 1;
- cout<<"Введите название элемента списка: ";
- cin>>p->name;
- system("cls");
- cout<<"Выберите тип подсписка(1 - ученики, 2 - школы) ";
- cin>>p->tupe;
- char c = 0;
- switch (p->tupe) //соответственно добавляем в нужный подсписок
- {
- case 1:
- p->pLea = new learner;
- p->pLea->pNext = NULL; //немного костыля
- cout<<"Прочитать данные из файла?(у - да, n - нет): ";
- cin>>c;
- if(c=='y'){
- if(err = file_read_lea(p->pLea))
- return err;
- }
- else
- if(err = new_lea(p->pLea))
- return err;
- lea_sort(p->pLea);
- break;
- case 2:
- p->pSch = new schol;
- p->pSch->pNext = NULL;
- cout<<"Прочитать данные из файла?(у - да, n - нет): ";
- cin>>c;
- if(c=='y'){
- if(err = file_read_sch(p->pSch))
- return err;
- }
- else
- if(err = new_sch(p->pSch))
- return err;
- sch_sort(p->pSch);
- break;
- default:
- return 3;
- }
- system("cls");
- if(pFirst==NULL){ //если это первый элемент основного списка
- pFirst = p; //устанавливаем указатель pFirst
- pFirst->pNext = pFirst; //ну и закольцовываем на негоже
- pFirst->pPrev = pFirst; //т.к. это единственный элемент
- }else{ //если это не первый элемент
- p->pNext = pFirst; //то добавляем элемент в конец
- p->pPrev = pFirst->pPrev; //ну а тут просто перебрасываем указатели
- pFirst->pPrev->pNext = p;
- pFirst->pPrev = p;
- }
- return 0;
- }
- int file_read_sch(schol *tos){
- system("cls");
- ifstream fIn;
- string name;
- cout<<"Введите имя файла: ";
- cin>>name;
- cin.ignore();
- fIn.open(name,ios_base::in);
- if(!fIn.is_open())
- return 6;
- if(fIn.eof())
- return 7;
- do
- {
- while (tos->pNext!=NULL) //получаем указатель на последни элемент спискка
- tos=tos->pNext;
- schol *p; //создаем новый указатель(буферный)
- if(tos->city == "") //если подсписок пуст(вершина подсписка не заполнена данными), то заполним ее
- p = tos;
- else
- if((p = new schol) == NULL) //выделяем память под новый элемент, если память не выделена вернем 1
- return 1;
- fIn>>p->city;
- fIn>>p->name;
- fIn>>p->size;
- if(!(fIn>>p->usp))
- return 0;
- tos->pNext = p;
- p->pNext = NULL;
- }while (!fIn.eof());
- return 0;
- }
- int file_read_lea(learner *tos){
- system("cls");
- ifstream fIn;
- string name;
- cout<<"Введите имя файла: ";
- cin>>name;
- cin.ignore();
- fIn.open(name,ios_base::in);
- if(!fIn.is_open())
- return 6;
- if(fIn.eof())
- return 7;
- do
- {
- while (tos->pNext!=NULL) //получаем указатель на последни элемент спискка
- tos=tos->pNext;
- learner *p; //создаем новый указатель(буферный)
- if(tos->fname==""){ //если подсписок пуст(вершина подсписка не заполнена данными), то заполним ее
- p = tos;
- }
- else
- if((p = new learner) == NULL) //выделяем память под новый элемент, если память не выделена вернем 1
- return 1;
- fIn>>p->fname;
- fIn>>p->lname;
- if(!(fIn>>p->ysp))
- return 0;
- fIn>>p->clas;
- tos->pNext = p;
- p->pNext = NULL;
- }while (!fIn.eof());
- return 0;
- }
- int new_lea(learner *tos){ //создание нового элемента подсписка
- char c;
- do{
- system("cls");
- while (tos->pNext!=NULL) //получаем указатель на последни элемент спискка
- tos=tos->pNext;
- learner *p; //создаем новый указатель(буферный)
- if(tos->fname=="") //если подсписок пуст(вершина подсписка не заполнена данными), то заполним ее
- p = tos;
- else
- if((p = new learner) == NULL) //выделяем память под новый элемент, если память не выделена вернем 1
- return 1;
- cout<<"введите имя: ";
- cin>>p->fname;
- cout<<"введите фамилию: ";
- cin>>p->lname;
- cout<<"введите успеваемость: ";
- cin>>p->ysp;
- cout<<"введите класс: ";
- cin>>p->clas;
- tos->pNext = p;
- p->pNext = NULL;
- cout<<"создать следующи элемент подсписка?(у-да, n-нет): ";
- cin>>c;
- }while (c=='y');
- return 0;
- }
- int new_sch(schol *tos){ //создание нового элемента подсписка подключений
- char c;
- do{
- system("cls");
- while (tos->pNext!=NULL) //получаем указатель на последни элемент спискка
- tos=tos->pNext;
- schol *p; //создаем новый указатель(буферный)
- if(tos->city=="")
- p = tos;
- else
- if((p = new schol) == NULL) //выделяем память под новый элемент, если память не выделена вернем 1
- return 1;
- cout<<"введите название города: ";
- cin>>p->city;
- cout<<"введите название школы: ";
- cin>>p->name;
- cout<<"введите кол-во обучающихся: ";
- cin>>p->size;
- cout<<"введите кол-во отличников и хорошистов: ";
- cin>>p->usp;
- tos->pNext = p;
- p->pNext = NULL;
- cout<<"создать следующи элемент подсписка?(у-да, n-нет): ";
- cin>>c;
- }while (c=='y');
- return 0;
- }
- int sch_sort(schol *tos){
- schol *p = tos,b;
- int i = 1;
- while(i){
- p = tos;
- i = 0;
- while(p->pNext!=NULL){
- if(p->usp<p->pNext->usp){
- b.usp = p->usp;
- b.name = p->name;
- b.city = p->city;
- b.size = p->size;
- p->usp = p->pNext->usp;
- p->name = p->pNext->name;
- p->city = p->pNext->city;
- p->size = p->pNext->size;
- p->pNext->usp = b.usp;
- p->pNext->name = b.name;
- p->pNext->city = b.city;
- p->pNext->size = b.size;
- i++;
- }
- p = p->pNext;
- }
- }
- return 0;
- }
- int lea_sort(learner *tos){
- learner *p = tos,b;
- int i = 1;
- while(i){
- p = tos;
- i = 0;
- while(p->pNext!=NULL){
- if(p->ysp<p->pNext->ysp){
- b.fname = p->fname;
- b.lname = p->lname;
- b.ysp = p->ysp;
- b.clas = p->clas;
- p->fname = p->pNext->fname;
- p->lname = p->pNext->lname;
- p->ysp = p->pNext->ysp;
- p->clas = p->pNext->clas;
- p->pNext->fname = b.fname;
- p->pNext->lname = b.lname;
- p->pNext->ysp = b.ysp;
- p->pNext->clas= b.clas;
- i++;
- }
- p = p->pNext;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement