Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа.doc
Скачиваний:
56
Добавлен:
01.05.2014
Размер:
939.01 Кб
Скачать

Концептуальная модель данных. Er-диаграмма.

Библиотека

Дополнитель-ные услуги

Складские помещения

Персонал

Регистратура

Формуляр

Книга

Периодическая литература

Клиент

Читальный зал

Аттрибуты книги и студента.

Книга:

Название, Фамилия, Имя, Отчество, Год издания, Издательство, Издание, Количество, Количество выданных, Номер

Студент:

Фамилия, Имя, Отчество, Год продления читательского билета, Группа, Университет, Номер

Номер является уникальным – ключевой атрибут.

// bibliotekaDlg.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "bibliotekaDlg.h"

#include "DlgProxy.h"

//

#include "MyClasses.h"

#include "card.h"

#include "mas_int.h"

#include "spisok.h"

#include "zapis.h"

#include "global_variables.h"

#include "student.h"

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <iostream.h>

#include <conio.h>

#include <malloc.h>

#include <afx.h>

#include "Afxwin.h"

#include <afxcoll.h>

#include <memory.h>

//

#include "Find_book_by_key.h"

#include "Find_book_in_student.h"

#include "Find_student_and_his_book.h"

#include "New_book.h"

#include "New_student.h"

#include "Delete_book.h"

#include "Delete_student.h"

#include "Find_student_by_key.h"

#include "Take_book.h"

#include "Bring_book.h"

#include "Change_book.h"

#include "Change_student.h"

#include "Enter_nomer_of_changed_book.h"

#include "Enter_nomer_of_changed_student.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CBibliotekaDlg dialog

IMPLEMENT_DYNAMIC(CBibliotekaDlg, CDialog);

CBibliotekaDlg::CBibliotekaDlg(CWnd* pParent /*=NULL*/)

: CDialog(CBibliotekaDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CBibliotekaDlg)

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

m_pAutoProxy = NULL;

oldMemState.Checkpoint();

}

CBibliotekaDlg::~CBibliotekaDlg()

{

// If there is an automation proxy for this dialog, set

// its back pointer to this dialog to NULL, so it knows

// the dialog has been deleted.

if (m_pAutoProxy != NULL)

m_pAutoProxy->m_pDialog = NULL;

}

void CBibliotekaDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CBibliotekaDlg)

DDX_Control(pDX, IDC_LIST1, m_books);

DDX_Control(pDX, IDC_LIST2, m_students);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CBibliotekaDlg, CDialog)

//{{AFX_MSG_MAP(CBibliotekaDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_CLOSE()

ON_BN_CLICKED(IDC_BUTTON3_find_book_by_key, OnBUTTON3findbookbykey)

ON_BN_CLICKED(IDC_BUTTON1_read_book_base, OnBUTTON1readbookbase)

ON_BN_CLICKED(IDC_BUTTON2_read_student_base, OnBUTTON2readstudentbase)

ON_BN_CLICKED(IDC_BUTTON11_find_book_in_student, OnBUTTON11findbookinstudent)

ON_BN_CLICKED(IDC_BUTTON12_find_student_with_book, OnBUTTON12findstudentwithbook)

ON_BN_CLICKED(IDC_BUTTON4_new_book, OnBUTTON4newbook)

ON_BN_CLICKED(IDC_BUTTON5_new_student, OnBUTTON5newstudent)

ON_BN_CLICKED(IDC_BUTTON6_delete_book, OnBUTTON6deletebook)

ON_BN_CLICKED(IDC_BUTTON7_delete_student, OnBUTTON7deletestudent)

ON_BN_CLICKED(IDC_BUTTON10_find_student_by_key, OnBUTTON10findstudentbykey)

ON_BN_CLICKED(IDC_BUTTON15_take_book, OnBUTTON15takebook)

ON_BN_CLICKED(IDC_BUTTON16_bring_book, OnBUTTON16bringbook)

ON_BN_CLICKED(IDC_BUTTON8_write_book_base, OnBUTTON8writebookbase)

ON_BN_CLICKED(IDC_BUTTON9_write_student_base, OnBUTTON9writestudentbase)

ON_BN_CLICKED(IDC_BUTTON13_change_book, OnBUTTON13changebook)

ON_BN_CLICKED(IDC_BUTTON14_change_student, OnBUTTON14changestudent)

ON_WM_SHOWWINDOW()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CBibliotekaDlg message handlers

BOOL CBibliotekaDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

CAboutDlg dlgAbout;

dlgAbout.DoModal();

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

}

void CBibliotekaDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CBibliotekaDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CBibliotekaDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

// Automation servers should not exit when a user closes the UI

// if a controller still holds on to one of its objects. These

// message handlers make sure that if the proxy is still in use,

// then the UI is hidden but the dialog remains around if it

// is dismissed.

void CBibliotekaDlg::ShutDown()//при выходе (запись в файлы и очистка памяти)

{

if (spis_book!=NULL)

{

lpFileName="books.txt";

hWrite=CreateFile(

lpFileName, // pointer to name of the file

GENERIC_WRITE, // access (read-write) mode

0, // share mode

NULL, // pointer to security attributes

CREATE_ALWAYS, // how to create

FILE_ATTRIBUTE_NORMAL,// file attributes

NULL // handle to file with attributes to copy

);

if (hWrite!=INVALID_HANDLE_VALUE)

{

spis_book->infile('b', hWrite);

CloseHandle( hWrite );

};

};

if (spis_stud!=NULL)

{

lpFileName="students.txt";

hWrite=CreateFile(

lpFileName, // pointer to name of the file

GENERIC_WRITE, // access (read-write) mode

0, // share mode

NULL, // pointer to security attributes

CREATE_ALWAYS, // how to create

FILE_ATTRIBUTE_NORMAL,// file attributes

NULL // handle to file with attributes to copy

);

if (hWrite!=INVALID_HANDLE_VALUE)

{

spis_stud->infile('s', hWrite);

CloseHandle( hWrite );

};

};

spis_stud=spis_stud->del_spisok();

spis_book=spis_book->del_spisok();

newMemState.Checkpoint();

if( diffMemState.Difference( oldMemState, newMemState ) )

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

_getch();

};

}

void CBibliotekaDlg::OnClose()

{

ShutDown();

if (CanExit())

CDialog::OnClose();

}

void CBibliotekaDlg::OnCancel()

{

ShutDown();

if (CanExit())

CDialog::OnCancel();

}

BOOL CBibliotekaDlg::CanExit()

{

// If the proxy object is still around, then the automation

// controller is still holding on to this application. Leave

// the dialog around, but hide its UI.

if (m_pAutoProxy != NULL)

{

ShowWindow(SW_HIDE);

return FALSE;

}

return TRUE;

}

void CBibliotekaDlg::OnBUTTON1readbookbase()//чтение из файла базы книг

{

if (spis_book==NULL)

{

lpFileName="books.txt";

hWrite=CreateFile(

lpFileName, // pointer to name of the file

GENERIC_READ, // access (read-write) mode

0, // share mode

NULL,// pointer to security attributes

OPEN_EXISTING,// how to create

FILE_ATTRIBUTE_NORMAL,// file attributes

NULL// handle to file with attributes to copy

);

if (hWrite!=INVALID_HANDLE_VALUE)

{

spis_book=spis_book->outfile('b',hWrite);

CloseHandle( hWrite );

MessageBox("База книг успешно считана!");

}

else

{MessageBox("Не существует файла базы книг!");};

}

else

{MessageBox("В памяти уже есть считанная база книг!");};

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON2readstudentbase()//чтение из файла базы студентов

{

if (spis_stud==NULL)

{

lpFileName="students.txt";

hWrite=CreateFile(

lpFileName, // pointer to name of the file

GENERIC_READ, // access (read-write) mode

0, // share mode

NULL,// pointer to security attributes

OPEN_EXISTING,// how to create

FILE_ATTRIBUTE_NORMAL,// file attributes

NULL// handle to file with attributes to copy

);

if (hWrite!=INVALID_HANDLE_VALUE)

{

spis_stud=spis_stud->outfile('s',hWrite);

CloseHandle( hWrite );

MessageBox("База студентов успешно считана!");

}

else

{MessageBox("Не существует файла базы студентов!");};

}

else

{MessageBox("В памяти уже есть считанная база студентов!");};

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON11findbookinstudent()//поиск книги у студентов

{

//проверка, что подгружены обе базы

if ((spis_stud!=NULL)&&(spis_book!=NULL))

{

Find_book_in_student dlg;

dlg.DoModal();

}

else

{MessageBox("Не существует базы книг или студентов!");};

}

void CBibliotekaDlg::OnBUTTON3findbookbykey()//поиск студентов по ключу

{

//проверка, что база уже есть

if (spis_book!=NULL)

{

Find_book_by_key dlg;

dlg.DoModal();

}

else

{MessageBox("Не существует базы книг!");};

}

void CBibliotekaDlg::OnBUTTON12findstudentwithbook()//поиск студентов по выданной книге

{

if ((spis_stud!=NULL)&&(spis_book!=NULL))

{

Find_student_and_his_book dlg;

dlg.DoModal();

}

else

{MessageBox("Не существует базы студентов или книг!");};

}

void CBibliotekaDlg::OnBUTTON4newbook() //занесение новой книги в список

{

New_book dlg;

dlg.DoModal();

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON5newstudent() //занесение нового студента в список

{

New_student dlg;

dlg.DoModal();

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON6deletebook() //удаление книги из списка книг

{

if (spis_book!=NULL)

{

Delete_book dlg;

dlg.DoModal();

}

else

{MessageBox("Не существует базы книг!");};

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON7deletestudent() //удаление студента из списка студентов

{

if (spis_stud!=NULL)

{

Delete_student dlg;

dlg.DoModal();

}

else

{MessageBox("Не существует базы студентов!");};

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON10findstudentbykey()//поиск книги по ключу

{

if (spis_stud!=NULL)

{

Find_student_by_key dlg;

dlg.DoModal();

}

else

{MessageBox("Не существует базы студентов!");};

}

void CBibliotekaDlg::OnBUTTON15takebook()//взять книгу

{

if ((spis_stud!=NULL)&&(spis_book!=NULL))

{

Take_book dlg;

dlg.DoModal();

}

else

{MessageBox("Не существует базы книг или студентов!");};

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON16bringbook()//выдать книгу

{

if ((spis_stud!=NULL)&&(spis_book!=NULL))

{

Bring_book dlg;

dlg.DoModal();

}

else

{MessageBox("Не существует базы книг или студентов!");};

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON8writebookbase()//запись в файл базы книг

{

if (spis_book!=NULL)

{

lpFileName="books.txt";

hWrite=CreateFile(

lpFileName, // pointer to name of the file

GENERIC_WRITE, // access (read-write) mode

0, // share mode

NULL, // pointer to security attributes

CREATE_ALWAYS, // how to create

FILE_ATTRIBUTE_NORMAL,// file attributes

NULL // handle to file with attributes to copy

);

if (hWrite!=INVALID_HANDLE_VALUE)

{

spis_book->infile('b', hWrite);

CloseHandle( hWrite );

MessageBox("База книг успешно записана!");

}

else

{MessageBox("Невозможно записать базу книг!");};

}

else

{MessageBox("База книг не подгружена!!!");};

}

void CBibliotekaDlg::OnBUTTON9writestudentbase() //запись в файл базы студентов

{

if (spis_stud!=NULL)

{

lpFileName="students.txt";

hWrite=CreateFile(

lpFileName, // pointer to name of the file

GENERIC_WRITE, // access (read-write) mode

0, // share mode

NULL, // pointer to security attributes

CREATE_ALWAYS, // how to create

FILE_ATTRIBUTE_NORMAL,// file attributes

NULL // handle to file with attributes to copy

);

if (hWrite!=INVALID_HANDLE_VALUE)

{

spis_stud->infile('s', hWrite);

CloseHandle( hWrite );

MessageBox("База студентов успешно записана!");

}

else

{MessageBox("Невозможно записать базу студентов!");};

}

else

{MessageBox("База студентов не подгружена!!!");};

}

void CBibliotekaDlg::OnBUTTON13changebook() //изменение параметров книги

{

if (spis_book!=NULL)

{ //найти книгу

Enter_nomer_of_changed_book dlg;

dlg.DoModal();

if (kniga!=NULL)

{

CChange_book dlg;

dlg.DoModal();

};

}

else

{MessageBox("Не существует базы книг!");};

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnBUTTON14changestudent() //изменение параметров студента

{

if (spis_stud!=NULL)

{

Enter_nomer_of_changed_student dlg;//найти студента

dlg.DoModal();

if (stud!=NULL)

{

CChange_student dlg;

dlg.DoModal();

};

}

else

{MessageBox("Не существует базы студентов!");};

this->OnShowWindow(true,NULL);

}

void CBibliotekaDlg::OnShowWindow(BOOL bShow, UINT nStatus) //печать текущего списка студентов и книг

{

//CDialog::OnShowWindow(bShow, nStatus);

m_students.ResetContent();

m_books.ResetContent();

m_books.SetHorizontalExtent(1000);

m_students.SetHorizontalExtent(1000);

if (spis_stud!=NULL)

{

CString s;

spisok* temp=spis_stud;

while (temp!=NULL)

{ //

stud=((student*)(temp->spelt()));

s="Номер билета: "+myconv(stud->outnomzap())+" Фамилия: "

+stud->out_familia()+" Имя: "+stud->out_imia()

+" Отчество: "+stud->out_otchestvo()+" Университет: "

+stud->out_univer()+" Группа: "+myconv(stud->out_gruppa())

+" Продлен : "+myconv(stud->out_prodlen());

m_students.AddString(s);

temp=temp->spnext();

};

}

else

{

m_students.AddString("Нет базы со студентами");

};

if (spis_book!=NULL)

{

CString s;

spisok* temp=spis_book;

while (temp!=NULL)

{

kniga=((card*)(temp->spelt()));

s="Номер книги: "+myconv(kniga->outnomzap())+" Название: "

+kniga->out_nazvanie()+" Автор: "+kniga->out_familia()

+" "+kniga->out_imia()+" "+kniga->out_otchestvo()

+" Издательство: "+kniga->out_izdv()+" Издание: "

+myconv(kniga->out_izdn())+" Тема: "+kniga->out_tema()

+" Год: "+myconv(kniga->out_year())+" В наличии: "

+myconv(kniga->out_kol()-kniga->out_vid());

m_books.AddString(s);

temp=temp->spnext();

};

}

else

{m_books.AddString("Нет базы с книгами");}

}

// Bring_book.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Bring_book.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// Bring_book dialog

Bring_book::Bring_book(CWnd* pParent /*=NULL*/)

: CDialog(Bring_book::IDD, pParent)

{

//{{AFX_DATA_INIT(Bring_book)

m_nomer_of_book = _T("");

m_nomer_of_student = _T("");

//}}AFX_DATA_INIT

}

void Bring_book::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Bring_book)

DDX_Text(pDX, IDC_EDIT1_nomer_of_book, m_nomer_of_book);

DDV_MaxChars(pDX, m_nomer_of_book, 6);

DDX_Text(pDX, IDC_EDIT9_nomer_of_student, m_nomer_of_student);

DDV_MaxChars(pDX, m_nomer_of_student, 6);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Bring_book, CDialog)

//{{AFX_MSG_MAP(Bring_book)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// Bring_book message handlers

void Bring_book::OnOK()

{

UpdateData(true);

bool Ok=true;

stud=NULL;

kniga=NULL;

if ((m_nomer_of_book=="")||

(m_nomer_of_student==""))//если не ввели значение

{

MessageBox("Введите число!");

Ok=false;

}

else

{//поиск студента и книги в списках

stud = (student*)(spis_stud->find_by_num(atoi(LPCTSTR(m_nomer_of_student))));

kniga = (card*)(spis_book->find_by_num(atoi(LPCTSTR(m_nomer_of_book))));

};

if ((kniga!=NULL)&&(stud!=NULL)&&(Ok))//если нашли

{

try{bring(kniga, stud);}//пытаемся выдать

catch(student::Err_bring z)//при исключении (студент)

{

switch (z.b)

{

case 1:

{

MessageBox("У студента не продлен читательский!");

break;

};

case 2:

{

MessageBox("У студента уже есть такая книга!");

break;

};

};

Ok=false;

}

catch(card::Err_bring z)//при исключении (книга)

{

MessageBox("Все книги выданы!");

Ok=false;

};

}

else//если нет студента или книги

{

if (Ok) {MessageBox("Несуществует студент или книга с таким номером!");};

Ok=false;

};

if (Ok) {CDialog::OnOK();};

}

void Bring_book::OnCancel()

{

CDialog::OnCancel();

}

// Change_book.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Change_book.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CChange_book dialog

CChange_book::CChange_book(CWnd* pParent /*=NULL*/)

: CDialog(CChange_book::IDD, pParent)

{

//{{AFX_DATA_INIT(CChange_book)

m_name_of_book = _T(kniga->out_nazvanie());

m_familia = _T(kniga->out_familia());

m_imia = _T(kniga->out_imia());

m_otchestvo = _T(kniga->out_otchestvo());

m_izdatelstvo = _T(kniga->out_izdv());

m_tema = _T(kniga->out_tema());

m_izdanie = _T(myconv(kniga->out_izdn()));

m_year = _T(myconv(kniga->out_year()));

m_kol_of_book = _T(myconv(kniga->out_kol()));

m_nomer = _T(myconv(kniga->outnomzap()));

//}}AFX_DATA_INIT

}

void CChange_book::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CChange_book)

DDX_Text(pDX, IDC_EDIT1_name_of_book, m_name_of_book);

DDV_MaxChars(pDX, m_name_of_book, 20);

DDX_Text(pDX, IDC_EDIT2_familia, m_familia);

DDV_MaxChars(pDX, m_familia, 20);

DDX_Text(pDX, IDC_EDIT3_imia, m_imia);

DDV_MaxChars(pDX, m_imia, 20);

DDX_Text(pDX, IDC_EDIT4_otchestvo, m_otchestvo);

DDV_MaxChars(pDX, m_otchestvo, 20);

DDX_Text(pDX, IDC_EDIT6_izdatelstvo, m_izdatelstvo);

DDV_MaxChars(pDX, m_izdatelstvo, 20);

DDX_Text(pDX, IDC_EDIT8_tema, m_tema);

DDV_MaxChars(pDX, m_tema, 20);

DDX_Text(pDX, IDC_EDIT10_izdanie, m_izdanie);

DDV_MaxChars(pDX, m_izdanie, 6);

DDX_Text(pDX, IDC_EDIT5_year, m_year);

DDV_MaxChars(pDX, m_year, 6);

DDX_Text(pDX, IDC_EDIT7_kol_of_book, m_kol_of_book);

DDV_MaxChars(pDX, m_kol_of_book, 6);

DDX_Text(pDX, IDC_EDIT8_nomer, m_nomer);

DDV_MaxChars(pDX, m_nomer, 10);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CChange_book, CDialog)

//{{AFX_MSG_MAP(CChange_book)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CChange_book message handlers

void CChange_book::OnOK()

{

UpdateData(true);

bool Ok=true;

if ((m_name_of_book=="")||//если не ввели все параметры

(m_familia=="")||

(m_imia=="")||

(m_otchestvo=="")||

(m_year=="")||

(m_izdatelstvo=="")||

(m_izdanie=="")||

(m_kol_of_book=="")||

(m_tema=="")||

(m_nomer==""))

{

MessageBox("Введите значения во все поля!");

Ok=false;

}

else//иначе занесение новых параметров

{

kniga->in_nazvanie(m_name_of_book);

kniga->in_author(m_familia,m_imia,m_otchestvo);

kniga->in_year(atoi(LPCTSTR(m_year)));

kniga->in_izdv(m_izdatelstvo);

kniga->in_izdn(atoi(LPCTSTR(m_izdanie)));

if (atoi(LPCTSTR(m_kol_of_book))-kniga->out_vid()>=0)//если количество больше

{ //чем кол-во выданных

kniga->inkol(atoi(LPCTSTR(m_kol_of_book)));

}

else//иначе

{

MessageBox("Количество книг должно быть не менее "+myconv(kniga->out_vid())+" !");

Ok=false;

};

kniga->in_tema(m_tema);

if (kniga->outnomzap()!=atoi(LPCTSTR(m_nomer)))//если был изменен номер книги

{

card* temp=NULL;

temp=((card*)(spis_book->find_by_num(atoi(LPCTSTR(m_nomer)))));//поиск книги с новым номером

if (temp==NULL)//если нет

{

spisok* tempspis=NULL;

tempspis=spis_stud->find('k',myconv(kniga->outnomzap()));//проверка не выдана ли

if (tempspis!=NULL)//если выдана

{

MessageBox("Книга была выдана студентам!");

tempspis->del_spisok();

Ok=false;

}

else//если нет

{kniga->innomzap(atoi(LPCTSTR(m_nomer)));};

}

else//если есть

{

MessageBox("Книга с таким номером уже есть!");

Ok=false;

};

};

};

if (Ok) {CDialog::OnOK();};

}

void CChange_book::OnCancel()

{

CDialog::OnCancel();

}

// Change_student.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Change_student.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CChange_student dialog

CChange_student::CChange_student(CWnd* pParent /*=NULL*/)

: CDialog(CChange_student::IDD, pParent)

{

//{{AFX_DATA_INIT(CChange_student)

m_familia = _T(stud->out_familia());

m_imia = _T(stud->out_imia());

m_otchestvo = _T(stud->out_otchestvo());

m_university = _T(stud->out_univer());

m_nomer_of_gruppa = _T(myconv(stud->out_gruppa()));

m_prodlen = _T(myconv(stud->out_prodlen()));

m_nomer = _T(myconv(stud->outnomzap()));

//}}AFX_DATA_INIT

}

void CChange_student::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CChange_student)

DDX_Text(pDX, IDC_EDIT2_familia, m_familia);

DDV_MaxChars(pDX, m_familia, 20);

DDX_Text(pDX, IDC_EDIT3_imia, m_imia);

DDV_MaxChars(pDX, m_imia, 20);

DDX_Text(pDX, IDC_EDIT4_otchestvo, m_otchestvo);

DDV_MaxChars(pDX, m_otchestvo, 20);

DDX_Text(pDX, IDC_EDIT6_university, m_university);

DDV_MaxChars(pDX, m_university, 20);

DDX_Text(pDX, IDC_EDIT5_nomer_of_gruppa, m_nomer_of_gruppa);

DDV_MaxChars(pDX, m_nomer_of_gruppa, 6);

DDX_Text(pDX, IDC_EDIT7_prodlen, m_prodlen);

DDV_MaxChars(pDX, m_prodlen, 6);

DDX_Text(pDX, IDC_EDIT8_nomer, m_nomer);

DDV_MaxChars(pDX, m_nomer, 6);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CChange_student, CDialog)

//{{AFX_MSG_MAP(CChange_student)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CChange_student message handlers

void CChange_student::OnOK()

{

bool Ok=true;

UpdateData(true);

if ((m_university="")||//если не ввели все параметры

(m_familia=="")||

(m_imia=="")||

(m_otchestvo=="")||

(m_prodlen=="")||

(m_nomer_of_gruppa=="")||

(m_nomer==""))

{

MessageBox("Введите значения во все поля!");

Ok=false;

}

else//иначе

{

stud->in_FIO(m_familia,m_imia,m_otchestvo);

stud->in_univer(m_university);

stud->in_gruppa(atoi(LPCTSTR(m_nomer_of_gruppa)));

if ((stud->Knigi==NULL)&&(Ok))//если нет выданных книг

{

if (atoi(LPCTSTR(m_prodlen))>tektime.GetYear())//проверка на корректную дату

{

MessageBox("Некорректная дата продления!");

Ok=false;

}

else

{stud->in_prodlen(tektime.GetYear());};//продление читательского

}

else//если есть

{

if (stud->out_prodlen()!=atoi(LPCTSTR(m_prodlen)))//если изменена дата продления

{

MessageBox("У студента есть книги - не продлить!");

Ok=false;

};

};

if (stud->outnomzap()!=atoi(LPCTSTR(m_nomer)))//если изменили номер студента

{

student* temp=NULL;

temp=((student*)(spis_stud->find_by_num(atoi(LPCTSTR(m_nomer)))));//поиск студента с таким номером в списке

if (temp==NULL)//если нет

{

stud->innomzap(atoi(LPCTSTR(m_nomer)));//изменение номера

}

else//иначе

{

MessageBox("Студент с таким номером уже есть!");

Ok=false;

};

};

};

if (Ok) {CDialog::OnOK();};

}

// Delete_book.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Delete_book.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// Delete_book dialog

Delete_book::Delete_book(CWnd* pParent /*=NULL*/)

: CDialog(Delete_book::IDD, pParent)

{

//{{AFX_DATA_INIT(Delete_book)

m_nomer = _T("1");

//}}AFX_DATA_INIT

}

void Delete_book::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Delete_book)

DDX_Text(pDX, IDC_EDIT1_nomer, m_nomer);

DDV_MaxChars(pDX, m_nomer, 6);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Delete_book, CDialog)

//{{AFX_MSG_MAP(Delete_book)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// Delete_book message handlers

void Delete_book::OnOK()

{

bool del=true;

UpdateData(true);

if (m_nomer=="")//если не ввели все параметры

{

MessageBox("Введите значение в поле!");

del=false;

}

else//иначе

{

try{spis_book=spis_book->del_elt('b',atoi(LPCTSTR(m_nomer)));}//пытаемся удалить

catch(spisok::Err_del z)//при исключении

{

del=false;

switch (z.d)

{

case 1:

{

MessageBox("Книга выдана студентам!");

break;

};

case 2:

{

MessageBox("Нет списка книг!");

break;

};

case 3:

{

MessageBox("Нет книги с таким номером!!!");

break;

};

};

};

};

if (del) {CDialog::OnOK();};

}

void Delete_book::OnCancel()

{

CDialog::OnCancel();

}

// Delete_student.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Delete_student.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// Delete_student dialog

Delete_student::Delete_student(CWnd* pParent /*=NULL*/)

: CDialog(Delete_student::IDD, pParent)

{

//{{AFX_DATA_INIT(Delete_student)

m_nomer = _T("1");

//}}AFX_DATA_INIT

}

void Delete_student::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Delete_student)

DDX_Text(pDX, IDC_EDIT1_nomer, m_nomer);

DDV_MaxChars(pDX, m_nomer, 6);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Delete_student, CDialog)

//{{AFX_MSG_MAP(Delete_student)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// Delete_student message handlers

void Delete_student::OnCancel()

{

// TODO: Add extra cleanup here

CDialog::OnCancel();

}

void Delete_student::OnOK()

{

bool del=true;

UpdateData(true);

if (m_nomer=="")//если не ввели все параметры

{

MessageBox("Введите значение в поле!");

del=false;

}

else//иначе

{

try{spis_stud=spis_stud->del_elt('s',atoi(LPCTSTR(m_nomer)));}//пытаемся удалить

catch(spisok::Err_del z)//при исключении

{

del=false;

switch (z.d)

{

case 1:

{

MessageBox("У студента есть книги!");

break;

};

case 2:

{

MessageBox("Нет списка студентов!");

break;

};

case 3:

{

MessageBox("Нет студента с таким номером!!!");

break;

};

};

};

};

if (del) {CDialog::OnOK();};

}

// Enter_nomer_of_changed_book.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Enter_nomer_of_changed_book.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// Enter_nomer_of_changed_book dialog

Enter_nomer_of_changed_book::Enter_nomer_of_changed_book(CWnd* pParent /*=NULL*/)

: CDialog(Enter_nomer_of_changed_book::IDD, pParent)

{

//{{AFX_DATA_INIT(Enter_nomer_of_changed_book)

m_nomer = _T("1");

//}}AFX_DATA_INIT

}

void Enter_nomer_of_changed_book::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Enter_nomer_of_changed_book)

DDX_Text(pDX, IDC_EDIT1_nomer, m_nomer);

DDV_MaxChars(pDX, m_nomer, 6);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Enter_nomer_of_changed_book, CDialog)

//{{AFX_MSG_MAP(Enter_nomer_of_changed_book)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// Enter_nomer_of_changed_book message handlers

void Enter_nomer_of_changed_book::OnOK()

{

UpdateData(true);

bool Ok=true;

kniga=NULL;

if (m_nomer=="")//если не ввели все параметры

{

MessageBox("Введите значение в поле!");

Ok=false;

}

else

{

kniga=((card*)(spis_book->find_by_num(atoi(LPCTSTR(m_nomer)))));//поиск книги с номером

if (kniga==NULL)//если нет книги

{

MessageBox("Нет книги с таким номером в базе!!!");

Ok=false;

};

};

if (Ok) {CDialog::OnOK();};

}

// Enter_nomer_of_changed_student.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Enter_nomer_of_changed_student.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// Enter_nomer_of_changed_student dialog

Enter_nomer_of_changed_student::Enter_nomer_of_changed_student(CWnd* pParent /*=NULL*/)

: CDialog(Enter_nomer_of_changed_student::IDD, pParent)

{

//{{AFX_DATA_INIT(Enter_nomer_of_changed_student)

m_nomer = _T("1");

//}}AFX_DATA_INIT

}

void Enter_nomer_of_changed_student::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Enter_nomer_of_changed_student)

DDX_Text(pDX, IDC_EDIT1_nomer, m_nomer);

DDV_MaxChars(pDX, m_nomer, 6);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Enter_nomer_of_changed_student, CDialog)

//{{AFX_MSG_MAP(Enter_nomer_of_changed_student)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// Enter_nomer_of_changed_student message handlers

void Enter_nomer_of_changed_student::OnOK()

{

UpdateData(true);

stud=NULL;

bool Ok=true;

if (m_nomer=="")//если не ввели все параметры

{

MessageBox("Введите значение в поле!");

Ok=false;

}

else//иначе

{

stud=((student*)(spis_stud->find_by_num(atoi(LPCTSTR(m_nomer)))));//поиск студента с номером

if (stud==NULL)//если нет студента

{

MessageBox("Нет студента с таким номером в базе!!!");

Ok=false;

};

};

if (Ok) {CDialog::OnOK();};

}

// Find_book_by_key.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Find_book_by_key.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// Find_book_by_key dialog

Find_book_by_key::Find_book_by_key(CWnd* pParent /*=NULL*/)

: CDialog(Find_book_by_key::IDD, pParent)

{

//{{AFX_DATA_INIT(Find_book_by_key)

m_what_to_find = _T("");

//}}AFX_DATA_INIT

}

void Find_book_by_key::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Find_book_by_key)

DDX_Control(pDX, IDC_LIST1_what_has_found, m_what_has_found);

DDX_Text(pDX, IDC_EDIT1_what_to_find, m_what_to_find);

DDV_MaxChars(pDX, m_what_to_find, 20);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Find_book_by_key, CDialog)

//{{AFX_MSG_MAP(Find_book_by_key)

ON_BN_CLICKED(IDC_BUTTON1_by_name, OnBUTTON1byname)

ON_BN_CLICKED(IDC_BUTTON2_by_author, OnBUTTON2byauthor)

ON_BN_CLICKED(IDC_BUTTON3_by_year, OnBUTTON3byyear)

ON_BN_CLICKED(IDC_BUTTON4_by_izdat, OnBUTTON4byizdat)

ON_BN_CLICKED(IDC_BUTTON5_by_nomer, OnBUTTON5bynomer)

ON_BN_CLICKED(IDC_BUTTON7_by_tema, OnBUTTON7bytema)

ON_WM_SHOWWINDOW()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// Find_book_by_key message handlers

spisok* temp3;

void Find_book_by_key::OnBUTTON1byname()

{

UpdateData(true);

temp3=spis_book->find('n',m_what_to_find);//поиск по названию

this->OnShowWindow(true,NULL);

}

void Find_book_by_key::OnCancel()

{

CDialog::OnCancel();

}

void Find_book_by_key::OnBUTTON2byauthor()

{

UpdateData(true);

temp3=spis_book->find('a',m_what_to_find);//поиск по фамилии автора

this->OnShowWindow(true,NULL);

}

void Find_book_by_key::OnBUTTON3byyear()

{

UpdateData(true);

temp3=spis_book->find('y',m_what_to_find);//поиск по году издания

this->OnShowWindow(true,NULL);

}

void Find_book_by_key::OnBUTTON4byizdat()

{

UpdateData(true);

temp3=spis_book->find('i',m_what_to_find);//поиск по издательству

this->OnShowWindow(true,NULL);

}

void Find_book_by_key::OnBUTTON5bynomer()

{

UpdateData(true);

kniga=((card*)(spis_book->find_by_num(atoi(LPCTSTR(m_what_to_find))) ));//поиск по номеру

m_what_has_found.ResetContent();

m_what_has_found.SetHorizontalExtent(1000);

if (kniga!=NULL)//печать на экран (если нашли)

{

CString s;

s="Номер книги: "+myconv(kniga->outnomzap())+" Название: "

+kniga->out_nazvanie()+" Автор: "+kniga->out_familia()

+" "+kniga->out_imia()+" "+kniga->out_otchestvo()

+" Издательство: "+kniga->out_izdv()+" Издание: "

+myconv(kniga->out_izdn())+" Тема: "+kniga->out_tema()

+" Год: "+myconv(kniga->out_year())+" В наличии: "

+myconv(kniga->out_kol()-kniga->out_vid());

m_what_has_found.AddString(s);

}

else

{m_what_has_found.AddString("Нет книг с таким номером!");};

}

void Find_book_by_key::OnBUTTON7bytema()

{

UpdateData(true);

temp3=spis_book->find('t',m_what_to_find);//поиск по теме

this->OnShowWindow(true,NULL);

}

void Find_book_by_key::OnShowWindow(BOOL bShow, UINT nStatus)

{

//CDialog::OnShowWindow(bShow, nStatus);

CString s;

spisok* temp2=temp3;

m_what_has_found.ResetContent();

m_what_has_found.SetHorizontalExtent(1000);

if (temp2==NULL)

{m_what_has_found.AddString("Нет книги с таким значением!");};

while (temp3!=NULL)//печать на экран списка найденных книг

{

kniga=((card*)(spis_book->find_by_num(((mas_int*)(temp3->spelt()))->outnomzap())));

s="Номер книги: "+myconv(kniga->outnomzap())+" Название: "

+kniga->out_nazvanie()+" Автор: "+kniga->out_familia()

+" "+kniga->out_imia()+" "+kniga->out_otchestvo()

+" Издательство: "+kniga->out_izdv()+" Издание: "

+myconv(kniga->out_izdn())+" Тема: "+kniga->out_tema()

+" Год: "+myconv(kniga->out_year())+" В наличии: "

+myconv(kniga->out_kol()-kniga->out_vid());

m_what_has_found.AddString(s);

temp3=temp3->spnext();

};

temp2->del_spisok();

}

// Find_book_in_student.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Find_book_in_student.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// Find_book_in_student dialog

Find_book_in_student::Find_book_in_student(CWnd* pParent /*=NULL*/)

: CDialog(Find_book_in_student::IDD, pParent)

{

//{{AFX_DATA_INIT(Find_book_in_student)

m_nomer = _T("1");

//}}AFX_DATA_INIT

}

void Find_book_in_student::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Find_book_in_student)

DDX_Control(pDX, IDC_LIST1_what_has_found, m_what_has_found);

DDX_Text(pDX, IDC_EDIT1_nomer_of_book, m_nomer);

DDV_MaxChars(pDX, m_nomer, 6);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Find_book_in_student, CDialog)

//{{AFX_MSG_MAP(Find_book_in_student)

ON_BN_CLICKED(IDC_BUTTON1_find, OnBUTTON1find)

ON_WM_SHOWWINDOW()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// Find_book_in_student message handlers

void Find_book_in_student::OnBUTTON1find()

{

CString s;

this->OnShowWindow(true,NULL);

if (m_nomer=="")//если не ввели все параметры

{MessageBox("Введите значение в поле!");}

else

{

spisok* temp2=spis_stud->find('k',m_nomer);//поиск книги с номером у студентов

spisok* temp3=temp2;

UpdateData(true);

m_what_has_found.ResetContent();

m_what_has_found.SetHorizontalExtent(1000);

if (temp3==NULL)

{m_what_has_found.AddString("Нет студентов с такой книгой!");};

while (temp2!=NULL)//печать списка найденных студентов

{

stud=((student*)(spis_stud->find_by_num(((mas_int*)(temp2->spelt()))->outnomzap())));

s="Номер билета: "+myconv(stud->outnomzap())+" Фамилия: "

+stud->out_familia()+" Имя: "+stud->out_imia()

+" Отчество: "+stud->out_otchestvo()+" Университет: "

+stud->out_univer()+" Группа: "+myconv(stud->out_gruppa())

+" Продлен : "+myconv(stud->out_prodlen());

m_what_has_found.AddString(s);

temp2=temp2->spnext();

};

temp3->del_spisok();

};

}

void Find_book_in_student::OnShowWindow(BOOL bShow, UINT nStatus)

{

//CDialog::OnShowWindow(bShow, nStatus);

UpdateData(true);

m_what_has_found.ResetContent();

m_what_has_found.SetHorizontalExtent(1000);

}

void Find_book_in_student::OnOK()

{

CDialog::OnOK();

}

// Find_student_and_his_book.cpp : implementation file

//

#include "stdafx.h"

#include "biblioteka.h"

#include "Find_student_and_his_book.h"

#include "MyClasses.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// Find_student_and_his_book dialog

Find_student_and_his_book::Find_student_and_his_book(CWnd* pParent /*=NULL*/)

: CDialog(Find_student_and_his_book::IDD, pParent)

{

//{{AFX_DATA_INIT(Find_student_and_his_book)

m_nomer = _T("1");

//}}AFX_DATA_INIT

}

void Find_student_and_his_book::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Find_student_and_his_book)

DDX_Control(pDX, IDC_LIST1_what_has_found, m_what_has_found);

DDX_Text(pDX, IDC_EDIT9_student, m_nomer);

DDV_MaxChars(pDX, m_nomer, 6);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Find_student_and_his_book, CDialog)

//{{AFX_MSG_MAP(Find_student_and_his_book)

ON_WM_SHOWWINDOW()

ON_BN_CLICKED(IDC_BUTTON1_find, OnBUTTON1find)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// Find_student_and_his_book message handlers

void Find_student_and_his_book::OnShowWindow(BOOL bShow, UINT nStatus)

{

//CDialog::OnShowWindow(bShow, nStatus);

UpdateData(true);

m_what_has_found.ResetContent();

m_what_has_found.SetHorizontalExtent(1000);

}

void Find_student_and_his_book::OnBUTTON1find()

{

stud=NULL;

this->OnShowWindow(true,NULL);

if (m_nomer=="")//если не ввели все параметры

{MessageBox("Введите значение в поле!");}

else

{

stud=((student*)(spis_stud->find_by_num(atoi(LPCTSTR(m_nomer)))));//поиск студента по номеру

if (stud!=NULL)//если есть

{

spisok* temp=stud->Knigi;

CString s;

while (temp!=NULL)//печать списка выданных ему книг

{

kniga=((card*)(spis_book->find_by_num(((mas_int*)(temp->spelt()))->outnomzap())));

s="Номер книги: "+myconv(kniga->outnomzap())+" Название: "

+kniga->out_nazvanie()+" Автор: "+kniga->out_familia()

+" "+kniga->out_imia()+" "+kniga->out_otchestvo()

+" Издательство: "+kniga->out_izdv()+" Издание: "

+myconv(kniga->out_izdn())+" Тема: "+kniga->out_tema()

+" Год: "+myconv(kniga->out_year())+" В наличии: "

+myconv(kniga->out_kol()-kniga->out_vid());

m_what_has_found.AddString(s);

temp=temp->spnext();

};

}

else

{m_what_has_found.AddString("Нет книг у студента или нет такого студента!");};

};

}

#ifndef fmyclasses

#define fmyclasses

//классы и объявление глобальных переменных

class zapis //запись

{

private:

int nomer;//номер

public:

virtual void show()=0;//печать на экран

virtual void del()=0;//удаление

int outnomzap();//дать номер

void innomzap(int p=0);//занести номер

};

class student;

class spisok;

class card:public zapis//запись с карточкой книги (книга)

{

public:

class Err_bring//класс ошибки в выдавании книги

{

public:

int b;

Err_bring(int);//констуктор

};

class Err_take//класс ошибки во взятии книги

{

public:

int t;

Err_take(int);//констуктор

};

private:

CString Nazvanie;//название

CString Familia;//фамилия

CString Imia;//имя

CString Otchestvo;//отчество

int Year;//год

CString Izdatelstvo;//издательство

int Izdanie;//издание

int Kolich;//количество

int Vidano;//кол-во выданных

CString Tema;//тема

public:

void in_nazvanie(CString naz="");//занести название

CString out_nazvanie();//дать название

void in_author( CString fam="",//занести автора

CString imi="",

CString otc="");

CString out_familia();//дать фамилию

CString out_imia();//дать имя

CString out_otchestvo();//дать отчество

void in_year(int y=0);//занести год

int out_year();//дать год

void in_izdv(CString izdv="");//занести издательство

CString out_izdv();//дать издательство

void in_izdn(int izdn=0);//занести издание

int out_izdn();//дать издание

void inkol(int p=0);//занести количество

int out_kol();//дать количество

void invid(int p=0);//занести кол-во выданных

int out_vid();//дать кол-вовыданных

void in_tema(CString tem="");//занести тему

CString out_tema();//дать тему

card( CString naz="", //конструктор 1

CString fam="",

CString imi="",

CString otc="",

int yea=0,

CString izdv="",

int izdn=0,

int kol=0,

int vid=0,

CString tem="",

int nom=0);

card(char *d, int a=0, int kol=0, int b=0);//конструктор 2

card* input(CString naz="", //создание новой книги

CString fam="", //и занесение параметров

CString imi="",

CString otc="",

int yea=0,

CString izdv="",

int izdn=0,

int kol=0,

int vid=0,

CString tem="",

int nom=0);

void del();//удаление из памяти

void show();//печать на экран (консоль)

void change();//изменение параметров (консоль)

friend void bring(card*, student*);//дружественная функция выдавания книги

friend void take (card*, student* );//дружественная функция забирания книги

};

class mas_int:public zapis//запись с числом (эл-т число, номер)

{

public:

void del();//удаление из памяти

void show();//печать на экран содержимого

mas_int* input(int num=0);//создание нового и занесение номера

};

class spisok//список (записей - книг, студентов, чисел)

{

public:

class Err_del//класс ошибки в удалении эл-та списка

{

public:

int d;

Err_del(int);//констуктор

};

class Err_input//класс ошибки в

{

public:

int i;

Err_input(int);//констуктор

};

private:

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

zapis* pzap;//указатель на содержимое эл-та списка

bool writeinfilebiblioteka(HANDLE hWrite);//запись списка книг в файл

spisok* readfromfilebiblioteka(HANDLE hRead);//чтение списка книг из файла

bool writeinfilestudenti(HANDLE hWrite);//запись списка студентов в файл

spisok* readfromfilestudenti(HANDLE hRead);//чтение списка студентов из файла

public:

spisok()//конструктор

{

next=NULL;

pzap=NULL;

};

zapis* spelt();//возврат указателя на содержимое эл-та списка

spisok* spnext();//возврат указателя на следующий эл-т списка

spisok* input_zapis(char kluch, zapis* p);//занесение нового эл-та (записи) в список

spisok* find(char kluch, CString znachenie);//поиск по ключу

zapis* find_by_num(int num=0);//поиск по номеру

void showall();//печать содержимого списка на экран (консоль)

spisok* del_spisok();//удаление списка

spisok* del_elt(char kluch, int num);//удаление элемента

bool infile(char what, HANDLE hWrite);//запись списка в файл

spisok* outfile(char what, HANDLE hWrite);//чтение списка из файла

void candelete(char kluch, int nom);//проверка на возможность удаления

bool caninput(char kluch, int nom);//проверка на возможность вставки нового эл-та

};

class student:public zapis //запись студента (студент)

{

public:

class Err_bring//класс ошибки в выдавании книги

{

public:

int b;

Err_bring(int);//конструктор

};

class Err_take//класс ошибки во взятии книги

{

public:

int t;

Err_take(int);//конструктор

};

private:

CString Familia;//фамилия

CString Imia;//имя

CString Otchestvo;//отчество

int Gruppa;//группа

int Prodlen;//год продления

CString Univer;//университет

public:

spisok* Knigi;//указатель на список взятых книг

void in_FIO(CString fam="",//занести ФИО

CString imi="",

CString otc="");

CString out_familia();//дать фамилию

CString out_imia();//дать имя

CString out_otchestvo();//дать отчество

void in_gruppa(int p=0);//занести группу

int out_gruppa();//дать группу

void in_prodlen(int p=0);//занести год продления

int out_prodlen();//дать год продления

void in_univer(CString p="");//занести университет

CString out_univer();//дать университет

void change();//измениние параметров (консоль)

student(CString fam="",//конструктор

CString imia="",

CString otc="",

int gru=0,

int pro=0,

spisok* kn=NULL,

CString uni="",

int nom=0);

student* input( CString fam="",//создание нового студента

CString imia="",//и занесение параметров

CString otc="",

int gru=0,

int pro=0,

spisok* kn=NULL,

CString uni="",

int nom=0);

void del();//удаление записи студента

void show();//печать на экран параметров студента (консоль)

friend void bring(card*, student*);//дружественная функция выдавания книги

friend void take (card*, student* );//дружественная функция забирания книги

};

//объявление глобальных функций

bool writestringinfile(HANDLE hWrite, CString value);

char readcharfromfile(HANDLE hRead);

void bring(card* book, student* stud);

void take(card* book, student* stud);

CString myconv(int value);

//объявление глобальных переменных

extern card* kniga;

extern CMemoryState oldMemState;

extern CMemoryState newMemState;

extern CMemoryState diffMemState; // состояния памяти

extern spisok *spis_book;

extern HANDLE hWrite;

extern LPCTSTR lpFileName;

extern spisok* spis_stud;

extern student* stud;

extern CTime tektime;

#endif

#ifndef fglobal_variables

#define fglobal_variables

//описание глобальных переменных

CMemoryState diffMemState, oldMemState, newMemState; // состояния памяти

spisok *spis_book=NULL;//указатель на список книг

card* kniga=NULL;//указатель на книгу

HANDLE hWrite;//указатель на файл (дескриптор)

LPCTSTR lpFileName("");//строка - имя файла

spisok* spis_stud=NULL;//указатель на список студентов

student* stud=NULL;//указатель на студента

CTime tektime = CTime::GetCurrentTime();//текущее время

void bring(card* book, student* stud)//выдать книгу

{

mas_int* newel=NULL;

if (book->out_kol()==book->out_vid())//проверка, что книга есть в наличии

{throw card::Err_bring(1);};//генерация исключения

if (stud->out_prodlen()<tektime.GetYear())//проверка, что продлен читательский

{throw student::Err_bring(1);};//генерация исключения

newel=((mas_int*)((stud->Knigi)->find_by_num(book->outnomzap())));//проверка, что есть такая книга

if (newel!=NULL)//если нет её

{throw student::Err_bring(2);};//генерация исключения

newel=newel->input(book->outnomzap());//создание в памяти нового эл-та с номером книги

book->invid(book->out_vid()+1);//увеличение счетчика выданных книг

stud->Knigi=stud->Knigi->input_zapis('m', newel);//занесение нового эл-та в список выданных студенту книг

};

void take(card* book, student* stud)//забрать книгу

{

mas_int* newel=NULL;

newel=((mas_int*)((stud->Knigi)->find_by_num(book->outnomzap())));//проверка, что такая книга есть у студента

if (newel==NULL)//если нет

{throw student::Err_take(1);};//генерация исключения

if (book->out_vid()<1)//проверка, что книга была кому-то выдана

{throw card::Err_take(1);};//генерация исключения

book->invid(book->out_vid()-1);//уменьшение счетчика выданных книг

stud->Knigi=(stud->Knigi)->del_elt('m',book->outnomzap());//удаление номера книги из списка выданных студенту книг

if (stud->Knigi==NULL)//если у студента больше нет сниг

{stud->in_prodlen(tektime.GetYear());};//продлить читательский

};

bool writestringinfile(HANDLE hWrite, CString value)//запись строки в файл

{

DWORD lpNumberOfBytesWritten;

WriteFile(

hWrite, // handle to file to write to

value, // pointer to data to write to file

value.GetLength(), // number of bytes to write

&lpNumberOfBytesWritten,// pointer to number of bytes written

NULL // pointer to structure for overlapped I/O

);

return true;

};

char readcharfromfile(HANDLE hRead)//чтение из файла символа

{

char value;

DWORD nNumberOfBytesToRead=1;

DWORD lpNumberOfBytesRead;

ReadFile(

hRead, // handle of file to read

&value, // pointer to buffer that receives data

nNumberOfBytesToRead, // number of bytes to read

&lpNumberOfBytesRead, // pointer to number of bytes read

NULL // pointer to structure for data

);

if (lpNumberOfBytesRead==0)//если достигли конца файла

{value='|';}//можно варьировать

return value;//возвращаемый символ

};

CString myconv(int value)//конвертация из числа в строку

{

char* c;

c=new char[100];

memset(c,0,sizeof(c));

CString s;

_itoa(value,c,10);

s=c;

delete[] c;

return s;//возврат строки

};

#endif

#ifndef fzapis

#define fzapis

//простые функции доступа к номеру записи

int zapis::outnomzap()

{return this->nomer;};

void zapis::innomzap(int p)

{this->nomer=p;};

#endif

#ifndef fcard

#define fcard

#include "inout_card.h"//включаем файл с простыми функциями для книги

card::Err_bring::Err_bring(int a)//инициализация

{ b=a;};//ошибки в выдавании книги студенту

card::Err_take::Err_take(int a)//инициализация

{ t=a;};//ошибки в забирании книги у студента

card::card(char *d, int a,int kol, int b)//конструктор 1

{

this->in_author(d);

this->in_year(a);

this->inkol(kol);

this->innomzap(b);

this->Vidano=0;

};

void card::change()//изменнение параметров книги

{

int p=0;//консольный вариант

printf("\nVvedi\n");

scanf("%s",(LPCTSTR) this->Nazvanie);

scanf("%s",(LPCTSTR) this->Familia);

scanf("%s",(LPCTSTR) this->Imia);

scanf("%s",(LPCTSTR) this->Otchestvo);

scanf("%d",&this->Year);

scanf("%s",(LPCTSTR) this->Izdatelstvo);

scanf("%d",&this->Izdanie);

scanf("%d",&p);

this->inkol(p);

this->Vidano=0;

scanf("%s",(LPCTSTR) this->Tema);

scanf("%d",&p);

this->innomzap(p);

printf("Ok\n");

};

card::card( CString naz,//конструктор 2

CString fam,

CString imi,

CString otc,

int yea,

CString izdv,

int izdn,

int kol,

int vid,

CString tem,

int nom)

{

this->Nazvanie=naz;//занесение переданных значений

this->in_author(fam,imi,otc);

this->Izdatelstvo=izdv;

this->Izdanie=izdn;

this->in_year(yea);

this->inkol(kol);

this->Vidano=0;

this->Tema=tem;

this->innomzap(nom);

};

card* card::input( CString naz,//занесение значений в книгу

CString fam,//по переданному указателю на книгу

CString imi,

CString otc,

int yea,

CString izdv,

int izdn,

int kol,

int vid,

CString tem,

int nom)

{

card* temp;

temp=new (card);//создание новой книги в памяти

if (naz=="")//если не передали инициализируюшие параметры

{

temp->change();//переспрос их (консоль)

}

else//иначе занесение значений параметров

{

temp->Nazvanie=naz;

temp->Izdatelstvo=izdv;

temp->Izdanie=izdn;

temp->Tema=tem;

temp->in_author(fam,imi,otc);

temp->in_year(yea);

temp->inkol(kol);

temp->Vidano=vid;

temp->innomzap(nom);

}

return temp;//возврат ссылки на новую книгу

};

void card::del()//удаление книги из памяти

{

card* st=this;

delete st;

};

void card::show()//песать на экран параметров книги

{//консоль

if (this!=NULL)

{

printf("\n");

printf("Naz: ");

printf(this->Nazvanie);

printf(" Fam: ");

printf(this->Familia);

printf(" Im: ");

printf(this->Imia);

printf(" Ot: ");

printf(this->Otchestvo);

printf(" God: ");

printf("%d", this->Year);

printf(" Iv: ");

printf(this->Izdatelstvo);

printf(" In: ");

printf("%d",this->Izdanie);

printf(" Kol: ");

printf("%d",this->out_kol());

printf(" Vid: ");

printf("%d",this->out_vid());

printf(" Tem: ");

printf(this->Tema);

printf(" Nom: ");

printf("%d",this->outnomzap());

};

};

#endif

#ifndef fstudent

#define fstudent

#include "inout_stud.h"//включение файла с простыми функциями доступа к параметрам студента

student::Err_bring::Err_bring(int a)//инициализация исключения (не выдать книгу)

{ b=a;};

student::Err_take::Err_take(int a)//инициализация исключения (не взять книгу)

{ t=a;};

student::student(CString fam,//конструктор

CString imia,

CString otc,

int gru,

int pro,

spisok* kn,

CString uni,

int nom)

{

this->in_FIO(fam,imia,otc);//занесение значений

this->in_gruppa(gru);

this->in_prodlen(pro);

this->Knigi=kn;

this->in_univer(uni);

this->innomzap(nom);

};

student* student::input(CString fam,//создание нового студента

CString imia,//и занесение параметров

CString otc,

int gru,

int pro,

spisok* kn,

CString uni,

int nom)

{

student* temp;

temp=new (student);//создание

int p=0;

if (fam=="")//если нет параметров

{//консоль

printf("\nVvedi\n");//занесение их с клавиатуры

scanf("%s",(LPCTSTR) temp->Familia);

scanf("%s",(LPCTSTR) temp->Imia);

scanf("%s",(LPCTSTR) temp->Otchestvo);

scanf("%d",&temp->Gruppa);

temp->Prodlen=tektime.GetYear();

temp->Knigi=kn;

scanf("%s",(LPCTSTR) temp->Univer);

scanf("%d",&p);

temp->innomzap(p);

printf("Ok\n");

}

else//иначе

{

temp->in_FIO(fam,imia,otc);//занесение

temp->in_gruppa(gru);

temp->in_prodlen(pro);

temp->Knigi=kn;

temp->in_univer(uni);

temp->innomzap(nom);

}

return temp;//возврат ук-ля на студента

};

void student::change()//изменение параметров студента

{//консоль

int p=0;

printf("\nVvedi\n");

scanf("%s",(LPCTSTR) this->Familia);

scanf("%s",(LPCTSTR) this->Imia);

scanf("%s",(LPCTSTR) this->Otchestvo);

scanf("%d",&this->Gruppa);

if (this->Knigi==NULL) //если взятых книг нет

{this->Prodlen=tektime.GetYear();};//продлить

scanf("%s",(LPCTSTR) this->Univer);

scanf("%d",&p);

this->innomzap(p);

printf("Ok\n");

};

void student::del()//удаление студента из памяти

{

student* st=this;

spisok* sp=this->Knigi;

sp->del_spisok();//удаление списка взятых книг

delete st;//удаление записи студента

};

void student::show()//песать на экран параметров студента

{//консоль

if (this!=NULL)

{

printf("\n");

printf(this->out_familia());

printf(" ");

printf(this->out_imia());

printf(" ");

printf(this->out_otchestvo());

printf(" ");

printf("%d", this->out_gruppa());

printf(" ");

printf("%d", this->out_prodlen());

printf(" ");

printf(this->out_univer());

printf(" ");

if (this->Knigi!=NULL)//печать номеров взятых книг

{

this->Knigi->showall();

};

printf(" ");

printf("%d",this->outnomzap());

};

};

#endif

#ifndef fmas_int

#define fmas_int

void mas_int::del()//удаление эл-та из памяти

{

mas_int *temp=this;

delete temp;

};

mas_int* mas_int::input(int num)//создание и инициализация эт-та в памяти

{

mas_int* temp;

temp=new (mas_int);

temp->innomzap(num);//инициализация

return temp;//возврат ссылки на эл-т

};

void mas_int::show()//печать на экран содержимого эл-та (вызывается для указателя)

{

if (this!=NULL)

{

printf(" kn: ");//в консольном режиме

printf("%d",this->outnomzap());

};

};

#endif

#ifndef finout_card

#define finout_card

//простые функции доступа к параметрам книги

void card::in_nazvanie(CString naz)//название

{this->Nazvanie=naz;};

CString card::out_nazvanie()//название

{return this->Nazvanie;};

void card::in_author(CString fam,//автор

CString imi,

CString otc)

{

this->Familia=fam;

this->Imia=imi;

this->Otchestvo=otc;

};

CString card::out_familia()//фамилия

{return this->Familia;};

CString card::out_imia()//имя

{return this->Imia;};

CString card::out_otchestvo()//отчество

{return this->Otchestvo;};

void card::in_year(int y)//год издания

{this->Year=y;};

int card::out_year()//год издания

{return this->Year;};

void card::in_izdv(CString izdv)//издательство

{this->Izdatelstvo=izdv;};

CString card::out_izdv()//издательство

{return this->Izdatelstvo;};

void card::in_izdn(int izdn)//издание

{this->Izdanie=izdn;};

int card::out_izdn()//издание

{return this->Izdanie;};

void card::inkol(int p)//кол-во

{this->Kolich=p;};

int card::out_kol()//кол-во

{return this->Kolich;};

void card::invid(int p)//сколько выдано

{this->Vidano=p;};

int card::out_vid()//сколько выдано

{return this->Vidano;};

void card::in_tema(CString tem)//тема

{this->Tema=tem;};

CString card::out_tema()//тема

{return this->Tema;};

#endif

#ifndef finout_stud

#define finout_stud

//простые функции доступа к параметрам студента

void student::in_FIO(CString fam,//ФИО

CString imi,

CString otc)

{

this->Familia=fam;

this->Imia=imi;

this->Otchestvo=otc;

};

CString student::out_familia()//фамилия

{return this->Familia;};

CString student::out_imia()//имя

{return this->Imia;};

CString student::out_otchestvo()//отчество

{return this->Otchestvo;};

void student::in_gruppa(int p)//группа

{this->Gruppa=p;};

int student::out_gruppa()//группа

{return this->Gruppa;};

void student::in_prodlen(int p)//год продления читательского

{this->Prodlen=p;};

int student::out_prodlen()//год продления читательского

{return this->Prodlen;};

void student::in_univer(CString p)//университет

{this->Univer=p;};

CString student::out_univer()//университет

{return this->Univer;};

#endif

#ifndef frwfiles

#define frwfiles

//функции работы с файлами

bool spisok::infile(char what, HANDLE hWrite)//запись в файл списка

{

bool p;

if (what=='b')

{p=writeinfilebiblioteka(hWrite);}//книг

else

{p=writeinfilestudenti(hWrite);};//студентов

return p;//удачно или нет

};

spisok* spisok::outfile(char what,HANDLE hWrite)//чтение из файла списка

{

spisok* p;

if (what=='b')

{p=readfromfilebiblioteka(hWrite);}//книг

else

{p=readfromfilestudenti(hWrite);};//студентов

return p;//удачно или нет

};

spisok* spisok::readfromfilebiblioteka(HANDLE hRead)//чтение из файла и возврат ссылки на список книг

{

char lpBuf;

card* newel=NULL;//ук-ль на книгу

CString naz="";//временные переменные

CString fam="";

CString imi="";

CString otc="";

int god=0;

CString izdv="";

int izdn=0;

int kol=0;

int vid=0;

CString tema="";

int nomer=0;

CString stroka="";

spisok* temp=this;//ук-ль на список считываемых книг

while (lpBuf!='|')//пока не прочитали весь файл

{

naz="";

lpBuf=readcharfromfile(hRead);//чтение символа

if (lpBuf=='|') {goto metka;}//если достигли конца файла

while (lpBuf!='\t')//пока не достигли символа t

{

naz=naz+lpBuf;//накопление символов названия

lpBuf=readcharfromfile(hRead);//чтение символа

}

fam="";

lpBuf=readcharfromfile(hRead);//чтение символа

while (lpBuf!='\t')//пока не достигли символа t

{

fam=fam+lpBuf;//накопление символов фамилии

lpBuf=readcharfromfile(hRead);//чтение символа

}

imi="";

lpBuf=readcharfromfile(hRead);//чтение символа

while (lpBuf!='\t')//пока не достигли символа t

{

imi=imi+lpBuf;//накопление символов имени

lpBuf=readcharfromfile(hRead);//чтение символа

}

otc="";

lpBuf=readcharfromfile(hRead);//чтение символа

while (lpBuf!='\t')//пока не достигли символа t

{

otc=otc+lpBuf;//накопление символов отчества

lpBuf=readcharfromfile(hRead);//чтение символа

}

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while (lpBuf!='\t')//пока не достигли символа t

{

stroka=stroka+lpBuf;//накопление символов года издания

lpBuf=readcharfromfile(hRead);//чтение символа

}

god=atoi( LPCTSTR(stroka));//перевод в формат числа

izdv="";

lpBuf=readcharfromfile(hRead);//чтение символа

while (lpBuf!='\t')//пока не достигли символа t

{

izdv=izdv+lpBuf;//накопление символов издательства

lpBuf=readcharfromfile(hRead);//чтение символа

}

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while (lpBuf!='\t')//пока не достигли символа t

{

stroka=stroka+lpBuf;//накопление символов издания

lpBuf=readcharfromfile(hRead);//чтение символа

}

izdn=atoi( LPCTSTR(stroka));//перевод в формат числа

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while (lpBuf!='\t')//пока не достигли символа t

{

stroka=stroka+lpBuf;//накопление символов количества

lpBuf=readcharfromfile(hRead);//чтение символа

}

kol=atoi( LPCTSTR(stroka));//перевод в формат числа

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while (lpBuf!='\t')//пока не достигли символа t

{

stroka=stroka+lpBuf;//накопление символов кол-ва выданных книг

lpBuf=readcharfromfile(hRead);//чтение символа

}

vid=atoi( LPCTSTR(stroka));//перевод в формат числа

tema="";

lpBuf=readcharfromfile(hRead);//чтение символа

while (lpBuf!='\t')//пока не достигли символа t

{

tema=tema+lpBuf;//накопление символов темы

lpBuf=readcharfromfile(hRead);//чтение символа

}

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while (lpBuf!='\n')//пока не достигли символа n

{

stroka=stroka+lpBuf;//накопление символов номера

lpBuf=readcharfromfile(hRead);//чтение символа

}

nomer=atoi( LPCTSTR(stroka));//перевод в формат числа

newel=newel->input(naz,fam,imi,otc,god,izdv,izdn,kol,vid,tema,nomer);

//создание в памяти новой книга

temp=temp->input_zapis('b', newel);//занесение её в список книг

}

metka:

return temp;//возврат ссылки на первый эл-т списка книг

};

spisok* spisok::readfromfilestudenti(HANDLE hRead)//чтение из файла и возврат ссылки на список студентов

{

char lpBuf;

student* newel=NULL;//ук-ль на студента

CString fam="";

CString imi="";

CString otc="";

int gru=0;

int pro=0;

CString uni="";

int nomer=0;

CString stroka="";

spisok* temp=this;//ук-ль на список студентов

spisok* knigi=NULL;//ук-ль на список номеров взятых студентом книг

mas_int* nom=NULL;//ук-ль на запись с номером взятой книги

while (lpBuf!='|')//пока не прочитали весь файл

{

fam="";

lpBuf=readcharfromfile(hRead);//чтение символа

if (lpBuf=='|') {goto metka;}//если достигли конца файла

while (lpBuf!='\t')//пока не достигли символа t

{

fam=fam+lpBuf;//накопление символов фамилии

lpBuf=readcharfromfile(hRead);//чтение символа

}

imi="";

lpBuf=readcharfromfile(hRead);//чтение символа

while (lpBuf!='\t')//пока не достигли символа t

{

imi=imi+lpBuf;//накопление символов имени

lpBuf=readcharfromfile(hRead);//чтение символа

}

otc="";

lpBuf=readcharfromfile(hRead);//чтение символа

while (lpBuf!='\t')//пока не достигли символа t

{

otc=otc+lpBuf;//накопление символов отчества

lpBuf=readcharfromfile(hRead);//чтение символа

}

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while (lpBuf!='\t')//пока не достигли символа t

{

stroka=stroka+lpBuf;//накопление символов группы

lpBuf=readcharfromfile(hRead);//чтение символа

}

gru=atoi( LPCTSTR(stroka));//перевод в формат числа

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while ((lpBuf!='\t')&&(lpBuf!='\f'))//пока не достигли символа t или f

{

stroka=stroka+lpBuf;//накопление символов года продления

lpBuf=readcharfromfile(hRead);//чтение символа

}

pro=atoi( LPCTSTR(stroka));//перевод в формат числа

knigi=NULL;//нет книг

if (lpBuf=='\f')//если символ f

{

while (lpBuf!='\t')//пока не достигли символа t

{

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while ((lpBuf!='\t')&&(lpBuf!='\f'))//пока не достигли символа t или f

{

stroka=stroka+lpBuf;//накопление символов

lpBuf=readcharfromfile(hRead);//чтение символа

};

nomer=atoi( LPCTSTR(stroka));//перевод в формат числа

nom=nom->input(nomer);//создание в памяти новой записи с номером книги

knigi=knigi->input_zapis('m', nom);//занесение записи а список взятых студентом книг

};

};

uni="";

lpBuf=readcharfromfile(hRead);//чтение символа

while (lpBuf!='\t')//пока не достигли символа t

{

uni=uni+lpBuf;//накопление символов

lpBuf=readcharfromfile(hRead);//чтение символа

}

lpBuf=readcharfromfile(hRead);//чтение символа

stroka="";

while (lpBuf!='\n')//пока не достигли символа n

{

stroka=stroka+lpBuf;//накопление символов

lpBuf=readcharfromfile(hRead);//чтение символа

}

nomer=atoi( LPCTSTR(stroka));//перевод в формат числа

newel=newel->input(fam,imi,otc,gru,pro, knigi, uni,nomer);

//создание в памяти нового студента

temp=temp->input_zapis('s', newel);//занесение его в список студентов

}

metka:

return temp;//возврат ссылки на первый эл-т списка студентов

};

bool spisok::writeinfilebiblioteka(HANDLE hWrite)//запись списка книг в файл

{

spisok* temp=this;

while (temp)//пока не записали весь

{

writestringinfile(hWrite,((card*)(temp->spelt()))->out_nazvanie());//запись названия

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,((card*)(temp->spelt()))->out_familia());//запись фамилии

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,((card*)(temp->spelt()))->out_imia());//запись имени

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,((card*)(temp->spelt()))->out_otchestvo());//запись отчества

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,myconv(((card*)(temp->spelt()))->out_year()));//запись года издания

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,((card*)(temp->spelt()))->out_izdv());//запись издательства

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,myconv(((card*)(temp->spelt()))->out_izdn()));//запись издания

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,myconv(((card*)(temp->spelt()))->out_kol()));//запись количества

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,myconv(((card*)(temp->spelt()))->out_vid()));//запись кол-ва выданных

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,((card*)(temp->spelt()))->out_tema());//запись темы

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,myconv((temp->spelt()->outnomzap())));//запись номера

writestringinfile(hWrite,'\n');//запись символа n

temp=temp->spnext();//переход на следующий эл-т списка

};

return true;

};

bool spisok::writeinfilestudenti(HANDLE hWrite)//запись списка студентов в файл

{

spisok* temp=this;

spisok* knigi=NULL;

while (temp)//поа не достигли конца списка

{

writestringinfile(hWrite,((student*)(temp->spelt()))->out_familia());//запись фамилии

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,((student*)(temp->spelt()))->out_imia());//запись имени

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,((student*)(temp->spelt()))->out_otchestvo());//запись отчества

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,myconv(((student*)(temp->spelt()))->out_gruppa()));//запись группы

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,myconv(((student*)(temp->spelt()))->out_prodlen()));//запись года продления

knigi=((student*)(temp->spelt()))->Knigi;//поиск книг у студента

while (knigi)//если есть, то пока не прошли по всем книгам

{

writestringinfile(hWrite,'\f');//запись символа f

writestringinfile(hWrite,myconv(((mas_int*)(knigi->spelt()))->outnomzap()));//запись номера книги

knigi=knigi->spnext();//переход на следующую книгу

};

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,((student*)(temp->spelt()))->out_univer());//запись университета

writestringinfile(hWrite,'\t');//запись символа t

writestringinfile(hWrite,myconv(temp->spelt()->outnomzap()));//запись номера

writestringinfile(hWrite,'\n');//запись символа n

temp=temp->spnext();//переход на следующий

};

return true;

};

#endif

#ifndef fspisok

#define fspisok

#include "rwfiles.h"//включение файла с функциями работы с файлами

spisok::Err_del::Err_del(int a)//инициализация исключения (ошибка в удалении эл-та списка)

{ d=a;};

spisok::Err_input::Err_input(int a)//инициализация исключения (ошибка в создании эл-та списка)

{ i=a;};

zapis* spisok::spelt()//возврат ссылки на содержимое эл-та списка

{return this->pzap;};

spisok* spisok::spnext()//возврат ссылки на следующий эл-т списка

{return this->next;};

zapis* spisok::find_by_num(int num)//поиск в списке по номеру и возврат ссылки на содержимое эл-та списка

{

spisok *temp=this;

if (temp!=NULL)//пока не прошли по всему списку

{

while ((temp->pzap->outnomzap()!=num)&&(temp->next!=NULL))//если не тот номер и не конец списка

{temp=temp->next;}//переход на следующий

if (temp->pzap->outnomzap()==num)//если нашли номер

{

return temp->pzap;//(zapis*)//возврат ссылки

}

}

return NULL;//(zapis*)//не нашли

};

spisok* spisok::del_elt(char kluch/*книга, студент или число*/, int num)//удаление эл-та списка по номеру

{

spisok *temp=this;

spisok *temp2=this;

spisok *temp3=this;

if (temp3!=NULL)//если существует список

{

this->candelete(kluch, num);//проверка, что можем удалить

if (num!=(temp->spelt())->outnomzap())//если не первый эл-т

{

while ((temp->spelt()->outnomzap()!=num))//пока не дошли до удаляемого эл-та

{

temp2=temp;//ссылка на предыдущий эл-т

temp=temp->next;//надо удалить

};

temp2->next=temp->next;//сшили два стоящих через удаляемый

}

else//если первый

{

temp3=temp3->next;//новое начало списка

};

switch (kluch)//по ключу

{

case 's'://студент

{

((student*)(temp->pzap))->del();//удаление студента

break;

};

case 'b'://книга

{

((card*)(temp->pzap))->del();//удаление книги

break;

};

case 'm'://эл-т с номером

{

((mas_int*)(temp->pzap))->del();//удаление

};

};

delete temp;

}

else

{throw spisok::Err_del(2);};//генерация исключения (нет списка)

return temp3;//возврат ссылки на новое начало списка

};

spisok* spisok::del_spisok()//удаление всего списка

{

spisok *temp=NULL;

spisok *temp2=this;

while (temp2)//пока не прошли по всему списку

{

temp=temp2->next;

temp2->pzap->del();//удаление содержимого эл-та

delete temp2;//удаление эл-та списка

temp2=temp;//переход на следующий

};

return NULL;//(spisok*)

};

spisok* spisok::input_zapis(char kluch/*книга, студент или число*/, zapis* p)//занесение нового эл-та в список

{

spisok* begin=this;

spisok* temp=begin;

spisok* newel=NULL;

if (begin->caninput(kluch,p->outnomzap()))//проверка, что можем занести

{

newel=new (spisok);//создание нового эл-та

newel->next=NULL;

newel->pzap=p;//занесение в него ссылки на содержимое

if (begin==NULL)//если он первый (списка еще нет)

{

begin=newel;

}

else//иначе

{

while (temp->next)//доходим до последнего

{temp=temp->next;}

temp->next=newel;//вставляем новый эл-т в коней списка

};

}

else//не можем вставить

{

p->del();//удаление из памяти содержимого

throw spisok::Err_input(1);//генерация исключения

};

return begin;//возврат ссылки на начало списка

};

void spisok::showall()//печать на экран списка

{

spisok* begin=this;

while (begin!=NULL)//консоль

{

begin->pzap->show();//печать содержимого

begin=begin->next;

}

};

void spisok::candelete(char kluch/*книга, студент или число*/, int nom)//проверка на возможность удаления

{

zapis* temp=NULL;

temp=this->find_by_num(nom);//поиск по номеру

if (temp!=NULL)//если есть эл-т с таким номером

{

switch (kluch)//по ключу

{

case 's'://студент

{

if ( ((student*)(temp))->Knigi!=NULL )//если у него нет книг

{throw spisok::Err_del(1);};//генерация исключения (не можем удалить)

break;

};

case 'b'://книга

{

if ( ((card*)(temp))->out_vid()!=0 )//если никому не выдана

{throw spisok::Err_del(1);};//генерация исключения (не можем удалить)

break;

};

case 'm'://эл-т с числом

{

break;

};

};

}

else

{

throw spisok::Err_del(3);//генерация исключения (нет такого студента или книги)

};

};

bool spisok::caninput(char kluch/*книга, студент или число*/, int nom)//проверка, что можем вставить в список эл-т

{

if ((kluch=='b')||(kluch=='s'))//если студент или книга

{

zapis* temp=NULL;

temp=this->find_by_num(nom);//поиск по номеру

if (temp)//если уже есть эл-т с таким номером

{return false;}

};

return true;

};

spisok* spisok::find(char kluch/*книга, студент или число*/, CString znachenie)//поиск в списке значения по ключу

{

spisok *temp=this;//список, где ищем

spisok *find=NULL;//список номеров эл-тов, удовлетворяющих параметру поиска

spisok* temp2=NULL;

mas_int *last=NULL;//ук-ль на эл-т с номером

bool najden=false;//флаг того, что нашли эл-т

while (temp!=NULL)//пока не прошли по всему списку

{

switch (kluch)//по ключу

{

case 'n'://ищем по названию

{

if (((card*)(temp->pzap))->out_nazvanie()==znachenie)//если нашли

{ najden=true;};

break;

};

case 'a'://ищем по автору (фамилия)

{

if (((card*)(temp->pzap))->out_familia()==znachenie) //если нашли

{ najden=true;};

break;

};

case 'y'://ищем по году издания

{

if ( ((card*)(temp->pzap))->out_year()==atoi(LPCTSTR(znachenie)) )//если нашли

{ najden=true;};

break;

};

case 'i'://ищем по издательству

{

if (((card*)(temp->pzap))->out_izdv()==znachenie) //если нашли

{ najden=true;};

break;

};

case 't'://ищем по теме

{

if (((card*)(temp->pzap))->out_tema()==znachenie) //если нашли

{ najden=true;};

break;

};

case 'f'://ищем по фамилии студента

{

if (((student*)(temp->pzap))->out_familia()==znachenie) //если нашли

{ najden=true;};

break;

};

case 'g'://ищем по группе

{

if (((student*)(temp->pzap))->out_gruppa()==atoi(LPCTSTR(znachenie)) )//если нашли

{ najden=true;};

break;

};

case 'p'://ищем по году продления

{

if (((student*)(temp->pzap))->out_prodlen()==atoi(LPCTSTR(znachenie)) )//если нашли

{ najden=true;};

break;

};

case 'k'://ищем по взятым книгам

{

temp2=((student*)(temp->pzap))->Knigi;//ук-ль на список взятых книг

while (temp2!=NULL)//по всему списку

{

if ( ((mas_int*)(temp2->spelt()))->outnomzap()==atoi(LPCTSTR(znachenie)) )//если нашли

{najden=true;}

temp2=temp2->spnext();//переход на следующий

};

break;

};

case 'u'://ищем по университету

{

if (((student*)(temp->pzap))->out_univer()==znachenie) //если нашли

{ najden=true;};

break;

};

default:

{ break;};

}

if (najden)//если текущий эл-т удовлетворяет параметру поиска

{

last = last->input((temp->pzap)->outnomzap());//создание нового эл-та с номером найденного эл-та

find=find->input_zapis('m', last);//занесение эл-та в список найденных

};

najden=false;//взведение флага

temp=temp->next;//переход на следующий эл-т списка

}

return find;//возврат ук-ля на список найденных

};

#endif

Заключение.

Представленная программы Biblioteka.exe полностью удовлетворяет техническому заданию. В ней реализованы все оговоренные функции.

Создана достаточно удобная структура классов с возможностью дальнейшего развития и наращивания доступных пользователю функции. Обеспечена преемственность платформ, из под которых может запускаться данная программа (Windows 95, 98, 2000, причем не обязательно присутствие компилятора С++ на машине).

Реализован интуитивно понятный интерфейс в пределах технического задания.

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

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

С уважением, авторы.

65