Скачиваний:
72
Добавлен:
02.05.2014
Размер:
151.04 Кб
Скачать
  1. Постановка задачи

Написать программу учета книг в библиотеке.

Сведения о книгах содержат: фамилию и инициалы автора, название, год издания, количество экземпляров данной книги в библиотеке.

Программа должна обеспечить выбор с помощью меню и выполнение одной из следующий функций:

  • Добавление данных о книгах вновь поступающих в библиотеку;

  • Удаление данных о списываемых книгах;

  • Выдача сведений о всех книгах, упорядоченных по фамилиям авторов;

  • Выдача сведений о всех книгах, упорядоченных по годам издания.

Хранение данных организовать с применением контейнерного класса list.

2 Решение поставленной задачи

В данной работе необходимо разработать программу, позволяющую хранить данные о всех книгах в библиотек, добавлять новые книги, удалять данные о списываемых книгах. Программа должна хранить информацию о всех книгах в библиотеке в отдельном файле. Для создания программы использовать язык программирования C++ Builder 6.

Исходя из этого для хранения информации нужно использовать следующие данные:

  • Фамилию и инициалы автора книги;

  • Название книги;

  • Год издания книги;

  • Количество экземпляров данной книги.

Программа хранит данные с применением контейнерного класса list. Список (List) хранит элементы в определенной последовательности. List автоматически изменяет размер, когда вы добавляете дополнительные элементы.

3 Структура программного проекта

struct Book

{

AnsiString Avtor; // Данные о авторе книги

AnsiString Nazvanie; // Данные о названии книги

AnsiString Data; // Данные года издания книги

int Kolvo; // Данные количества экземпляров

};

//---------------------------------------------------------------------------

#include <vcl.h>

#include <dstring.h>

#pragma hdrstop

#include <dir.h>

#include <fstream.h>

#include "Unit1.h"

#include "Unit2.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TList *Library = new TList;

TMain *Main;

//---------------------------------------------------------------------------

// различные сортировки

int __fastcall SortAvtor(void*Item1,void*Item2)

{

return CompareText(((Book*)Item1)->Avtor,((Book*)Item2)->Avtor);

}

int __fastcall SortNazvanie(void*Item1,void*Item2)

{

return CompareText(((Book*)Item1)->Nazvanie,((Book*)Item2)->Nazvanie);

}

int __fastcall SortData(void*Item1,void*Item2)

{

return CompareText(((Book*)Item1)->Data,((Book*)Item2)->Data);

}

void __fastcall TMain::FormCreate(TObject *Sender)

{

TabSheet2->Show();

StringGrid1->Cells[0][0]="ФИО автора";

StringGrid1->Cells[1][0]="Название книги";

StringGrid1->Cells[2][0]="Год издания";

StringGrid1->Cells[3][0]="Количество экземпляров";

StringGrid2->Cells[0][0]="ФИО автора";

StringGrid2->Cells[1][0]="Название книги";

StringGrid2->Cells[2][0]="Год издания";

StringGrid2->Cells[3][0]="Количество экземпляров";

ComboBox1->Items->Clear();

int nach = 1900;

int konech = 2008;

for(int i = nach;i <= konech;i++)

ComboBox1->Items->Add(IntToStr(i));

ComboBox1->ItemIndex = konech - nach - 5;

}

//---------------------------------------------------------------------------

void __fastcall TMain::AddBtnClick(TObject *Sender)

{

AnsiString Avtor = Edit1->Text; // добавление новых данных

AnsiString Nazvanie = Edit2->Text; // добавление новых данных

AnsiString Data = ComboBox1->Items->Strings[ComboBox1->ItemIndex];

String Kolvo = Edit4->Text;

if(Kolvo < 0 )

{

ShowMessage("Неправильный формат");

return;

}

if(Avtor.Trim()==""||Nazvanie.Trim()==""||Data.Trim()==""||Kolvo.Trim()=="")

{

ShowMessage("Заполните все поля");

return;

}

else

{

Book *b1 = new Book(Avtor,Nazvanie,Data,StrToInt(Kolvo));

Library->Add(b1);

}

for(int i = 0;i < Library->Count; i++)

{

Book*b=(Book*)Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor; // Вывод на экран

StringGrid1->Cells[1][i+1] = b->Nazvanie; // добавленной книги

StringGrid1->Cells[2][i+1] = b->Data; //

StringGrid1->Cells[3][i+1] = b->Kolvo; //

}

StringGrid1->RowCount = Library->Count+1;

TabSheet1->Show();

Edit1->Text = "";

Edit2->Text = "";

Edit4->Text = "";

}

//---------------------------------------------------------------------------

void __fastcall TMain::DeleteBtnClick(TObject *Sender)

{

if(CheckBox1->Checked)

{

if(StringGrid1->Row != 0)

Library->Delete(StringGrid1->Row-1);

StringGrid1->RowCount = Library->Count+1;

}

else

{

if(StringGrid1->Row != 0)

{

Book*b = (Book*) Library->Items[StringGrid1->Row - 1];

if(b->Kolvo < StrToInt(DelBook->Text))

{

ShowMessage("Выберете меньшее количество книг");

return;

}

if(b->Kolvo == StrToInt(DelBook->Text))

{

Library->Delete(StringGrid1->Row-1);

StringGrid1->RowCount = Library->Count+1;

}

if(b->Kolvo > StrToInt(DelBook->Text))

{

b->Kolvo -= StrToInt(DelBook->Text);

}

}

}

for(int i = 0; i < Library->Count;i++)

{

Book*b = (Book*) Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor;

StringGrid1->Cells[1][i+1] = b->Nazvanie;

StringGrid1->Cells[2][i+1] = b->Data;

StringGrid1->Cells[3][i+1] = b->Kolvo;

}

StringGrid2->Cells[0][0]="ФИО автора";

StringGrid2->Cells[1][0]="Название книги";

StringGrid2->Cells[2][0]="Год издания";

StringGrid2->Cells[3][0]="Количество экземпляров";

for(int i = 1;i <=Library->Count;i++)

{

StringGrid2->Cells[0][i]="";

StringGrid2->Cells[1][i]="";

StringGrid2->Cells[2][i]="";

StringGrid2->Cells[3][i]="";

}

}

//---------------------------------------------------------------------------

void __fastcall TMain::N2Click(TObject *Sender)

{

if(OpenDialog1->Execute())

{

for(int i = Library->Count;i > 0;i--)

Library->Delete(i-1);

ifstream cFile(OpenDialog1->FileName.c_str(),ios::in);

const int MaxLen = 255;

char S_Avtor[MaxLen],S_Nazvanie[MaxLen],S_Data[MaxLen];

int mDay,q;

while(cFile >> S_Data)

{

cFile.getline(S_Avtor,MaxLen);

cFile >> q;

cFile.getline(S_Nazvanie,MaxLen);

AnsiString A = S_Avtor, N = S_Nazvanie, D = S_Data;

A = A.Trim();N = N.Trim();D = D.Trim();

Book*b1 = new Book(A,N,D,q);

Library->Add(b1);

}

}

StringGrid1->RowCount = Library->Count + 1;

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*) Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor;

StringGrid1->Cells[1][i+1] = b->Nazvanie;

StringGrid1->Cells[2][i+1] = b->Data;

StringGrid1->Cells[3][i+1] = b->Kolvo;

}

TabSheet1->Show();

}

//---------------------------------------------------------------------------

void __fastcall TMain::N3Click(TObject *Sender)

{

char myFile[10];

if(SaveDialog1->Execute())

{

if(FileExists(SaveDialog1->FileName))

{

fnsplit(SaveDialog1->FileName.c_str(),0,0,myFile,0);

strcat(myFile,".BK");

RenameFile(SaveDialog1->FileName,myFile);

}

fstream ClientFile(SaveDialog1->FileName.c_str(),ios::out);

for(int i = 1;i < StringGrid1->RowCount;i++ )

{

AnsiString S_Avtor = StringGrid1->Cells[0][i];

AnsiString S_Nazvanie = StringGrid1->Cells[1][i];

AnsiString S_Data = StringGrid1->Cells[2][i];

AnsiString S_Kolvo = StringGrid1->Cells[3][i];

ClientFile<<S_Data.c_str()<<" "<<S_Avtor.c_str()<<"\n"<<S_Kolvo.c_str()<<" "<<S_Nazvanie.c_str()<<"\n";

}

ClientFile.close();

}

}

//---------------------------------------------------------------------------

void __fastcall TMain::N4Click(TObject *Sender)

{

Main->Close();

}

//---------------------------------------------------------------------------

void __fastcall TMain::N_AvtorClick(TObject *Sender)

{

TabSheet1->Show();

N_Nazvanie->Checked = false;

N_Data->Checked = false;

Library->Sort(SortAvtor);

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*)Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor;

StringGrid1->Cells[1][i+1] = b->Nazvanie;

StringGrid1->Cells[2][i+1] = b->Data;

StringGrid1->Cells[3][i+1] = b->Kolvo;

}

}

//---------------------------------------------------------------------------

void __fastcall TMain::N_NazvanieClick(TObject *Sender)

{

TabSheet1->Show();

N_Avtor->Checked = false;

N_Data->Checked = false;

Library->Sort(SortNazvanie);

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*)Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor;

StringGrid1->Cells[1][i+1] = b->Nazvanie;

StringGrid1->Cells[2][i+1] = b->Data;

StringGrid1->Cells[3][i+1] = b->Kolvo;

}

}

//---------------------------------------------------------------------------

void __fastcall TMain::N_DataClick(TObject *Sender)

{

TabSheet1->Show();

N_Avtor->Checked = false;

N_Nazvanie->Checked = false;

Library->Sort(SortData);

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*)Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor;

StringGrid1->Cells[1][i+1] = b->Nazvanie;

StringGrid1->Cells[2][i+1] = b->Data;

StringGrid1->Cells[3][i+1] = b->Kolvo;

}

}

//---------------------------------------------------------------------------

void __fastcall TMain::N6Click(TObject *Sender)

{

Dialog->Show();

}

//---------------------------------------------------------------------------

void __fastcall TMain::ComboBox2Change(TObject *Sender)

{

if(ComboBox2->ItemIndex == 0 )

{

TabSheet1->Show();

Library->Sort(SortAvtor);

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*)Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor;

StringGrid1->Cells[1][i+1] = b->Nazvanie;

StringGrid1->Cells[2][i+1] = b->Data;

StringGrid1->Cells[3][i+1] = b->Kolvo;

}

}

if(ComboBox2->ItemIndex == 1)

{

TabSheet1->Show();

Library->Sort(SortNazvanie);

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*)Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor;

StringGrid1->Cells[1][i+1] = b->Nazvanie;

StringGrid1->Cells[2][i+1] = b->Data;

StringGrid1->Cells[3][i+1] = b->Kolvo;

}

}

if(ComboBox2->ItemIndex == 2)

{

TabSheet1->Show();

Library->Sort(SortData);

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*)Library->Items[i];

StringGrid1->Cells[0][i+1] = b->Avtor;

StringGrid1->Cells[1][i+1] = b->Nazvanie;

StringGrid1->Cells[2][i+1] = b->Data;

StringGrid1->Cells[3][i+1] = b->Kolvo;

}

}

}

//---------------------------------------------------------------------------

void __fastcall TMain::CheckBox1Click(TObject *Sender)

{

if(CheckBox1->Checked)

{

DelBook->Visible = false;

Label5->Visible = false;

}

else

{

DelBook->Visible = true;

Label5->Visible = true;

}

}

//---------------------------------------------------------------------------

void __fastcall TMain::Button1Click(TObject *Sender)

{

StringGrid2->Cells[0][0]="ФИО автора";

StringGrid2->Cells[1][0]="Название книги";

StringGrid2->Cells[2][0]="Год издания";

StringGrid2->Cells[3][0]="Количество экземпляров";

for(int i = 1;i <=Library->Count;i++)

{

StringGrid2->Cells[0][i]="";

StringGrid2->Cells[1][i]="";

StringGrid2->Cells[2][i]="";

StringGrid2->Cells[3][i]="";

}

int j=1;

if(RadioFio->Checked)

{

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*)Library->Items[i];

if((AnsiPos(FindEdit->Text,b->Avtor)==True))

{

StringGrid2->Cells[0][j] = b->Avtor;

StringGrid2->Cells[1][j] = b->Nazvanie;

StringGrid2->Cells[2][j] = b->Data;

StringGrid2->Cells[3][j] = b->Kolvo;

j++;

}

}

}

if(RadioNazvanie->Checked)

{

for(int i = 0;i < Library->Count;i++)

{

Book*b = (Book*)Library->Items[i];

if(AnsiPos(FindEdit->Text,b->Nazvanie)==True)

{

StringGrid2->Cells[0][j] = b->Avtor;

StringGrid2->Cells[1][j] = b->Nazvanie;

StringGrid2->Cells[2][j] = b->Data;

StringGrid2->Cells[3][j] = b->Kolvo;

j++;

}

}

}

}

//---------------------------------------------------------------------------

4 Тестирование

При тестировании программы были созданы различные варианты возможных условий работы программы.

Тестирование проводилось под операционной системой Windows XP.

Тестирование не выявило ошибок в работе программы. Таким образом, можно утверждать, что в результате выполнения работы была создана функционально завершенная программа

рис. 1 – просмотр всех книг в библиотеке

рис 2. – добавление новой книги

рис. 3 – поиск книг

Заключение

В результате выполнения работы была создана программа, реализующая учет книг в библиотеке. Программа была протестирована и удовлетворяет всем требованиям, перечисленным при анализе задачи. При написании программы использовались средства объектно-ориентированного программирования среды C++ Builder.

Список используемой литературы:

1. «Объектно – ориентированное программирование », Павловская Т. А., Щупак Ю. А., «Питер», 2005 г.

2. http://www.citforum.ru/programming/application/cb2.shtml

3. «Энциклопедия программиста », Калверт Ч., Рейсдорф К., 2005

22

Соседние файлы в папке Рабочий стол