
Бывалый

Профиль
Группа: Участник
Сообщений: 206
Регистрация: 15.12.2004
Где: в кресле
Репутация: 2 Всего: 3
|
Вот код: | Код | #include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <conio.h> #include <stdio.h> #include <string.h>
void ErrorMessage(int i); // Вывод сообщений на экран int Menu(char *s); // функция меню
// Структура данных //class List; class Data { friend class List; char name[21]; char dir[21]; char country[21]; int bud; float doh; public: Data *next, *prev; Data() { // конструктор strcpy(name,"No_title"); strcpy(dir,"No_title"); strcpy(country,"No_title"); bud=0; doh=0.00; next=prev=NULL; } void TableView();
void Setname(char *s) // Установка имени в класс { strncpy(name, s, 20); //копирует из строки name[20]='\0'; } void Setcountry(char *s) // Установка страны в класс { strncpy(country, s, 20); country[20]='\0'; } void Setdir(char *s) // Установка режиссера в класс { strncpy(dir, s, 20); dir[20]='\0'; }
void Setbud(int n) // Установка вюджета в класс { if(n>=0 && n<=32000) bud=n; else ErrorMessage(1); } void Setdoh(float i) //Установка дохода в класс { if(i>=0) doh=i; else ErrorMessage(1); } char *Getname() { return name; } // считать имя char *Getcountry() { return country; } // считать страну char *Getdir() { return dir; } // считать режиссера int Getbud() { return bud; } // считать бюджет float Getdoh() { return doh; } // считать доход };
// Класс, реализующий работу с двунаправленным списко //template <class X> class List{ Data *cur; Data *AddItem(); Data *AddItem(Data *n); Data *ShowCurItem(); Data *EditCurItem(); Data *RemoveCurItem(); void loadlist(ifstream &in); void RemoveList(); Data *GoBegin(); Data *GoEnd(); Data *GoNext() { if(cur->next) return cur=cur->next; else { ErrorMessage(2); return cur; } } Data *GoPrev() { if(cur->prev) return cur=cur->prev; else { ErrorMessage(3); return cur; } }
public: List() { cur=NULL; } /* Data *Search(int f, int val); Data *Search(int f, char * val); Data *Search(int f, float val);*/ //template <typename> Data *Search(int f,class X); void SearchMenu(); void InsertData(); // вставка элемента void ShowList(); // просмотр всего списка void Delete(); // удаление void LoadList(); // загрузить список void SaveList(); // сохранение файла в виде отчета };
void List::SearchMenu() //функция выводящая меню { char str[21], title[15]; //2 массива с элементами типа char int contin, k; // 2 переменные типа int int ch; float kk; Data *tmp, *old_cur=cur;
if (!cur) { //если стек пуст ErrorMessage(5); return; } clrscr(); printf (" Поиск\n -----------------"); ShowCurItem(); printf ( "\n\n Выберите поле, по которому будет производится поиск: "); do { scanf("%d", &ch); // while (getchar()!= '\n');
if (ch < 1 || ch > 5) printf(" Введите число от 1 до 5: "); clrscr(); } while (ch < 1 || ch > 5); switch (ch) { case 1: strncpy(title, "Название", 15); //указатель на 1 элемент массива title case 2: //strncpy копирует значение из второго элемента в первый if (ch == 2) strncpy(title, "Режиссер", 15); case 3: if (ch == 3) strncpy(title, "Страна", 15); printf( "Введите значение поля '%s': ",title); scanf("%s",str); GoBegin(); while (cur) { tmp = Search<char*>(ch, str); //промежуточная переменная для хранения адреса if (tmp) { old_cur = tmp; ShowCurItem(); printf( "\n 1 - продолжить поиск; 0 - стоп: "); scanf ("%d", &contin); if (!contin) return; else { if (cur->next) cur = cur->next; else return; } } else { printf("\n Ничего не найдено\n Нажмите любую клавишу для продолжения...\n"); getch(); } } cur = old_cur; break; case 4: printf( "Введите значение поля 'Бюджет': "); scanf("%d ", &k); GoBegin(); while (cur) { tmp = Search(ch, k); if (tmp) { old_cur = tmp; ShowCurItem(); printf("\n 1 - продолжить поиск; 0 - стоп: "); scanf("%d",&contin); if (!contin) return; else { if (cur->next) cur = cur->next; else return; } } else { printf("\n Ничего не найдено\n Нажмите любую клавишу для продолжения...\n"); getch(); } } cur = old_cur; break; case 5: printf("Введите значение поля 'Доход': "); scanf ("%f",&kk); GoBegin(); while (cur) { tmp = Search<float>(ch, kk); if (tmp) { old_cur = tmp; ShowCurItem(); printf( "\n 1 - продолжить поиск; 0 - стоп: "); scanf("%d",&contin); if (!contin) return; else { if (cur->next) cur = cur->next; else return; } } else { printf( "\n Ничего не найдено\n Нажмите любую клавишу для продолжения...\n"); getch(); } } cur = old_cur; break; default: printf( "\nНеверный пункт меню!\n Нажмите любую клавишу для продолжения...\n"); } } template
template<class X> Data *List::Search(int f, X val) //val значение к { //f значение ch if (f== 4 && cur != NULL) { while (cur) { if (cur->bud == val) return cur; cur = cur->next; } return NULL; } if ((f > 1 && f < 3) && cur != NULL) { char * key; while (cur) { switch (f) { case 1: key = cur->name; break; case 2: key = cur->dir; break; case 3: key = cur->country; break; } if (!strcmp(key,val)) return cur; cur = cur->next; } return NULL; } return NULL; }
Data* List::GoBegin() { if (!cur) return NULL; while (cur->prev) cur = cur->prev; return cur; }
Data* List::GoEnd() { if (!cur) return NULL; while (cur->next) cur = cur->next; return cur; }
void List::LoadList() { int i; char fname[30]; //char *fname=new char[30] printf("Введите имя файла: "); scanf("%s", fname); //while (getchar() != '\n');
ifstream in(fname); if(!in) { ErrorMessage(6); return; } if (cur) switch(Menu(" 1) Дописать информацию в базу| 2) При чтении информации с диска, старую базу удалять| 3) Отмена")) { case 1: while(cur->next) cur=cur->next; loadlist(in); printf("\nБаза загружена"); break; case 2: RemoveList(); loadlist(in); printf("\nБаза загружена"); break; } else loadlist(in); in.close(); //закрывает файл in.clear(0); printf("\nНажмите любую клавишу..."); getch(); }
void List::loadlist(ifstream &in) { Data *temp; char s[256]; int i; float f;
while (!in.eof()) //возвращает 1 если конец файла { temp=new Data; //создаем объект класса- элемент списка if(!temp) //если не создался { ErrorMessage(4); exit(1); } in>>s; //заполняем поля элемента списка temp->Setname(s); in>>s; temp->Setdir(s); in>>s; temp->Setcountry(s); in>>s; temp->Setbud(atoi(s)); //строка в число int in>>s; temp->Setdoh(atof(s)); if (!in.eof()) AddItem(temp); else delete temp; } }
void List::SaveList() { char fname[30]; Data *temp=cur; printf( "Введите имя файла: ");
scanf("%s", fname); ofstream out(fname); //вывод в файл if(!out) { //если некуда выводить ErrorMessage(6); return; }
if(!cur) { ErrorMessage(5); return; } //если список пустой
while(temp->prev) temp=temp->prev; //устанавливаем указатель на начало
do{ out<<temp->Getname()<<endl; out<<temp->Getdir()<<endl; out<<temp->Getcountry()<<endl; out<<temp->Getbud()<<endl; out<<temp->Getdoh()<<endl;
temp=temp->next; } while(temp); out.close();
printf("\nБаза данных успешно сохранена в файл!\n"); printf("Нажмите любую клавишу..."); getch(); }
void List::RemoveList() { Data *temp; if(!cur) { ErrorMessage(5); return; }
while(cur->prev) cur=cur->prev; do { temp=cur; cur=cur->next; delete temp; }while(cur); }
Data *List::RemoveCurItem() { Data *temp=cur; if(temp==NULL) { ErrorMessage(5); return cur; }
if(cur->next&&cur->prev) // удаляем элемент в середине { cur->next->prev=cur->prev; cur->prev->next=cur->next; cur=cur->next; delete temp; return cur; } if(cur->next&&!cur->prev) // удалаяем первый элемент { cur->next->prev=NULL; cur=cur->next; delete temp; return cur; } if(!cur->next&&cur->prev) // удалаяем последний элемент { cur->prev->next=NULL; cur=cur->prev; delete temp; return cur; } if(!cur->next&&!cur->prev) // удаляем единственный элемент { cur=NULL; delete temp; return cur; } return cur; }
void List::Delete() { int i; if(!cur) { ErrorMessage(5); return; } do{ clrscr(); if(cur) ShowCurItem(); else { ErrorMessage(5); return; } i=Menu(" 1) Удалить текущий элемент| 2) Удалить весь список| 0) Выход в главное меню"); switch(i) { case 1: RemoveCurItem(); break; case 2: RemoveList(); case 0: return; }
} while(i);
}
void List::ShowList() { int i; do { if(cur) {clrscr(); ShowCurItem(); } else {ErrorMessage(5); return ; } i=Menu(" 1) Просмотр следующего элемента| 2) Просмотр предыдущего элемента |\ 3) Просмотр первого элемента | 4) Просмотр последнего элемента |\ 5) Удалить текущий элемент | 6) Редактирование текущего элемента | 0) Выход в главное меню"); switch(i) { case 1: GoNext(); break; case 2: GoPrev(); break; case 3: GoBegin(); break; case 4: GoEnd(); break; case 5: RemoveCurItem(); break; case 6: EditCurItem(); break; } }while(i); }
Data *List::EditCurItem() { char buf[20]; float z; int i; int menu; do { clrscr(); ShowCurItem(); printf( "\n 0) Выход в главное меню"); printf( "\n\n Ваш выбор: "); scanf("%d",&menu);
while (getchar() != '\n'); switch (menu) { case 1: printf("\n Название: "); scanf("%s", buf); cur->Setname(buf); break; case 2: printf("\n Режиссер: "); scanf("%s",buf); cur->Setdir(buf); break; case 3: printf("\n Страна: "); scanf("%s",buf); cur->Setcountry(buf); break; case 4:
do{ printf("\n Бюджет: "); scanf("%d",&i); cur->Setbud(i); }while(i<0||i>32000); break; case 5: do{ printf("\n Доход: "); scanf("%f",&z); cur->Setdoh(z); }while(z<0); break; } } while (menu); //пока menu не ноль return cur; }
Data *List::ShowCurItem() { printf("\n Текущий элемент:\n ----------------"); printf("\n 1) Название: %s" ,cur->Getname()); printf("\n 2) Режиссер: %s ",cur->Getdir()); printf("\n 3) Страна: %s ",cur->Getcountry()); printf("\n 4) Бюджет: %d ",cur->Getbud()); printf("\n 5) Доход: %f",cur->Getdoh()); return cur; }
Data *List::AddItem(Data *n) { if (cur==NULL) // вставка элемента в пустой список { cur=n; return n; } n->prev=NULL; n->next=cur; cur->prev=n; cur=n; return cur; /* // ---- Вставк элемента после текущего --------- if (cur->next==NULL) // вставка в конец списка { n->prev=cur; cur->next=n; cur=n; return n; } // вставка в середину списка после текущего cur->next->prev=n; n->next=cur->next; n->prev=cur; cur->next=n; return cur=n;*/ }
Data *List::AddItem() { Data *temp=new Data(); // создание объекта Data if(temp==NULL) { ErrorMessage(4); return cur; }
return AddItem(temp); }
void List::InsertData() { int i; clrscr(); if(!AddItem()) return; ShowCurItem(); do{ printf("\n\nРедактировать - 1, вернуться в меню - 0."); printf("\nВаш выбор: "); scanf("%d",&i); }while(i!=0&&i!=1); if(i) EditCurItem(); }
void main() { List list; int i; do{ clrscr(); printf("Главное меню\n"); i=Menu(" 1) Вставка | 2) Просмотр | 3) Удаление |\ 4) Поиск | 5) Сохранить в файл | 6) Загрузить из файла | 0) Выход");
switch(i) { case 1: list.InsertData(); break; case 2: list.ShowList(); break; case 3: list.Delete(); break; case 4: list.SearchMenu(); break; case 5: list.SaveList(); break; case 6: list.LoadList(); break; } } while(i); }
void ErrorMessage(int i) { printf("\a"); switch(i) { case 1: printf("\nВведенная величина не соответсвует заданному диапозону!\n"); break; case 2: printf( "\nСледующего элемента не существует! \n"); break; case 3: printf( "\nПредыдущего элемента не существует! \n"); break; case 4: printf("\nВ системе не хватает памяти! \n"); break; case 5: printf("\nСписок пуст! \n"); break; case 6: printf("\nОшибка открытия файла! \n"); break;
} printf("Нажмите любую клавишу...\n"); getch(); }
int Menu(char *s) { int i, count; count=0; printf("\n\n"); for(i=0;i<strlen(s);i++) if(s[i]=='|') count++; count++;
for(i=0;i<strlen(s);i++) if(s[i]!='|') cout<<s[i]; else cout<<'\n'; do { printf("\n\n Ваш выбор: "); cin>>i; }while(i>(count-1)||i<0);
return i; }
|
--------------------
Админ- это вождь Apache'й :)
|