16

Разработка программы реализующей организацию библиотечной деятельности

Курсовая

Информатика, кибернетика и программирование

Разработка программы реализующей организацию системы выдачи, возврата книг в библиотеке является учебной задачей, и заключается в отработки навыков реализации ранее изученных структур данных и алгоритмов обработки данных.

Русский

2012-11-14

125 KB

102 чел.

СОДЕРЖАНИЕ

Содержание           1

Задание на курсовой проект         2

ВВЕДЕНИЕ           5

1 Алгоритмы и структуры данных       6

  1.  Данные о книгах         6
    1.  Данные о читателях         6
    2.  Данные о взятых/возвращенных книгах               7
    3.  Алгоритм обхода бинарного дерева      7
    4.  Алгоритмы балансировки АВЛ-дерева     7
    5.  Алгоритм поиска в тексте        8
    6.  Алгоритм хэширования        8

2 Описание программы          9

  1.  Руководство по использованию программы     9
    1.  Листинг программы         9

Заключение           10

Список использованной литературы       11

ПРИЛОЖЕНИЕ 1 — Листинг программы      13


Задание на курсовой проект

 

Информационная система для предметной области «Обслуживание клиентов в библиотеке» должна осуществлять ввод, хранение, обработку и вывод данных о:

читателях;

  •  книгах;
  •  выдаче и приеме книг от читателей.

Данные о каждом читателе должны содержать:

  •  № читательского билета – строка формата «ANNNN-YY», где A – буква, обозначающая права доступа читателя (А – только абонемент, Ч – только читальный зал, В – читальный зал и абонемент), NNNN – порядковый номер регистрации (цифры), YY – последние две цифры номера года регистрации;
  •  ФИО – строка;
  •  Год рождения – целое;
  •  Адрес – строка;
  •  Место работы/учебы – строка.

Данные о читателях должны быть организованны в виде хеш-таблицы, первичным ключом которой является «№ читательского билета»

Метод хеширования  - Открытое хеширование.

Данные о каждой книге должны содержать:

  •  Шифр – строка формата «NNN.MMM», где NNN – номер тематического раздела (цифры), MMM – порядковый номер книги в разделе (цифры);
  •  Автор(ы) – строка;
  •  Название – строка;
  •  Издательство – строка;
  •  Год издания – целое;
  •  Количество экземпляров всего – целое;
  •  Количество экземпляров в наличии – целое;

Данные о книгах должны быть организованны в виде АВЛ-дерева поиска, упорядоченного по «Шифр».

Данные о выдаче или возврате книги должны содержать:

  •  № читательского билета – строка, формат которой соответствует аналогичной строке в данных о читателях;
  •  Шифр – строка, формат которой соответствует аналогичной строке в данных о книгах;
  •  Дата выдачи   - строка;
  •  Дата возврата - строка.
  •  Вид списка — линейный двунаправленный.

Наличие в этих данных записи, содержащей в поле «№ читательского билета» значение X и в поле «Шифр» значение Y означает выдачу читателю с номером читательского билета X экземпляра книги с шифром Y. Отсутствие такой записи означает, что читателю с номером читательского билета X не выдавался ни один экземпляр книги с шифром Y.

Одному читателю может быть выдано несколько книг, и экземпляры одной книги могут быть выданы нескольким читателям. Таким образом, могут быть данные, имеющие повторяющиеся значения в своих полях.

Данные о выдаче  или возврате книги должны быть организованны в виде списка, который упорядочен по первичному ключу – «Шифр».

Информационная система «Обслуживание клиентов в библиотеке» должна осуществлять следующие операции:

  •  регистрация нового читателя;
  •  снятие с обслуживания читателя;
  •  просмотр всех зарегистрированных читателей;
  •  очистка данных о читателях;
  •  поиск читателя по № читательского билета. Результаты поиска – все сведения о найденном читателе и шифры книг, которые ему выданы;
  •  поиск читателя по ФИО. Результаты поиска – список найденных читателей с указанием № читательского билета и ФИО;
  •  добавление новой книги;
  •  удаление сведений о книге;
  •  просмотр всех имеющихся книг;
  •  очистка данных о книгах;
  •  поиск книги по шифру. Результаты поиска – все сведения о найденной книге, а также № читательских билетов и ФИО читателей, которым выданы экземпляры этой книги;
  •  поиск книги по фрагментам ФИО автора(ов) или названия. Результаты поиска – список найденных книг с указанием шифра, автора(ов), названия, издательства, года издания и количества экземпляров в наличии;
  •  регистрация выдачи экземпляра книги читателю;
  •  регистрация приема экземпляра книги от читателя.

Метод поиска по ФИО — по алгоритму поиска в тексте Боуера и Мура.

Метод обхода АВЛ-дерева  обратный.

При регистрации выдачи экземпляра книги или приема экземпляра книги от читателя должно корректироваться значение поля «Количество экземпляров в наличии» для соответствующей книги.


ВВЕДЕНИЕ

Разработка программы реализующей организацию системы выдачи.возврата книг в библиотеке является учебной задачей, и заключается в отработки навыков реализации ранее изученных структур данных и алгоритмов обработки данных.

 


 

1 Алгоритмы и структуры данных

1.1 Данные о читателях

Представлены в виде  хэш таблицы записей вида:

struct hash_reader

{

   string Key;      // nomer bileta

   hash_reader *next;

   string surname; //familiya imya otchestvo

   int birth_year;  //god rojdeniya

   string adress; //adress projivaniya

   string job;  //mesto raboti/uchebi

};

  1.  Данные о книгах

Представлены в виде двоичного  АВЛ — дерева, каждый элемент которого имеет вид:struct TreeNode

{

int bookcode;                    //код книги

int deep;     //глубина вершины

char authors[50];  //авторы

char title[30];  //название

char publisher[30]; //издатель

int rdate;   //год издания

int quantity;   //число книг всего

int quantitys;  //число книг в наличии

TreeNode *left;

TreeNode *right;

TreeNode *parent;

};


  1.  Данные о выданных/возвращенных книгах

Данные представлены в виде  двунаправленного  динамического списка вида:

struct book_rotation{

   string reader_ticket;        //номер читальского билета

   int bookcode;    // код книги

   string gdate;    //дата выдачи

   string rdate;    //дата возврата

   book_rotation* next;    //указатель на следующий элемент

   book_rotation* prev;   //указатель на предыдущий элемент

   };

  1.  Алгоритм обхода бинарного дерева

Симметричный обход:

рекурсивное посещение:

-левого поддрева

-вершины

-правого поддререва

Реализация в разработанной программе:

TreeNode* obhod(TreeNode* root);

Параметры: (Корень дерева)

  1.  Алгоритмы балансировки АВЛ-дерева

Повороты:

Малый правый.

Малый левый.

Большой левый.

Большой правый.

Реализация в программе:

TreeNode* SRR(TreeNode* root);

TreeNode* SLR(TreeNode* root);

TreeNode* BLR(TreeNode* root);

TreeNode* BRR(TreeNode* root);

Входный параметры (ссылка на корень дерева)

1.6 Алгоритм поиска в тексте

Алгоритм поиска подстроки Боуера и Мура:

Составить таблицу сдвигов — наименьшее удаление каждой буквы подстроки от ее конца.

Сравнение с текстом происходит с конца подстроки. Если совпадения не происходит и данной буквы текста нет в подстроке — сдвиг подстроки на ее длину. Если буква присутствует в подстроке — сдвиг подстроки на значение из таблицы сдвигов.

Реализация в разработаннрй программе:

int txt_search (char test[256], char subin[256]) ;


Параметры: (основная строка. искомая подстрока)

Возвращаемые параметры: 1 если найдено.  0 если нет.


2 Описание программы

2.1 Руководство по использованию программы

Основное меню

Manage Books – вызов меню управления книгами

Manage Readersвызов меню управления данными о читателях

Manage Books Rotationвызов меню управления выдачей.возвратом книг.

 

  1.  Manage Books

  Add New Book -добавление новой книги

  Search for Book by BookCode — поиск книги по его коду

  Search for Book by Author— поиск книги по автору.

  Delete Book — удаление данных о книге

  View Book List— просмотр всех книг в базе

  Delete All Trip Info — удаление данных о всех книгах.

  1.  MANAGE PASSANGERS

  Add a reader - добаление данных о новом читателе

  Find Reader by Ticket  поиск по номеру билета

  Search by SNM fragment — поиск по ФИО

  Delete a reader — удаление данных о читателе

  View table of readers - просмотр всех читателей

  Delete all readers info— удаление всех данных о читателях

  1.  MANAGE TICKETS

  Give Book— выдача книги

  Return Book — регистрация возврата книги

  View Book Rotation List просмотр всех статистики книг

2.2 Листинг программы.

Листинг программы привевден в приложении 1.

Заключение

В процессе работы над курсовым проектом, былу укреплены знания о работе с деревьями поиска, хэш-таблицей, списками,  а также реализован алгоритм поиска в тексте Боуэра-Мура.


Список Использованной литературы

  1.  Брюс Эккель<<Философия С++. Введение в стандартный С++>> Питер, 2004 г.
  2.   Стенли Липпман "Основы программирования на С++. Том 1" Питер, 2005 г.


ПРИЛОЖЕНИЕ 1 - Листинг программы

#include<iostream>

#include<limits>

#include<fstream>

#include<cmath>

#include<time.h>

#include<strings.h>

#include<string.h>

#include <cstdlib>

#include<stdio.h>

#include <windows.h>

using namespace std;

SYSTEMTIME st;

const int max=256;

int steps=0;

int node_kol=0;

int sitem;

float summ=0;

//BOOKS INIT//

struct TreeNode

{

int bookcode;

int deep;

int bal;

char authors[50];

char title[30];

char publisher[30];

int rdate;

int quantity;

int quantitys;

TreeNode *left;

TreeNode *right;

TreeNode *parent;

};

char* nback(unsigned long nbookcode) ;

unsigned long van();

TreeNode* add(TreeNode* root);

TreeNode* search(TreeNode* root, unsigned long sitem);

TreeNode* book_search_author(TreeNode* root);

TreeNode* SRR(TreeNode* root);

TreeNode* SLR(TreeNode* root);

TreeNode* BLR(TreeNode* root);

TreeNode* BRR(TreeNode* root);

TreeNode* obhod(TreeNode* root);

TreeNode* balance(TreeNode* root, int dir);

TreeNode* del(TreeNode* root, unsigned  long sitem);

TreeNode* deleten(TreeNode* root);

TreeNode* list(TreeNode* root) ;

TreeNode* root;

TreeNode* temp;

TreeNode* tempbal;

TreeNode* book_add;

void src(TreeNode* root);

void books_menu();

void tickets_menu() ;

int txt_search(char test[30], char subin[30]);

int cells;

int a_num=0;

//BOOK ROTTATION//

struct book_rotation{

   string reader_ticket;

   int bookcode;

   string gdate;

   string rdate;

   book_rotation* next;

   book_rotation* prev;

   };

book_rotation* Thead;

void rotation_menu();

void viev_all_books(book_rotation *Thead);

book_rotation* give_book(string areadersticket, int abookcode);

book_rotation* return_book(string areadersticket, int abookcode);

//////////////////READERS INIT///////////////

const int hash_table_size=1500;

struct hash_reader

{

   string Key;

   hash_reader *next;

   string surname; //familiya imya otchestvo

   int birth_year;  //god rojdeniya

   string adress; //adress projivaniya

   string job;  //mesto raboti/uchebi

};

void readers_menu();

hash_reader *hash_table_r[hash_table_size];

bool find_reader(string Key, hash_reader *hash_table_r[hash_table_size], hash_reader* &request);

void SearchByBookcode(book_rotation *Thead, int Key);

void SearchBySNM(string snmrequest);

void delete_hash_table_r(hash_reader *hash_table_r[hash_table_size]);

TreeNode* DeleteTree(TreeNode* root);

///////////////////MAIN MENU ////////////////////////////

void main_menu();

int main()

{

   root=NULL;

   while(1) main_menu();

   return 1;

}

void main_menu()

{

   int a_num;

   cout<<"MAIN MENU"<<endl;

   cout<<"1 - Manage Books"<<endl;

   cout<<"2 - Manage Readers"<<endl;

   cout<<"3 - Manage Books Rotation"<<endl;

   cout<<"Input action N:\n"<<endl;

   do

       {

           cin>>a_num;

       }

   while(((a_num< 0)&&(a_num>9))) ;

if(a_num==1) books_menu();

if(a_num==2) readers_menu();

if(a_num==3) rotation_menu();

return;

}

///////////////////////////BOOKS//////////////////////

void books_menu()

{                                                                              //  MENU

   int a_num;

   cout<<"BOOKS MENU\n";

   cout<<"1-Add new Book\n";

   cout<<"2-Search for Book by BookCode\n";

   cout<<"3-Search for Book by Author\n";

   cout<<"4-Delete Book\n";

   cout<<"5-View Books List\n";

   cout<<"0-MAIN MENU\n\n";

   cout<<"Choose your destiny:\n";

   do

       {

       cin>>a_num;

       }

   while(((a_num<0)&&(a_num>9))) ;

   if(a_num==1)

       {

           root = add(root);

           root = obhod(root);

           books_menu();

       }

   if(a_num==2)

       {

           unsigned long sitem;

           TreeNode *tempt;

           sitem = van();

           tempt = search(root, sitem);

           cout<<"///////////////////////////////\n";

           cout<<"Reader Tickets\n"<<endl;

           SearchByBookcode(Thead, tempt->bookcode);

           cout<<"\n///////////////////////////////\n";

           getchar();

           books_menu();

       }

   if(a_num==3)

       {

           book_search_author(root);

           getchar();

           books_menu();

       }

   if(a_num==4)

       {

           root = deleten(root);

           root = obhod(root);

           books_menu();

       }

   if(a_num==5)

       {

           cout<<"//////////[Books List]//////////"<<endl;

           list(root);

           getchar();

           books_menu();

       }

      if(a_num== 6)

       {

           root = DeleteTree(root);

           books_menu();

       }

   if(a_num==0) return;

}

void src(TreeNode* root)

{

   unsigned long sitem;

   cout<<"////////////////[Book Search Window]////////////"<<endl;

   sitem = van();

   search(root,sitem);

   getchar();

}

TreeNode* search(TreeNode* root, unsigned long sitem)                                         //     SEARCH

{

TreeNode *tec;

steps=0;

   if(!(root==NULL))

   {

       cout<<"////////////////////////////////////////////////"<<endl;

       cout<<"Search for: ";

       cout<<nback(sitem)<<endl;

       tec=root;

       while(1)

       {

           if(tec->bookcode==sitem)

               {

                   cout<<endl<<"Book found: ";

                   cout<<nback(tec->bookcode)<<endl<<endl;

                   cout<<"Authors:            "<<tec->authors<<endl;

                   cout<<"Title:              "<<tec->title<<endl;

                   cout<<"Publisher:          "<<tec->publisher<<endl;

                   cout<<"Release date:       "<<tec->rdate<<endl;

                   cout<<"Total Quantiry:     "<<tec->quantity<<endl;

                   cout<<"Quantity Available: "<<tec->quantitys<<endl;

                   cout<<"////////////////////////////////////////////////"<<endl<<endl;

                   return tec;

               }

           if(tec->bookcode<sitem)

                   {

                   if (tec->right==NULL)

                       {

                           cout<<"No Such Book"<<endl;

                           return 0;

                       }

    else

                       {

                           tec=tec->right;

                           steps++;

                       }

                   }

       else

 {

           if (tec->left==NULL)

    {

                       cout<<"No Such Book"<<endl;

                       return 0;

    }

    else

    {

    tec=tec->left;

    steps++;

    }

 }

}

}

else

   {

       cout<<"/////////[Books List is Empty]/////////"<<endl;

       return NULL;

   }

}

unsigned long int van()

{                                                                                    //      KEY INPUT

unsigned long outk;

unsigned int num;

unsigned int block;

cout<<"Enter Block Code (123): "<<endl;

do

 {

           cin>>block;

 }

   while(num > 999&&num<0) ;

cout<<"Enter Book Number(123)"<<endl;

do

 {

           cin>>num;

 }

while(num > 999&&num<0) ;

outk=0;

outk=(block*1000)+num;

   return outk;

}

TreeNode* add(TreeNode* root)

{

char tmpr[49];

char tmpr1[256];

char tmpr2[256];                                                                             //         ADD

TreeNode *tec, *nov, *par;

unsigned long item;

char authors[50];

char title[50];

char publisher[30];

int rdate;

int quantity;

cout<<"/////////[ NEW TRIP ADD ]/////////"<<endl;

par=root;

item=van();

cout<<"Enter Authors(50ch max)  :"<<endl;

cin.ignore();

cin.getline(authors, 50);

cout<<"Enter Title(30ch max)    :"<<endl;

cin.getline(title, 50);

cout<<"Enter Publisher(30ch max):"<<endl;

cin.getline(publisher, 50);

cout<<"Enter Release Year(xxxx) :"<<endl;

cin>>rdate;

cout<<"Enter Quantity           :"<<endl;

cin>>quantity;

tec=root;

nov=new(TreeNode);

nov->bookcode=item;

nov->bal=0;

nov->left=NULL;

nov->right=NULL;

strcpy(nov->authors,authors);

strcpy(nov->title,title);

strcpy(nov->publisher,publisher);

nov->rdate=rdate;

nov->quantity=quantity;

nov->quantitys=quantity;

nov->parent=NULL;

if((tec==NULL))

{

       root=nov;

       root->parent=NULL;

       root->bal=0;

       return root;

}

else

while(1)

{

{

       if(tec->bookcode==item)

           {

               cout<<"Data already exist.Re-wrighting."<<endl;

               strcpy(tec->authors,nov->authors);

               strcpy(tec->title,nov->title);

               strcpy(tec->publisher,nov->publisher);

               tec->rdate=nov->rdate;

               nov->quantity=quantity;

               return root;

           }

       else

           {

               if(tec->bookcode<item)

                   {

                       if ((tec->right==NULL))

                           {

                               tec->right=nov;

                               nov->parent=par;

                               node_kol++;

                               return root;

                           }

                       else

                           {

                               tec=tec->right;

                               par=tec;

                           }

                   }

               else

                   {

                       if (tec->left==NULL)

                           {

                               tec->left=nov;

                               nov->parent=par;

                               node_kol++;

                               return root;

                           }

                       else

                           {

                               tec=tec->left;

                               par=tec;

                           }

                   }

           }

}

}

}

TreeNode* balance(TreeNode* root, int dir)                                          //      BALANCE

{

   getchar();

   if (dir==1) root=SRR(root);

   if (dir==2) root=SLR(root);

   if (dir==3) root=BRR(root);

   if (dir==4) root=BLR(root);

   getchar();

   return root;

}

TreeNode* SLR(TreeNode* root)

{

   TreeNode* t1;

   TreeNode* t2;

   t1=root->right;

   t2=t1->right;

   if (root->parent !=NULL) t1->parent = root->parent; else t1->parent = NULL;

   if (t1->left!=NULL) root->right=t1->left; else root->right=NULL;

   t1->left=root;

   t1->right=t2;

   t2->parent=t1;

   if (root->parent!=NULL)

       {

           t2=root->parent;

           if(t2->left ==  root) t2 -> left=t1 ;

           if(t2->right  ==  root) t2 -> right=t1 ;

       }

   root->parent=t1;

   if(root->right!=NULL)

       {

           t2=root->right;

           t2->parent = root;

       }

   t1=obhod(t1);

   getchar();

   return t1;

}

TreeNode* SRR(TreeNode* root)

{

   TreeNode* t1;

   TreeNode* t2;

   t1=root->left;

   t2=t1->left;

   if (root->parent !=NULL) t1->parent = root->parent; else t1->parent = NULL;

   if (t1->right!=NULL) root->left=t1->right; else root->left=NULL;

   t1->right=root;

   t1->left=t2;

   t2->parent=t1;

   cout<<"111";

   if (root->parent!=NULL)

       {

           t2=root->parent;

           if(t2->right ==  root) t2 -> right=t1 ;

           if(t2->left  ==  root) t2 -> left=t1 ;

       }

   root->parent=t1;

   if(root->left!=NULL)

       {

           t2=root->left;

           t2->parent = root;

       }

   t1=obhod(t1);

   getchar();

   return t1;

}

TreeNode* BRR(TreeNode* root)

{

TreeNode* t1;

TreeNode* t2;

TreeNode* t3;

t1=root->left;

t2=t1->right;

t2->parent=root->parent;

if (t2->right!=NULL) root->left=t2->right; else root->left=NULL;

if (t2->left!=NULL) t1 -> right=t2->left; else t1->right=NULL;

t2->left=t1;

t1->parent=t2;

t2->right=root;

root->parent=t2;

if(t1->right!=NULL)

{

       t3=t1->right;

       t3->parent = t1;

}

if (root->left!=NULL)

{

       t3=root->left;

       t3->parent=root;

}

if(t2->parent!=NULL)

{

       t3=t2->parent;

       if(t3->right ==  root) t3 -> right=t2 ;

       if(t3->left  ==  root) t3 -> left=t2 ;

}

getchar();

t2=obhod(t2);

return t2;

}

TreeNode* BLR(TreeNode* root)

{

{

TreeNode* t1;

TreeNode* t2;

TreeNode* t3;

t1=root->right;

t2=t1->left;

t2->parent=root->parent;

if (t2->left!=NULL) root->right=t2->left; else root->right=NULL;

if (t2->right!=NULL) t1 -> left=t2->right; else t1->left=NULL;

t2->right=t1;

t1->parent=t2;

t2->left=root;

root->parent=t2;

if(t1->left!=NULL)

{

       t3=t1->left;

       t3->parent = t1;

}

if (root->right!=NULL)

{

       t3=root->right;

       t3->parent=root;

}

if(t2->parent!=NULL)

{

       t3=t2->parent;

       if(t3->left ==  root) t3 -> left=t2 ;

       if(t3->right  ==  root) t3 -> right=t2 ;

}

getchar();

t2=obhod(t2);

return t2;

}

}

TreeNode* obhod(TreeNode* root)

{                                                                                            //          OBHOD

   if (root != NULL)

       {

           obhod(root->left);

           obhod(root->right);

           cout<<nback(root->bookcode)<<endl;

           if ((root->left != 0) || (root->right!=0))

               {

               unsigned long l,r;

               TreeNode* t1;

               TreeNode* t2;

               if (root->left != NULL)  t1=root->left;   else t1=NULL;

               if (root->right != NULL) t2=root->right;  else t2=NULL;

               if (t1 != NULL) l=t1->deep; else l=0;

               if (t2 != NULL) r=t2->deep; else r=0;

               if (l>r)root->deep=l+1; else root->deep=r+1;

               cout<<"Deep "<<root->deep<<"HLeft = "<< l<<"HRight = "<<r<<endl;

               if ((l-r)==2)       //     MRR

                   {

                       int  k1,k2;

                       if (t1->left  != NULL) k1 = t1->left ->deep; else k1=0;

                       if (t1->right != NULL) k2 = t1->right->deep; else k2=0;

                       if (k1 >= k2)

                           {

                               root=balance(root,1);

                               return root;

                           }

                   }

               if ((l-r)==2)        //      BRR

                   {

                       int  k1,k2;

                       if (t1->left  != NULL) k1 = t1->left ->deep; else k1=0;

                       if (t1->right != NULL) k2 = t1->right->deep; else k2=0;

                       if(k2>k1)

                           {

                              root=balance(root,3);

                               return root;

                           }

                   }

               if ((r-l)==2)    //MLR

                   {

                       int  k1,k2;

                       if (t2->left  != NULL) k1 = t2->left ->deep; else k1=0;

                       if (t2->right != NULL) k2 = t2->right->deep; else k2=0;

                       if(k1 <= k2)

                           {

                               cout<<"MLR"<<endl;

                               root=balance(root,2);

                               return root;

                           }

                   }

               if ((r-l)==2)    //BLR

                   {

                       int k1,k2;

                       if (t2->left  != NULL) k1 = t2->left ->deep; else k1=0;

                       if (t2->right != NULL) k2 = t2->right->deep; else k2=0;

                       if(k1 > k2)

                           {

                               root=balance(root,4);

                               return root;

                           }

                   }

               return root;

               }

           else root->deep=1;

           }

return root;

}

TreeNode* deleten(TreeNode* root)

{                                                                                                 //  DELETE

unsigned long sitem;

sitem = van();

root=del(root,sitem);

root=obhod(root);

return root;

}

TreeNode* del(TreeNode* root, unsigned long dele)

{

TreeNode *dtec ,*dtemp, *dtemp1;

cout<<"/////////[ Deleting Book ]/////////"<<endl;

dtec=search(root,dele);

if (dtec==NULL) return root;

cout<<"/////////[    Deleting   ]/////////"<<endl;

getchar();

if(dtec!=NULL)

{

if(dtec->parent != NULL)

 {

 if ((dtec->left == NULL) && (dtec->right != NULL))

  {

      getchar();

               dtemp = dtec->parent;

               dtemp ->right=dtec->right;

               dtemp1 = dtec->right;

               dtemp1->parent=dtemp;

               delete(dtec);

               return root;

  }

 if ((dtec->left == NULL) && (dtec->right == NULL))

  {

               getchar();

               dtemp=dtec->parent;

                   if (dtec->bookcode >dtemp->bookcode)

                       {

                           dtemp->right=NULL;

                       }

                   else

                       {

                           dtemp->left=NULL;

                       }

               delete(dtec);

               return root;

  }

 if ((dtec->left != NULL) && (dtec->right == NULL))

  {

               dtemp = dtec->parent;

               dtemp ->left=dtec->left;

               dtemp1 = dtec->left;

               dtemp1->parent=dtemp;

               delete(dtec);

               return root ;

  }

 if ((dtec->left != NULL) && (dtec->right != NULL))

  {

               dtemp=dtec;

                   while(dtemp->right!=NULL)

                       {

                           dtemp=dtemp->right;

                       }

               dtec->bookcode=dtemp->bookcode;

               dtemp = del(dtemp, dtemp->bookcode);

               return root;

  }

      }

else

{

if ((dtec->left == NULL) && (dtec->right == NULL))

 {

           root = NULL;

           getchar();

           delete(dtec);

           return root;

 }

   else

 {

           getchar();

               if((dtec->left==NULL) && (dtec->right!=NULL))

                   {

                       getchar();

                       dtemp=dtec;

                       dtemp=dtec->right;

                       while (dtemp->left!=NULL)

                           {

                               dtemp=dtemp->left;

                           }

                       getchar();

               if(dtec->right!=dtemp)

                   {

                       dtemp1=dtemp->parent;

                       if (dtemp->right!= NULL)

                           {

                               dtemp1->left=dtemp->right;

                               dtemp1=dtemp->right;

                               dtemp1->parent=dtemp->parent;

                           }

                       else dtemp1->left=NULL;

                       dtemp->right=dtec->right;

                       dtemp1=dtec->right;

                       dtemp1->parent=dtemp;

                       dtemp->parent=NULL;

                       delete(dtec);

                       return dtemp;

                   }

   else

                   {

                       dtemp->parent=NULL;

                       delete(dtec);

                       return dtemp;

                   }

  }

  if((dtec->left!=NULL) && (dtec->right==NULL))

               {

                   dtemp=dtec;

                   dtemp=dtec->left;

                   while (dtemp->right!=NULL)

                       {

                           dtemp=dtemp->right;

                       }

                   getchar();

                   if(dtec->left!=dtemp)

                      {

                               dtemp1=dtemp->parent;

                               if (dtemp->left!= NULL)

                                   {

                                       dtemp1->right=dtemp->left;

                                       dtemp1=dtemp->left;

                                       dtemp1->parent=dtemp->parent;

                                   }

                               else dtemp1->right=NULL;

                               dtemp->left=dtec->left;

                               dtemp1=dtec->left;

                               dtemp1->parent=dtemp;

                               dtemp->parent=NULL;

                               delete(dtec);

                               return dtemp;

                           }

                   else

                       {

                           dtemp->parent=NULL;

                           delete(dtec);

                           return dtemp;

                       }

               }

   if((dtec->left!=NULL) && (dtec->right!=NULL))

               {

                   dtemp=dtec;

                   dtemp=dtec->left;

                   while (dtemp->right!=NULL)

                       {

                           dtemp=dtemp->right;

                       }

                   getchar();

                   if(dtec->left!=dtemp)

                    {

                           dtemp1=dtemp->parent;

                           if (dtemp->left!= NULL)

                               {

                                   dtemp1->right=dtemp->left;

                                   dtemp1=dtemp->left;

                                   dtemp1->parent=dtemp->parent;

                               }

                           else dtemp1->right=NULL;

                   dtemp->right=dtec->right;

                   dtemp1=dtec->right;

                   dtemp1->parent=dtemp;

                   dtemp->left=dtec->left;

                   dtemp1=dtec->left;

                   dtemp1->parent=dtemp;

                   dtemp->parent=NULL;

                   delete(dtec);

                   return dtemp;

   }

           else

   {

                   dtemp->parent=NULL;

                   dtemp->right=dtec->right;

                   dtemp1=dtec->right;

                   dtemp1->parent=dtemp;

                   delete(dtec);

                   return dtemp;

   }

  }

 }

}

}

else

{

   return root;

}

return root;

}

TreeNode* list(TreeNode* root)

{                                                                                             //   LISTING

   if(root != NULL)

       {

           list(root->left);

           nback(root->bookcode);

           cout<<endl;

           cout<<"Author             : "<<root->authors<<endl;

           cout<<"Title              : "<<root->title<<endl;

           cout<<"Publisher          : "<<root->publisher<<endl;

           cout<<"Release Year       : "<<root->rdate<<endl;

           cout<<"Quantity           : "<<root->quantity<<endl;

           cout<<"Quantity Availavle : "<<root->quantitys<<endl;

           cout<<"////////////////////////////////////////////////"<<endl;

           getchar();

           list(root->right);

       }

return root;

}

char* nback(unsigned long nbookcode)

{

   cout<<(nbookcode/1000)<<"."<<(nbookcode%1000);

   return "";

}

int txt_search(char test[30], char subin[30])

{

int i,j;

int shift[27] ={NULL};

char sub[30];

strncpy(sub, subin, strlen(subin));

sub[strlen(subin)]='\0';

for (i=0; i<=25; i++)

{

for (j=0;j < strlen(sub);j++)

 {

 if (sub[j]==i+97 || sub[j] == i+65)

  {

               shift[i]=strlen(sub)-j-1;

  }

 if (sub[j]==32)

  {

               shift[26]=strlen(sub)-j-1;

  }

 }

}

for(i=0; i <strlen(test);)

{

for(j=strlen(sub)-1 ; j >= 0; j--)

 {

 if(test[j+i] != sub[j])

  {

           int tempsrc = i;

  for (int d=0; d < strlen(sub); d++)

   {

    if(test[i+j] == sub[d])

     {

                           i=i+shift[test[i+j]-97] ;

                           break;

     }

   }

  if(i==tempsrc) i=i+strlen(sub);

  break;

  }

  for (int d=0; d < strlen(sub); d++)

   {

    if(test[i] == sub[d])

     {

                           i++;

     }

    else break;

                   return 1;

   }

 return 0;

               }

}

return 0;

}

TreeNode* book_search_author(TreeNode* root)

{

char apt[30];

cout<<"Enter Author"<<endl;

cin>>apt;

cout<<"Founded Books"<<endl;

cout<<"///////////////////////////////////////////"<<endl;

if(root != NULL)

{

list(root->left);

list(root->right);

if(txt_search(root->authors, apt))

{

cout<<"Book:          ";

nback(root->bookcode);

cout<<endl;

cout<<"Author:        "<<root->authors<<endl;

cout<<"Title:         "<<root->title<<endl;

cout<<"Publisher:     "<<root->publisher<<endl;

cout<<"Quantity  :    "<<root->quantitys<<"/"<<root->quantity<<endl;

cout<<"///////////////////////////////////////////"<<endl;

getchar();

       }

}

return root;

}

//////TICKET ROTATION/////

void rotation_menu()

{                                                                              //  MENU

   int a_num;

   cout<<"ROTATION MENU\n";

   cout<<"1 - Give Book\n";

   cout<<"2 - Return Book\n";

   cout<<"3 - View Books Rotation List\n";

   cout<<"0-MAIN MENU\n\n";

   cout<<"Choose your destiny:\n";

   do

       {

       cin>>a_num;

       }

   while(((a_num<0)&&(a_num>9))) ;

   if(a_num==1)

       {

           string user;

           TreeNode *dtemp;

           int bcode;

           hash_reader *ptr;

           cout<<"Enter Ticket num"<<endl;

           cin>>user;

           cout<<"Enter Bookcode"<<endl;

           bcode = van();

           dtemp=search(root, bcode);

            if(!find_reader(user, hash_table_r, ptr) || dtemp==0 || dtemp->quantitys < 1)

           {

               cout<<"Book, reader is not registred, or no book available";

           }

           else

           {

           Thead = give_book(user, bcode);

           dtemp->quantitys = dtemp->quantitys -1;

           }

           rotation_menu();

       }

   if(a_num==2)

       {

           string user;

           TreeNode *dtemp;

           int bcode;

           hash_reader *ptr;

           cout<<"Enter Ticket num"<<endl;

           cin>>user;

           cout<<"Enter Bookcode"<<endl;

           bcode = van();

           dtemp=search(root, bcode);

             if(!find_reader(user, hash_table_r, ptr) || dtemp==0)

           {

               cout<<"Book, reader is not registred, or book alreaday returned";

           }

           else

           {

           return_book(user, bcode);

           rotation_menu();

           dtemp->quantitys = dtemp->quantitys -1;

           }

       }

   if(a_num==3)

       {

           viev_all_books(Thead);

           rotation_menu();

       }

   if(a_num==0) main_menu();

}

void SearchByTicket(book_rotation *Thead, string Key)

{

book_rotation *tec;

tec=Thead;

if (tec!=NULL){

do

{

if (strncmp(tec->reader_ticket.c_str(),Key.c_str(),8)  == 0)

{

cout<<nback(tec->bookcode)<<endl;

}

tec=tec->next;

}

while(tec!=NULL) ;

}

}

void SearchByBookcode(book_rotation *Thead, int Key)

{

book_rotation *tec;

tec=Thead;

if (tec!=NULL){

do

{

if (tec->bookcode==Key)

{

cout<<tec->reader_ticket;

hash_reader *ptr;

if(find_reader(tec->reader_ticket, hash_table_r, ptr)){

cout<<":";

cout<<ptr->surname;

}

else

{

cout<<": User was deleted from Database";

}

}

tec=tec->next;

}

while(tec!=NULL) ;

}

}

void viev_all_books(book_rotation *Thead)

{

cout<<"BOOKS ROTATION LIST" <<endl;

book_rotation *tec;

tec=Thead;

if (tec!=NULL){

do

{

cout<<"//////////////////////////////////////////////"<<endl;

cout<<" Book Code:           ";

cout<<nback(tec->bookcode)<<endl;

if (tec->reader_ticket!="")

{

cout<<"Reader's Ticket Num: ";

cout<<tec->reader_ticket<<endl<<endl;

}

else cout<<"Book was returned"<<endl;

cout<<"Give Date:  "<<tec->gdate<<endl;

cout<<"Return Date:  "<<tec->rdate<<endl;

cout<<"//////////////////////////////////////////////"<<endl;

tec=tec->next;

}

while(tec!=NULL) ;

}

}

book_rotation* give_book(string areadersticket, int abookcode)

{

book_rotation *tec, *nov, *tec2;

tec=Thead;

tec2=Thead;

nov=new(book_rotation);

nov->reader_ticket=areadersticket;

nov->bookcode=abookcode;

char str[256];

SYSTEMTIME systime;

GetLocalTime(&systime);

sprintf(str, "%02d:%02d:%d", systime.wDay, systime.wMonth, systime.wYear);

nov->gdate=str;

nov->next=NULL;

nov->prev=NULL;

if (Thead==NULL)

{

    cout<<"List is empty";

       return nov;

}

else

{

   if(tec->next != NULL)

       {

           cout<<tec->bookcode;

           while(tec -> bookcode <= abookcode && tec->next!=NULL)

               {

                   tec=tec -> next;

               }

           cout<<tec -> bookcode;

           while(tec2->next != tec)

               {

                   tec2=tec2->next;

               }

           cout<<tec2->bookcode;

           nov->next=tec;

           nov->prev=tec2;

           tec2->next=nov;

           tec->prev=nov;

           return Thead;

       }

       else

           {

               cout<<"Only 1 exist";

               tec->next=nov;

               nov->prev=tec;

               return Thead;

           }

}

}

book_rotation* return_book(string areadersticket, int abookcode)

{

book_rotation *tec, *tec2;

tec=Thead;

tec2=Thead;

while (tec != NULL)

   {

   if (tec->bookcode==abookcode && tec->reader_ticket==areadersticket)

       {

           char str[24];

           SYSTEMTIME systime;

           GetLocalTime(&systime);

           sprintf(str, "%02d:%02d:%d", systime.wDay, systime.wMonth, systime.wYear);

           tec->rdate=str;

           tec->reader_ticket = "";

           return Thead;

       }

   else

   {

   if (tec->next != NULL) tec=tec->next;

   else{

   cout<<"Record no found\n"   ;

   return Thead;

   }

   }

   }

cout<<"Record no found\n"   ;

return Thead;

}

//////////////////////READERS HASH RELEASE///////////////////

int h_reader(string key)

{

return ((int)(0.61*(23*23*23*23*23*key[0] + 23*23*23*23*key[1] + 23*key[4] /*+ key[5]*/ + 23*23*23*key[2] + 23*23*key[3]  + key[6] + key[7]))  % hash_table_size);

}

void show_reader(hash_reader *hash_table_r[hash_table_size])

{ hash_reader *ptr;

bool empty=true;

for(int i=0;i<hash_table_size;i++)

 if(hash_table_r[i] != 0)

 { ptr=hash_table_r[i];

  empty=false;

  while(ptr!=0)

  {

                   cout<<"Ticket:     ";

      for(int i=0;i<8;i++)

                   {

                       cout<<ptr->Key[i];

                   }

                   cout<<endl<<"////////////////////////////////////"<<endl;

                   cout<<"SNM:        ";

                   cout<<ptr->surname<<"\t\n";

                   cout<<"Birth year: ";

                   cout<<ptr->birth_year<<"\t\n";

                   cout<<"Address:    ";

                   cout<<ptr->adress<<"\t\n";

                   cout<<"Job:        ";

                   cout<<ptr->job<<"\t\n";

                   cout<<endl<<"////////////////////////////////////";

                   ptr=ptr->next;

  }

  cout<<endl;

 }

if(empty)

 cout<<"Empty table.\n";

}

bool find_reader(string Key, hash_reader *hash_table_r[hash_table_size], hash_reader* &request)

{ int place=h_reader(Key);

if(hash_table_r[place]==0)

{ return false;

}

hash_reader *ptr;

ptr=hash_table_r[place];

if(ptr->Key==Key)

{ request=ptr;

 return true;

}

ptr=ptr->next;

while(ptr!=0)

{ if(ptr->Key==Key)

 {

     request=ptr;

  return true;

 }

 ptr=ptr->next;

}

return false;

}

bool add_reader(string Key, string surname, int birth_year, string adress, string job, hash_reader *hash_table_r[hash_table_size])

{

   hash_reader *ptr, *ptr2;

if(find_reader(Key, hash_table_r, ptr)) return false;

int place=h_reader(Key);

ptr=new hash_reader;

ptr->Key=Key;

   ptr->surname=surname;

   ptr->birth_year=birth_year;

   ptr->adress=adress;

   ptr->job=job;

ptr->next=0;

if(hash_table_r[place]==0)

{

    hash_table_r[place]=ptr;

 return true;

}

ptr2=hash_table_r[place];

while(ptr2->next!= 0)

   ptr2=ptr2->next;

ptr2->next=ptr;

return true;

}

bool delete_reader(string Key, hash_reader *hash_table_r[hash_table_size])

{ hash_reader *ptr, *ptr2;

if(!find_reader(Key, hash_table_r, ptr))

 return false;

ptr=ptr->next;

int place=h_reader(Key);

ptr2=hash_table_r[place];

if(ptr2->Key==Key)

{ delete hash_table_r[place];

 hash_table_r[place]=ptr;

 return true;

}

while(ptr2->next!=0)

{ if(ptr2->next->Key==Key)

 { delete ptr2->next;

  ptr2->next=ptr;

  return true;

 }

 ptr2=ptr2->next;

}

return false;

}

void table_item_delete(hash_reader* &item)

{

if(item->next==0)

{ delete item;

 return;

}

else

 table_item_delete(item->next);

delete item;

}

void readers_menu()

{

string key,surname, adress, job;

   string srqt;

   int birth_year;

int choice=100500;

while(choice!=0)

{ cout<<"1 - Add a reader\n";

       cout<<"2 - Viev table of readers\n";

       cout<<"3 - Find a reader by Ticket\n";

       cout<<"4 - Delete a reader\n";

       cout<<"5 - Search by SNM fragment\n";

       cout<<"6 - Delete all readers info\n";

       cout<<"0 - Return to main menu\n";

 cin>>choice;

 switch(choice)

 {   case 1:

               char tmp[256];

               cout<<"Enter Ticket Num (ANNNN-YY):\t\n";

               cin>>key;

               cout<<"Enter Name, surname, middlename\n";

               cin.ignore();

               cin.getline(tmp, 256);

               surname=string(tmp);

               cout<<"Enter birth year\n";

               cin>>birth_year;

               if(birth_year>2011 || birth_year<1900)

               cout<<"Incorrect year\n";

               else

               {

                   cout<<"Enter address\n";

                   cin.ignore();

                   cin.getline(tmp, sizeof(tmp));

                   adress=string(tmp);

                   cout<<"Enter job\n";

                   cin.getline(tmp, sizeof(tmp));

                   job=string(tmp);

                   add_reader(key, surname, birth_year, adress, job,  hash_table_r);

               }

           break;

           case 2:

               show_reader(hash_table_r);

  break;

           case 3:

               cout<<"Enter a key:\t";

               cin>>key;

               hash_reader *ptr;

               if(!find_reader(key, hash_table_r, ptr))

                   cout<<"There is no such reader in the table.\n";

               else

               {

                   cout<<h_reader(ptr->Key)<<":\t"<<ptr->Key<<endl;

                   cout<<ptr->surname<<endl;

                   cout<<ptr->birth_year<<endl;

                   cout<<ptr->adress<<endl;

                   cout<<ptr->job<<endl;

                   cout<<"Books:"<<endl;

                   cout<<"/////////////////////////\nBooks\n";

                   SearchByTicket(Thead, ptr->Key);

                   cout<<"/////////////////////////\n";

               }

  break;

           case 4:

               cout<<"Enter a Ticket num:\t";

               cin>>key;

               if(delete_reader(key, hash_table_r))

                   cout<<"The key habe been sucsessfully deleted.\n";

               else

                   cout<<"There is no key.\n";

  break;

           case 5:

               cout<<"Enter SNM fragment\n";

               cin>>srqt;

               SearchBySNM(srqt);

           break;

           case 6:

               delete_hash_table_r(hash_table_r);

           break;

           case 0:

               return;

           default:

               cout<<"This is incorrect choise.\n";

  break;

 }

}

}

void SearchBySNM(string snmrequest)

{

   hash_reader *ptr;

for(int i=0;i<hash_table_size;i++)

 if(hash_table_r[i]!=0)

 {

           char apt[256];

           strcpy(apt,snmrequest.c_str());

     ptr=hash_table_r[i];

           cout<<"Ticket num ";

           cout<<ptr->Key<<endl;

           cout<<"SNM:       ";

           cout<<ptr->surname<<endl;

 }

}

void delete_hash_table_r(hash_reader *hash_table_r[hash_table_size])

{ hash_reader *ptr;

for(int i=0;i<hash_table_size;i++)

 if(hash_table_r[i]!=0)

 { ptr=hash_table_r[i];

  table_item_delete(ptr);

  hash_table_r[i] = 0;

 }

}

TreeNode* DeleteTree(TreeNode* root)

{                                                                                             //   LISTING

   if(root != NULL)

       {

           list(root->left);

           root=del(root,root->bookcode);

           root = obhod(root);

           books_menu();

           list(root->right);

       }

       root=NULL;

return root;

}


 

А также другие работы, которые могут Вас заинтересовать

76445. Опека и попечительства как форма семейного воспитания детей 16.24 KB
  Опекун попечитель назначается органом опеки и попечительства №48ФЗ от 24. В соответствии с Семейным и Гражданским кодексами РФ дети находящиеся под опекой попечительством имеют право на: воспитание в семье опекуна попечителя заботу с их стороны; совместное с ним проживание исключения допускаются с разрешения органа опеки и попечительства когда подопечный достиг возраста 16 лет и раздельное проживание не отразится неблагоприятно на его воспитании и защите прав и интересов; обеспечение условий для содержания воспитания...
76446. Права и обязанности опекунов и попечителей 27.96 KB
  Проживание будущего опекуна или попечителя и его потенциального подопечного по разным адресам может породить проблему выбора места установления опеки и попечительства. При этом в отдельных случаях при наличии заслуживающих внимания обстоятельств допускается установление опеки попечительства по месту проживания кандидата в опекуны и попечители например если он уже привез к себе нуждающегося в помощи гражданина либо не имеет возможности долго находиться в доме будущего подопечного. Но потом личное дело подопечного где хранится вся...
76447. Прекращение опеки и попечительства 15.01 KB
  Прекращение опеки и попечительства связаны с несколькими факторами. Не требует особого решения и прекращение попечительства при достижении подопечным 18ти лет п. Так же основаниями для прекращения попечительства над несовершеннолетними гражданами являются: эмансипация приобретение несовершеннолетним полной дееспособности до достижения им восемнадцатилетнего возраста; вступление в брак несовершеннолетним.
76448. Приемная семья (понятие, значение, приемные дети и приемные родители) 16.33 KB
  Приемная семья дает возможность максимально приблизить воспитание детейсирот и детей оставшихся без попечения родителей к реальной жизни. Она формирует у детей навыки преодоления трудных жизненных ситуаций психологическую защиту и правильное поведение при стрессах а также моральноэтическую установку на создание собственной стабильной семьи что важно и для некоторых взрослых граждан прежде всего для тех кто видит в воспитании детей свое призвание кто небезразличен к судьбе обездоленных детей и считает что у него хватит сил умения и...
76449. Договор о приемной семье 14.61 KB
  152 Семейного кодекса РФ приемной семьей признается опека или попечительство над ребенком которые осуществляются по договору о приемной семье заключаемому между органом опеки и попечительства и приемными родителемями. Так как к отношениям возникающим из договора о приемной семье применяются положения Главы 20 Семейного кодекса РФ об опеке ниже под опекуном попечителем подразумевается и приемныйе родительи. Договор о приемной семье заключается в соответствии с Правилами заключения договора об осуществлении опеки или попечительства...
76450. Основания и последствия прекращения договора приемной семье 14.86 KB
  Прекращение договора о приемной семье. При необходимости срок действия договора может быть продлен по соглашению сторон. Основанием прекращения может быть и неисполнение или ненадлежащее исполнение договора одной из сторон.
76451. Патронатная семья 24.61 KB
  Необходимо отметить, что патронатное воспитание существует ТОЛЬКО при наличии службы, профессионально занимающейся патронатным воспитанием и имеющей «качество» уполномоченной организации органа опеки и попечительства, на которую органом опеки и попечительства возложена работа по патронату.
76452. Предмет и метод семейного права 16.62 KB
  Совокупность этих отношений и составляет предмет семейного права являющегося самостоятельной отраслью российского права. Круг тех отношений которые регулируются нормами семейного права предмет семейного права определен непосредственно в законе – Семейном кодексе РФ. Статья 2 СК РФ относит к предмету семейного права установление условий и порядка вступления в брак прекращения брака и признания его недействительным; регулирование личных неимущественных и имущественных отношений между членами семьи: супругами родителями и детьми а также...
76453. Понятие семейного права 14.42 KB
  Семейный кодекс РФ гарантирует охрану семейных прав граждан запрещает чьелибо произвольное вмешательство в дела семьи прописывает правовые механизмы выполнения гражданами семейных обязанностей.