Программирование на C / C++ / Курсовая работа - Учет книг в библиотке / Рабочий стол / пояснилка
.doc-
Постановка задачи
Написать программу учета книг в библиотеке.
Сведения о книгах содержат: фамилию и инициалы автора, название, год издания, количество экземпляров данной книги в библиотеке.
Программа должна обеспечить выбор с помощью меню и выполнение одной из следующий функций:
-
Добавление данных о книгах вновь поступающих в библиотеку;
-
Удаление данных о списываемых книгах;
-
Выдача сведений о всех книгах, упорядоченных по фамилиям авторов;
-
Выдача сведений о всех книгах, упорядоченных по годам издания.
Хранение данных организовать с применением контейнерного класса 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