Скачиваний:
74
Добавлен:
02.05.2014
Размер:
1.41 Mб
Скачать

8. Текст кода программы

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

#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

Соседние файлы в папке пояснилка