16

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

Курсовая

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

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

Русский

2012-11-14

125 KB

114 чел.

СОДЕРЖАНИЕ

Содержание           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;

}


 

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

41075. ОСНОВНІ ЕЛЕМЕНТИ ЕКОЛОГІЧНОЇ ЕКСПЕРТИЗИ 83 KB
  Загальна схема процесу екологічної експертизи Елементи процесу екологічної експертизи: доля громадськості і розгляд альтернатив Загальна схема процесу екологічної експертизи У цій лекції ми спробуємо розглянути основні елементи екологічної експертизи проектів ЕЕП.
41076. ЕКОЛОГІЧНА ЕКСПЕРТИЗА: ОСНОВНІ ПОНЯТТЯ І ПРИНЦИПИ 91.5 KB
  Поняття екологічної експертизи Загальні принципи екологічної експертизи та їх зв'язок з принципами сталого розвитку Предмет екологічної експертизи Учасники процесу екологічної експертизи
41077. Топология коммуникаций пакетов и ретрансляция кадра (Frame Relay) 285 KB
  В то же время, рост компьютерных приложений, требующих высокоскоростных коммуникаций, распространение интеллектуальных ПК и рабочих станций, доступность высокоскоростных линий передачи с низким коэффициентом ошибок — все это послужило причиной создания новой формы коммутации в территориальных сетях.
41078. Сутність та призначення систем підтримки прийняття рішень 54 KB
  Сутність та призначеннясистем підтримки прийняття рішень Системи підтримки прийняття рішень СППР виникли на початку 70х років минулого століття завдяки дальшому розвитку управлінських інформаційних систем і являють собою системи розроблені для підтримки процесів прийняття рішень менеджерами за складних слабоструктурованих умов. На розвиток СППР істотний вплив справили вражаючі досягнення в галузі інформаційних технологій зокрема поява телекомунікаційних мереж персональних комп’ютерів динамічних електронних таблиць експертних систем...
41079. Цілі СППР та чинники, що сприяють їх досягненню 55 KB
  Цілі СППР та чинникищо сприяють їх досягненню Необхідність комп’ютерної підтримки прийняття рішень в економіці та бізнесі нині зумовлена дією низки об’єктивних причин зокрема: збільшенням обсягів інформації що надходить до органів управління і безпосередньо до керівників; ускладненням завдань що розв’язуються щоденно і на перспективу; необхідністю обліку і урахування великої кількості взаємопов’язаних факторів і вимог що швидко змінюються; необхідністю зняття невизначеності пов’язаної з неможливістю кількісного вимірювання окремих...
41080. Зародження і розвиток концепції СППР 50.5 KB
  Стисла історія розвиткусистем підтримки прийняття рішень Зародження і розвиток концепції СППР Системи підтримки прийняття рішень почали розвиватися на ранніх стадіях ери розподіленого обчислення. Історія таких систем веде відлік приблизно з 1967 року і за цей час СППР пройшли значний шлях розвитку включаючи орієнтовані на моделі СППР інструментальні засоби запиту та звітування системи бізнесової інформації Business Intelligence оперативне аналітичне оброблення OLP групові СППР та виконавчі інформаційні системи. Наприкінці 60х років...
41081. Інформаційні ресурси та інформаційне обслуговування 84 KB
  Узагальнена концепція інформаційного ресурсу Особливе значення інформація як ресурс має в сучасному бізнесі оскільки будьяка ділова операція містить інформаційні компоненти і тому управління інформаційними ресурсами фірм є важливим аспектом досягнення конкурентної переваги. Керівники фірми міркували що керуючи своїми даними за допомогою комп’ютерно основаних СКБД вони насправді керували своєю інформацією. Цей процесор складається з апаратних засобів і програмного забезпечення з людей які розробляють комп’ютеризовані системи і...
41082. Сутність та етапи розвитку інформаційних технологій 378 KB
  Принципова відмінність інформаційної технології від виробничої яка являє собою сукупність способів оброблення виготовлення зміни стану властивостей форм сировини матеріалу або напівфабрикату полягає в тому що вона крім рутинних операцій містить елементи творчого характеру тобто людського фактора який не підлягає регламентації та формалізації. Інформаційні технології виникли разом із виробництвом кілька мільйонів років тому і у своєму розвитку пройшли ряд етапів. мали місце ручні інформаційні технології. На зміну механічній...
41083. Три покоління розвитку інформаційних систем 2.19 MB
  Для головних компонентів інформаційних систем даних і обчислень важливе значення має така ознака як їх надмірність. Протягом розвитку інформаційних систем організаційного типу структура і надмірність даних та процедури обчислень значно змінювалися що було критеріями для виділення поколінь цих систем. В інформаційних системах першого покоління які в зарубіжній літературі відомі під назвою Dt Processing System DPS системи оброблення даних синоніми електронне оброблення даних системи електронного оброблення даних а у...