Концептуальная модель данных. 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, причем не обязательно присутствие компилятора С++ на машине).
Реализован интуитивно понятный интерфейс в пределах технического задания.
Обеспечена надежная система защиты от ошибок на стадии занесения нового студента или книги (исключения), изменения их параметров, выдавании и взятии книги (исключения).
В целом можно говорить, что данный проект не исчерпал полностью своих возможностей и при наличии материальных и временных ресурсов может быть доведен до уровня коммерческого приложения и использоваться во всех библиотечных структурах.
С уважением, авторы.