Программирование на C / C++ / Курсовые работы / курсовая Библиотека / пояснилка / poyasnilka
.pdf8. Текст кода программы
//---------------------------------------------------------------------------
#include <vcl.h> #include<string> #include <iostream> using namespace std; #include <fstream.h> #pragma hdrstop #include "HomeLib.h"
//---------------------------------------------------------------------------
#pragma package(smart_init) #pragma resource "*.dfm" TfrmMain *frmMain;
//---------------------------------------------------------------------------
class cJanr
{
public:
int ID; //номер жанра из базы bJanr; String NAM; //название жанра из базы
}; //---------------------------------------------------------------------------
class cPolka
{
public:
int ID; // номер полки из базы bPolka String NAM; //название полки из базы
}; //---------------------------------------------------------------------------
class cBook
{
public:
int ID;//
String AVTOR;//
String NAME;//
int GOD;// cJanr JANR;//
cPolka POLKA;//
}; //---------------------------------------------------------------------------
//мои глобальные переменные cBook *B,*BB;
cJanr *J; cPolka *P;
cBook BOOK;
int countB,countB0,countJ,countP,K,Act,sortP; bool memVisible;
//---------------------------------------------------------------------------
//заполняем главный массив B[1..N] из баз bBooks,bJanr,bPolka void LoadArrayB()
{ //открываю потоки, завожу переменные буфера
// и считываю строку с кол-вом записей ifstream fBook("bBook.hlb",ios::in);
char bufB[180]; fBook.getline(bufB,180+1); countB=atoi(bufB); countB0=2*countB;
ifstream fPolka("bPolka.hlb",ios::in); char bufP[180]; fPolka.getline(bufP,180+1); countP=atoi(bufP);
ifstream fJanr("bJanr.hlb",ios::in); char bufJ[180]; fJanr.getline(bufJ,180+1); countJ=atoi(bufJ);
//главная и временные доп.базы для JANR и POLKA delete []B;
B=new cBook[countB+2];
J=new cJanr[countJ+1];
P=new cPolka[countP+1];
//заполняем доп.массив J for(int i=0;i<countJ+1;i++)
{
fJanr.get(bufJ,180,'$'); J[i].ID=atoi(bufJ); fJanr.ignore(180,'$'); fJanr.get(bufJ,180,'\n'); J[i].NAM=bufJ; fJanr.ignore(180,'\n');
}
fJanr.close();
//заполняем доп.массив P for(int i=0;i<countP+1;i++)
{
fPolka.get(bufP,180,'$'); P[i].ID=atoi(bufP); fPolka.ignore(180,'$'); fPolka.get(bufP,180,'\n'); P[i].NAM=bufP; fPolka.ignore(180,'\n');
}
fPolka.close();
//заполняем главный массив B for(int i=1;i<countB+1;i++)
{
fBook.get(bufB,180,'$'); B[i].ID=atoi(bufB); fBook.ignore(180,'$'); fBook.get(bufB,180,'$'); B[i].AVTOR=bufB; fBook.ignore(180,'$'); fBook.get(bufB,180,'$');
B[i].NAME=bufB; fBook.ignore(180,'$');
fBook.get(bufB,180,'$'); B[i].GOD=atoi(bufB);
fBook.ignore(180,'$'); fBook.get(bufB,180,'$'); B[i].JANR.ID=atoi(bufB); B[i].JANR.NAM=J[B[i].JANR.ID].NAM; fBook.ignore(180,'$'); fBook.get(bufB,180,'\n'); B[i].POLKA.ID=atoi(bufB); B[i].POLKA.NAM=P[B[i].POLKA.ID].NAM; fBook.ignore(120,'\n');
} fBook.close();
}
//---------------------------------------------------------------------------
//сохраняем главный массив B[] void SaveArrayB()
{
ofstream fBook("bBook.hlb",ios::out|ios::trunc); fBook<<IntToStr(countB).c_str()<<"\n";
for(int i=1;i<countB+1;i++)
{
fBook<<IntToStr(B[i].ID).c_str()<<'$'; fBook<<B[i].AVTOR.c_str()<<'$'; fBook<<B[i].NAME.c_str()<<'$'; fBook<<IntToStr(B[i].GOD).c_str()<<'$';
fBook<<IntToStr(B[i].JANR.ID).c_str()<<'$'; fBook<<IntToStr(B[i].POLKA.ID).c_str()<<'\n';
}
fBook.close();
}
//---------------------------------------------------------------------------
void LoadView()
{
frmMain->lstB->Clear(); TListItem* item;
for (int i=1;i<countB+1;i++)
{
item=frmMain->lstB->Items->Add(); item->Caption =B[i].ID; item->SubItems->Add(B[i].AVTOR); item->SubItems->Add(B[i].NAME); item->SubItems->Add(B[i].GOD); item->SubItems->Add(B[i].JANR.NAM); item->SubItems->Add(B[i].POLKA.NAM);
}
frmMain->lstB->ItemIndex=0;
//грузим доп.базы в выпадающие списки frmMain->cmbJANR->Clear();
for (int i=0;i<countJ+1;i++)
{
frmMain->cmbJANR->Items->Add(J[i].NAM);
}
//грузим доп.базы в выпадающие списки frmMain->cmbPOLKA->Clear();
for (int i=0;i<countP+1;i++)
{
frmMain->cmbPOLKA->Items->Add(P[i].NAM);
}
//грузим доп.базы в выпадающие списки frmMain->cmbGOD->Clear();
for (int i=1900;i<2005;i++)
{
frmMain->cmbGOD->Items->Add(i);
}
} //---------------------------------------------------------------------------
void SetActiveBOOK()
{
if (frmMain->lstB->ItemFocused)
{
K=frmMain->lstB->ItemIndex+1; BOOK=B[K]; frmMain->edtAVTOR->Text=BOOK.AVTOR; frmMain->edtNAME->Text=BOOK.NAME;
frmMain->cmbGOD->ItemIndex=BOOK.GOD-1900; frmMain->cmbJANR->ItemIndex=BOOK.JANR.ID; frmMain->cmbPOLKA->ItemIndex=BOOK.POLKA.ID;
frmMain->btnEdit->Enabled=true; frmMain->btnAdd->Enabled=true;}} //---------------------------------------------------------------------------
bool Check()
{
bool flag=true;
if (frmMain->edtAVTOR->Text=="") {flag=false;}
if (frmMain->edtNAME->Text=="") {flag=false;}
if (!flag)
{frmMain->Info("Была допущена ошибка: поля не могут быть пустыми! Продолжайте работу.");}
return flag;
}
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
LoadArrayB();
LoadView();
frmMain->lblInfo->Caption="База загружена. Выберите действие/запись-действие.";
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::lstBSelectItem(TObject *Sender, TListItem *Item, bool Selected)
{
SetActiveBOOK();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnEditClick(TObject *Sender)
{
Act=1;
//
frmMain->lstB->Enabled=false; frmMain->btnEdit->Enabled=false; frmMain->btnAdd->Enabled=false; frmMain->btnDel->Enabled=false; frmMain->btnSearch->Enabled=false;
frmMain->btnSort->Enabled=false; //! frmMain->edtAVTOR->Enabled=true; frmMain->edtAVTOR->ReadOnly=false; frmMain->edtNAME->Enabled=true;
frmMain->edtNAME->ReadOnly=false; frmMain->cmbGOD->Enabled=true; frmMain->cmbJANR->Enabled=true; frmMain->cmbPOLKA->Enabled=true;
//
frmMain->btnGo->Enabled=true; frmMain->btnGo->Caption="Применить"; frmMain->Info("Измените поля записи и нажмите 'Применить'");
} //---------------------------------------------------------------------------
void __fastcall TfrmMain::btnGoClick(TObject *Sender) {
if ((Act==1)&&(Check()))//изменение {
B[K].AVTOR=frmMain->edtAVTOR->Text;
B[K].NAME=frmMain->edtNAME->Text; B[K].GOD=atoi(frmMain->cmbGOD->Text.c_str()); B[K].JANR.ID=frmMain->cmbJANR->ItemIndex; B[K].JANR.NAM=frmMain->cmbJANR->Text; B[K].POLKA.ID=frmMain->cmbPOLKA->ItemIndex; B[K].POLKA.NAM=frmMain->cmbPOLKA->Text; frmMain->Info("Запись успешно изменена. Продолжайте работу.");
}
if ((Act==2)&&(Check()))//добавление
{
countB++;
K=countB;
//
B[K].ID=K;
B[K].AVTOR=frmMain->edtAVTOR->Text;
B[K].NAME=frmMain->edtNAME->Text; B[K].GOD=atoi(frmMain->cmbGOD->Text.c_str()); B[K].JANR.ID=frmMain->cmbJANR->ItemIndex; B[K].JANR.NAM=frmMain->cmbJANR->Text; B[K].POLKA.ID=frmMain->cmbPOLKA->ItemIndex; B[K].POLKA.NAM=frmMain->cmbPOLKA->Text; SaveArrayB();
LoadArrayB();
frmMain->Info("Запись успешно добавлена. Продолжайте работу.");
}
if (Act==3)//удаление
{
for (int i=K;i<countB;i++)
{
B[i]=B[i+1];
B[i].ID=i;
}
countB--; SaveArrayB(); LoadArrayB();
frmMain->Info("Запись успешно удалена. Продолжайте работу.");
}
//
frmMain->lstB->Enabled=true; frmMain->btnEdit->Enabled=true; frmMain->btnAdd->Enabled=true; frmMain->btnDel->Enabled=true; frmMain->btnSearch->Enabled=true; frmMain->btnSort->Enabled=true;
frmMain->btnExit->Enabled=true; //! frmMain->edtAVTOR->Enabled=false; frmMain->edtAVTOR->ReadOnly=true; frmMain->edtNAME->Enabled=false;
frmMain->edtNAME->ReadOnly=true; frmMain->cmbGOD->Enabled=false; frmMain->cmbJANR->Enabled=false; frmMain->cmbPOLKA->Enabled=false; frmMain->btnGo->Enabled=false;
//
LoadView(); frmMain->lstB->Refresh(); frmMain->lstB->ItemFocused=frmMain->lstB->Items->Item[K-1]; SetActiveBOOK();
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnAddClick(TObject *Sender)
{
Act=2; //
frmMain->lstB->Enabled=false; frmMain->btnEdit->Enabled=false; frmMain->btnAdd->Enabled=false; frmMain->btnDel->Enabled=false; frmMain->btnSearch->Enabled=false; frmMain->btnSort->Enabled=false; //! frmMain->edtAVTOR->Enabled=true;
frmMain->edtAVTOR->ReadOnly=false; frmMain->edtAVTOR->Text=""; frmMain->edtNAME->Enabled=true; frmMain->edtNAME->ReadOnly=false; frmMain->edtNAME->Text=""; frmMain->cmbGOD->Enabled=true;
frmMain->cmbGOD->ItemIndex=0; frmMain->cmbJANR->Enabled=true; frmMain->cmbJANR->ItemIndex=0; frmMain->cmbPOLKA->Enabled=true; frmMain->cmbPOLKA->ItemIndex=0;
//
frmMain->btnGo->Enabled=true; frmMain->btnGo->Caption="Создать";
frmMain->Info("Введите поля новой записи и нажмите 'Создать'");
//
}
//---------------------------------------------------------------------------
void TfrmMain::Info(String text)
{
frmMain->lblInfo->Caption=text;
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnDelClick(TObject *Sender)
{
Act=3;
//
if (6==MessageBox(frmMain->Handle,"Это удалит текущую запись, продолжить?","",MB_YESNO)) { frmMain->lstB->Enabled=false; frmMain->btnEdit->Enabled=false; frmMain->btnAdd->Enabled=false;
frmMain->btnDel->Enabled=false; frmMain->btnSearch->Enabled=false; frmMain->btnSort->Enabled=false; //!
frmMain->btnGo->Enabled=true; frmMain->btnGo->Caption="Удалить"; frmMain->Info("Проверьте поля записи и нажмите 'Удалить'");
}
//
} //---------------------------------------------------------------------------
void __fastcall TfrmMain::btnExitClick(TObject *Sender)
{
void Sort(int pole); Sort(1);
SaveArrayB(); Close();
} //---------------------------------------------------------------------------
void __fastcall TfrmMain::btnSearchClick(TObject *Sender) {
String pStr=edtSearch->Text; String Str;
int countS=0;
for (int i=1;i<countB+1;i++) {
Str=""; Str=Str+IntToStr(B[i].ID)+" "; Str=Str+B[i].AVTOR+" "; Str=Str+B[i].NAME+" "; Str=Str+IntToStr(B[i].GOD)+" "; Str=Str+B[i].JANR.NAM+" "; Str=Str+B[i].POLKA.NAM;
//
lstB->Items->Item[i-1]->Selected=false; Str=Str.UpperCase();
if (Str.Pos(pStr.UpperCase())!=0)
{
countS++;
lstB->Items->Item[i-1]->Selected=true;
}
}
Str="по вашему запросу '"+pStr;
Str=Str+"' найдено "+IntToStr(countS)+" книг(и). Продолжайте работу."; lblInfo->Caption=Str;
}
//---------------------------------------------------------------------------
void Sort(int pole)
{
bool Usl(int pole,int i1,int i2); const n=countB;
int d=n/2; int obmen,i; while (d>0) {obmen=1;
while (obmen!=0) {obmen=0;
for (i=1;i<=n-d;i++) {if (Usl(pole,i,i+d)) {cBook book=B[i];
B[i]=B[i+d];
B[i+d]=book;
obmen=1;}}}
d=d/2;}
}
//---------------------------------------------------------------------------
bool Usl(int pole,int i1,int i2)
{
bool b=false;
if (pole==1) //ID {if (B[i1].ID>B[i2].ID) {b=true;}}
if (pole==2) //AVTOR {if (B[i1].AVTOR>B[i2].AVTOR)
{b=true;}} if (pole==3) //NAME
{if (B[i1].NAME>B[i2].NAME) {b=true;}}
if (pole==4) //GOD {if (B[i1].GOD>B[i2].GOD)
{b=true;}} return b;
} //---------------------------------------------------------------------------
void __fastcall TfrmMain::btnSortClick(TObject *Sender) {
if (rbtnGOD->Checked==true) {Sort(4);}
if (rbtnAVTOR->Checked==true) {Sort(2);}
if (rbtnNAME->Checked==true) {Sort(3);}
//
LoadView(); lstB->Refresh(); // Sort(1);
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::lblInfoClick(TObject *Sender) {memAbout->Visible=true; } //---------------------------------------------------------------------------
void __fastcall TfrmMain::memAboutClick(TObject *Sender) { memAbout->Visible=false; }
9.Список использованной литературы
1.Тимофеев В.В. "С/С++ Программирование в среде С++ Builder 5"
2.Стэфан Р. Дэвис "C++ для чайников" :))
3.Джэфф Элджер "С++ Библиотека программиста"
4.Лекции по МППА, преп.: Селиванова М.В.
5.Материалы сети Internet: www.ishodniki.ru, www.BuilderClub.ru, www.progman.ru