16

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

Курсовая

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

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

Русский

2012-11-14

125 KB

106 чел.

СОДЕРЖАНИЕ

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

}


 

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

37180. Возникновение бюджета 30 KB
  По экономической сущности государственный бюджет это денежные отношения возникающие у государства с юридическими и физическими лицами по поводу распределения национального дохода в связи с образованием и использованием бюджетного фонда предназначенного для финансирования экономики социальнокультурных мероприятий нужд обороны и государственного управления. Благодаря ей можно прогнозировать социальноэкономические последствия бюджетной политики. Бюджет играет важную экономическую социальную и политическую роль в воспроизводственном...
37181. Бюджетное устройство 90.5 KB
  Бюджетная система унитарного государства состоит из двух звеньев – государственного и местных бюджетов. Бюджетная система федеративных госуда рств тр ехзвенная и состоит из федеративного федерального бюджета бюджетов членов субъектов федерации и местных бюджетов. Бюджетный кодекс РФ далее БК РФ даёт следующее определение бюджетной системы: Основанная на экономических отношениях и государственном устройстве РФ регулируемая нормами права совокупность федерального бюджета бюджетов субъектов РФ местных бюджетов и бюджетов государственных...
37182. Право регулирования денежного обращение страны 92.5 KB
  Главными задачами правового регулирования денежного обращения в России являются: обеспечение четкого разделения правовых полномочий и ответственности в сфере денежного обращения между Президентом РФ законодательной и исполнительной властями; поддержание необходимого темпа роста денежной массы в обращении и правильного соотношения между наличным и безналичным денежным обращением с целью стабильного и эффективного функционирования экономики страны; обеспечение законодательной и исполнительной власти правовыми нормами и инструментами...
37183. Денежно – кредитная политика 86 KB
  Согласно комментариям к федеральному закону О Центральном банке Российской Федерации Банка России денежно – кредитная политика определяется как основная часть единой государственной экономической политики проявляющаяся в воздействии на количество денег в обращении с целью достижения стабильности цен обеспечения максимально возможной занятости населения а также роста реального объёма производства. В отличие от первого определения второе подчёркивает возможность влияния денежно – кредитной политики не только на сферу обращения но и...
37184. Современные коммерческие банки 34.5 KB
  Коммерческие банки выступают основным звеном банковской системы. Независимо от формы собственности коммерческие банки являются самостоятельными субъектами экономики. Таким образом коммерческие банки осуществляют должны осуществлять комплексное обслуживание клиентов что отличает их от специальных кредитных организаций небанковского типа выполняющих ограниченный круг финансовых операций и услуг.
37185. Денежная система 44.5 KB
  В зависимости от вида денег деньги как товар выполняющий роль всеобщего эквивалента или деньги как знак стоимости различают денежные системы двух типов:1 система металлического обращения которая базируется на действительных деньгах серебро золото выполняющих все пять функций а образующиеся банкноты беспрепятственно обмениваются на действительные деньги;2 система бумажнокредитного обращения при которой действительные деньги вытесняются знаками стоимости а в обращении находятся бумажные казначейские векселя либо кредитные...
37186. Эми́ссия денег 33.5 KB
  Граница кредита предел допустимая форма. Норма выдачи кредита. Это граница ресурсов кредита т. Границы ресурсов кредита определяются размерами ссуд фонда.
37187. Денежная масса 93.5 KB
  Вместе с тем денежная масса включает в себя такие компоненты которые нельзя непосредственно использовать как покупательное или платежное средство. Как правило денежная политика страны выходящей из политического или экономического кризиса начинается с восстановления доверия населения путем индексации таких “замороженных вкладов†и привлечения таким образом средств для оживления инвестиционной активности в экономике. Чаще всего используют следующие агрегаты[1]: М0 = наличные деньги в обращении М1 = М0 чеки вклады до востребования...
37188. Инфляция и причины ее возникновения 35.5 KB
  Инфляция связана с “заболеванием†денег но причины инфляции очень глубинные. Инфляция – это обесценение денег всвязи с нарушением закона денежного обращения. инфляция – вздутие т.