close

Вход

Забыли?

вход по аккаунту

?

9.Текст прог

код для вставкиСкачать
СОДЕРЖАНИЕ
1Модуль классов ClassUnit.h для наследования5
1.1Класс динамического массива указателей TArrayPtr5
1.2Базовый класс TCBase5
1.3Описание классов TPassagir, TReise, TAirport5
2Модуль основных функций Proc.h6
2.1Конструктор TCArrayPtr() и деструктор ~TCArrayPtr()6
2.2ExpendArray()6
2.3Функция поиска FindSortElem6
2.4Функция добавление элемента AddElem7
2.5Функция удаления элемента DelElem7
3Модуль взаимодействия с визуальными компонентами MainUnit.cpp7
3.1Создание нового списка8
3.2Вызов форм для добавления елементов8
3.3Удаления елементов9
3.4Отображение полей в ListView10
3.5Очистка TreeView и ListView11
3.6Сохранение списка в файл12
3.7Загрузка списка из файла12
3.8Архивация12
3.9Регистрация в реестре12
3.10Вызов справки12
4Модуль дабавления аэропортов AirUnit.cpp13
5Модуль дабавления рейсов ReiseUnit.cpp13
6Модуль дабавления пассажиров PassagirUnit.cpp14
7Модуль работы с файлами14
7.1Функция сохранение мультисписка в файл14
7.2Функция загрузки мультисписка из файла16
8Реализация с помощью шаблонов17
8.1Описание классов17
8.2Реализация функции поиска18
8.3Модуль для работы с аэропортами19
9Реализация с помощью функционального типа19
9.1Описание классов и структур19
9.2Реализация функции поиска20
9.3Модуль работы с аэропортами21
10Реализация с помощью функционального класса22
10.1Описание классов и структур22
10.2Реализация функции поиска23
10.3Модуль работы с аэропортами24
1 МОДУЛЬ КЛАССОВ CLASSUNIT.H ДЛЯ НАСЛЕДОВАНИЯ
1.1 Класс динамического массива указателей TArrayPtr
//Класс динамического массива указателей
class TCArrayPtr // класс динамического массива указателей
{
private:
int SizeArr; // размер массива
int CountElem; // количество элементов в массиве
int DeltaArr; // приращение массива
TCBase **ArrPtr; // указатель на массив указателей
void ExpendArray(); // увеличение размера массива указателей
int FindSortElem(TCBase* Elem); // поиск элемента
int FindSortElem(AnsiString key);
public:
TCArrayPtr(); // конструктор (инициализирует массив)
~TCArrayPtr(); // деструктор (удаляет массив)
int GetCountElem(){return CountElem;}; // возвращает количество элементов в массиве
void AddElem(TCBase *Elem); // добавление элемента
void DelElem(AnsiString key); // удаление элемента
TCBase* ChangeElem(AnsiString key); // удаление элемента
TCBase* operator [] (int i) // перегрузка оператора индексации
{return (ArrPtr[i]);};
TCBase* operator [] (AnsiString key) // перегрузка оператора индексации
{ return ArrPtr[FindSortElem(key)]; };
};
1.2 Базовый класс TCBase
class TCBase
{
public:
TCArrayPtr* ArrayElem;
~TCBase(){ if (ArrayElem != NULL) delete ArrayElem;}; // деструктор
virtual AnsiString GetKey() = 0;
// переопределение операторов сравнения
bool operator > (TCBase *Elem) { return GetKey() > Elem->GetKey(); };
bool operator < (TCBase *Elem) { return GetKey() < Elem->GetKey(); };
bool operator > (AnsiString Key) { return GetKey() > Key; };
bool operator < (AnsiString Key) { return GetKey() < Key; };
};
1.3 Описание классов TPassagir, TReise, TAirport
class TPass: public TCBase
{
private:
AnsiString FIO; // FIO
public:
TPass() { ArrayElem= NULL;};
void SetKey(AnsiString Str ) {FIO = Str;};
AnsiString GetKey() {return FIO;}; };// class TReise: public TCBase
{
private:
AnsiString number; // номер
AnsiString time_in; // время вылета
public:
TReise() { ArrayElem= new TCArrayPtr;};
void SetKey( AnsiString Str ) {number = Str;};
AnsiString GetKey() {return number;};
void Setcook( AnsiString Str ) {time_in = Str;};
AnsiString Getcook(){return time_in;};
};//
class TAirport: public TCBase
{
private:
AnsiString name; // название аэропорта
AnsiString country; // количество
public:
TAirport(){ ArrayElem= new TCArrayPtr;};
void SetKey(AnsiString Str) {name = Str;};
AnsiString GetKey() {return name;};
void SetCountry(AnsiString k) { country = k;};
AnsiString GetCountry() {return country;};
};
2 МОДУЛЬ ОСНОВНЫХ ФУНКЦИЙ PROC.H
2.1 Конструктор TCArrayPtr() и деструктор ~TCArrayPtr()
TCArrayPtr::TCArrayPtr()
{
SizeArr=CSizeArr; // размер массива
CountElem=0; // количество элементов в массиве
DeltaArr=CDeltaArr; // приращение
ArrPtr=new TCBase *[SizeArr]; // создаём массив указателей
}// TCArrayPtr
TCArrayPtr::~TCArrayPtr()
{
for(int i=0; i< CountElem; i++)
delete ArrPtr[i];
delete [] ArrPtr;
}// ~TArrayPtr
2.2 ExpendArray()
// Увеличение размера массива указателей
void TCArrayPtr::ExpendArray()
{
TCBase** wArrPtr=new TCBase *[SizeArr+DeltaArr]; // создаём новый массив
for(int i=0; i< CountElem; i++)
wArrPtr[i]= ArrPtr[i];
SizeArr += DeltaArr;
delete [] ArrPtr;
ArrPtr= wArrPtr;
}// ExpendArray()
2.3 Функция поиска FindSortElem int TCArrayPtr::FindSortElem(AnsiString key)
{ int Low= 0; // текущие границы массива - верхняя
int Hi= CountElem-1; // и нижняя
while (Low <= Hi)
{
int Middl= (Hi + Low)/2;
if (*(ArrPtr[Middl])> key) Hi= Middl-1; // не используя функций
else
if (*(ArrPtr[Middl])< key) Low= Middl+1;
else return (Middl);
}
return (Low); // Перебран вест массив.Определена позиция
}// FindSortElem
int TCArrayPtr::FindSortElem(TCBase* Elem)
{ int Low= 0; // текущие границы массива - верхняя
int Hi= CountElem-1; // и нижняя
while (Low <= Hi)
{
// средняя граница обрабатываемой части массива
int Middl= (Hi + Low)/2;
if (*(ArrPtr[Middl])> Elem) Hi= Middl-1; // не используя функций
else
if (*(ArrPtr[Middl])< Elem) Low= Middl+1;
else return (Middl);
}
return (Low); // Перебран вест массив.Определена позиция
// возможной вставки нового элемента
}// FindSortElem
//---------------------------------------------------------------------------
2.4 Функция добавление элемента AddElem
// добавление элемента
// получает указатель на элемент void TCArrayPtr::AddElem(TCBase *Elem)
{
if (SizeArr == CountElem) ExpendArray();
int PosElem= FindSortElem(Elem);
for(int i= CountElem; i >= PosElem+1; i--)
ArrPtr[i]= ArrPtr[i-1];
ArrPtr[PosElem]= Elem;
CountElem++;
return;
}// AddElem
2.5 Функция удаления элемента DelElem
void TCArrayPtr::DelElem(AnsiString key)
{
int PosDelElem= FindSortElem(key);
delete ArrPtr[PosDelElem];
for(int i= PosDelElem; i < CountElem-1; i++)
ArrPtr[i]= ArrPtr[i+1]; // смещение на одну позицию вверх
CountElem--;
return;
}// DelElem
3 МОДУЛЬ ВЗАИМОДЕЙСТВИЯ С ВИЗУАЛЬНЫМИ КОМПОНЕНТАМИ MAINUNIT.CPP
#include <vcl.h>
#pragma hdrstop
#include "MainUnit.h"
#include "ClassUnit.h"
#include "ClassUnit.cpp"
#include "AirUnit.h"
#include "ReiseUnit.h"
#include "PassagirUnit.h"
#include <Registry.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
DynamicArray<AnsiString> StrNode;
TCArrayPtr *HeadList;
bool FlOpen= false;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
int FindNode()
{
int Level;
StrNode.set_length(0);
TTreeNode *PNode= Form1->TreeView1->Selected;
for(Level= 0; PNode != NULL; Level++)
{
StrNode.set_length(StrNode.Length+1);
StrNode[Level]= PNode->Text;
PNode= PNode->Parent;
}
return Level;
}
// FindNode
3.1 Создание нового списка
//---------------------------------------------------------------------------
void __fastcall TForm1::NewActionExecute(TObject *Sender)
{
if (FlOpen)
{
MessageDlg("Необходимо очистить текущий список !",
mtError, TMsgDlgButtons() << mbOK, 0);
return;
}
AnsiString str= "Украинские авиалини";
if (!InputQuery("Создание нового списка", "Введите название", str)) return;
TreeView1->Items->AddFirst(NULL, str);
FlOpen= true;
}// NewActionExecute
3.2 Вызов форм для добавления елементов
void __fastcall TForm1::AddElemActionExecute(TObject *Sender)
{
int Level= FindNode();
switch (Level)
{
case 0:
if (TreeView1->Items->Count == 0)
MessageDlg("Загрузите или создайте новый список !",
mtError, TMsgDlgButtons() << mbOK, 0);
else
MessageDlg("Выберите узел для добавления !",
mtError, TMsgDlgButtons() << mbOK, 0);
return;
case 1:
Form2->Button2->Enabled= false;
Form2->Show();
Form2->Button1->Enabled= true;
break;
case 2:
Form3->Button2->Enabled= false;
Form3->Show();
Form3->Button1->Enabled= true;
break;
case 3:
Form4->Button2->Enabled= false;
Form4->Show();
Form4->Button1->Enabled= true;
break;
}
}// AddActionExecute
3.3 Удаления елементов
void __fastcall TForm1::DelElemActionExecute(TObject *Sender)
{
int Level= FindNode();
switch (Level)
{
case 0:
if (TreeView1->Items->Count == 0)
MessageDlg("Загрузите или создайте новый список !",
mtError, TMsgDlgButtons() << mbOK, 0);
else
MessageDlg("Выберите узел для добавления !",
mtError, TMsgDlgButtons() << mbOK, 0);
return;
case 2:
{
HeadList->DelElem(StrNode[0]);
TTreeNode *pNode= TreeView1->Selected->Parent;
TreeView1->Selected->Delete();
pNode->Selected= true;
break;
}
case 3:
{
TCBase *Node= (*HeadList)[StrNode[1]];
// Node->ArrayElem->DelElem(StrNode[0]);
TAirport *Airport = dynamic_cast<TAirport*>(Node);
Airport->ArrayElem->DelElem(StrNode[0]);
TTreeNode *pNode= TreeView1->Selected->Parent;
TreeView1->Selected->Delete();
pNode->Selected= true;
break;
}
case 4:
{
TCBase *Node= (*HeadList)[StrNode[2]];
Node= (*(Node->ArrayElem))[StrNode[1]];
// Node->ArrayElem->DelElem(StrNode[0]);
TReise *Reise = dynamic_cast<TReise*>(Node);
Reise->ArrayElem->DelElem(StrNode[0]);
TTreeNode *pNode= TreeView1->Selected->Parent;
TreeView1->Selected->Delete();
pNode->Selected= true;
break;
};
}
}// DelActionExecute
3.4 Отображение полей в ListView
//---------------------------------------------------------------------------
void __fastcall TForm1::TreeView1Change(TObject *Sender, TTreeNode *Node)
{
int Level=FindNode();
ListView1->Columns->Clear();
switch (Level)
{
case 1:
{
if (TreeView1->Items->Item[0]->Count == 0)
{
ListView1->Columns->Clear();
return;
}
ListView1->Columns->Add();
ListView1->Column[0]->Width = 150;
ListView1->Column[0]->Caption = "Название аэропорта";
ListView1->Columns->Add();
ListView1->Column[1]->Width = 150;
ListView1->Column[1]->Caption = "Страна";
ListView1->Columns->Add();
ListView1->Column[2]->Width = 150;
ListView1->Column[2]->Caption = "город";
ListView1->Items->Clear();
int Cnt= HeadList->GetCountElem();
for(int i=0; i< Cnt; i++)
{
ListView1->Items->Add();
ListView1->Items->Item[i]->Caption=(*HeadList)[i]->GetKey();
ListView1->Items->Item[i]->SubItems->Add
(((TAirport*)(*HeadList)[i])->GetCountry());
}
break;
};
case 2:
{
TCBase *Node= (*HeadList)[StrNode[0]];
TAirport *Airport = dynamic_cast<TAirport*>(Node);
if (Airport->ArrayElem->GetCountElem() == 0) return;
ListView1->Columns->Add();
ListView1->Column[0]->Width = 150;
ListView1->Column[0]->Caption = "Номер рейса";
ListView1->Columns->Add();
ListView1->Column[1]->Width = 150;
ListView1->Column[1]->Caption = "Время вылета";
ListView1->Columns->Add();
ListView1->Column[2]->Width = 150;
ListView1->Column[2]->Caption = "Время прибытия";
ListView1->Items->Clear();
int Cnt= Airport->ArrayElem->GetCountElem();
for(int i=0; i< Cnt; i++)
{
ListView1->Items->Add();
ListView1->Items->Item[i]->Caption=
((*(Airport->ArrayElem))[i])->GetKey();
ListView1->Items->Item[i]->SubItems->Add
(((TReise*)(*(Airport->ArrayElem))[i])->Getcook());
}
break;
};
case 3:
{
// поиск аэропорту которому принадлежит рейс
TCBase *Node= (*HeadList)[StrNode[1]];
// поиск рейса которму принадлежит пассажир
Node= (*(Node->ArrayElem))[StrNode[0]];
TReise *Reise = dynamic_cast<TReise*>(Node);
if (Reise->ArrayElem->GetCountElem() == 0) return;
ListView1->Columns->Add();
ListView1->Column[0]->Width = 150;
ListView1->Column[0]->Caption = "ФИО пассажира";
ListView1->Items->Clear();
int Cnt= Reise->ArrayElem->GetCountElem();
for(int i=0; i< Cnt; i++)
{
ListView1->Items->Add();
ListView1->Items->Item[i]->Caption=
((*(Reise->ArrayElem))[i])->GetKey();
}
break;
};
}
ShowTreeView(AnsiString FirstNode)
{
Form1->TreeView1->Items->Clear();
TTreeNode *NodeAir= Form1->TreeView1->Items->AddFirst(NULL, FirstNode);
int CntAir= HeadList->GetCountElem();
for(int i1=0; i1 < CntAir; i1++)
{
TTreeNode *NodeReise=Form1->TreeView1->Items->AddChild
(NodeAir, (*HeadList)[i1]->GetKey());
TCArrayPtr* HeadReise= ((*HeadList)[i1])->ArrayElem;
if ((*HeadList)[i1]->ArrayElem== NULL) continue;
int CntReise= HeadReise->GetCountElem();
for(int i2=0; i2 < CntReise; i2++)
{
TTreeNode *NodePass=Form1->TreeView1->Items->AddChild
(NodeReise, (*HeadReise)[i2]->GetKey());
TCArrayPtr* HeadPass= ((*HeadReise)[i2])->ArrayElem;
if ((*HeadReise)[i2]->ArrayElem== NULL) continue;
int CntPass= HeadPass->GetCountElem();
for(int i3=0; i3 < CntPass; i3++)
Form1->TreeView1->Items->AddChild
(NodePass, (*HeadPass)[i3]->GetKey());
}
}
}// ShowTreeView
3.5 Очистка TreeView и ListView
void __fastcall TForm1::ClearTreeActionExecute(TObject *Sender)
{
TreeView1->Items->Clear();
ListView1->Items->Clear();
FlOpen= false;
3.6 Сохранение списка в файл
void __fastcall TForm1::SaveActionExecute(TObject *Sender)
{
DWORD idThread;
HANDLE hThread = CreateThread(NULL,0,SaveToFile,(LPVOID)TreeView1->Items->Item[0]->Text.c_str(), 0, &idThread);
WaitForSingleObject(hThread, INFINITE);
MessageDlg("Список успешно сохранен !",mtInformation, TMsgDlgButtons() << mbOK, 0);
}
3.7 Загрузка списка из файла
void __fastcall TForm1::LoadActionExecute(TObject *Sender)
{
if (FlOpen == true)
{
MessageDlg("Необходимо очистить старый список !",
mtWarning, TMsgDlgButtons() << mbOK, 0);
return;
}
if (!OpenDialog1->Execute()) return;
DWORD idThread;
HANDLE hThread = CreateThread(NULL,0,LoadFromFile,(LPVOID)OpenDialog1->FileName.c_str(), 0,
&idThread);
WaitForSingleObject(hThread, INFINITE); int indx= ComboBox1->Items->IndexOf(OpenDialog1->FileName);
if (indx == -1)
ComboBox1->Items->Add(OpenDialog1->FileName);
AnsiString str= OpenDialog1->FileName;
while(str.Pos("\\") != 0) str.Delete(1, str.Pos("\\"));
ShowTreeView(str);
FlOpen= true;
}
3.8 Архивация
void __fastcall TForm1::ArhivActionExecute(TObject *Sender)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
CreateProcess(NULL,"winrar a -y -ierr airport *.*", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}
3.9 Регистрация в реестре
void __fastcall TForm1::RegistryActionExecute(TObject *Sender)
{
TRegistry* Registry = new TRegistry;
Registry->RootKey = HKEY_CURRENT_USER;
bool fl = Registry->OpenKey("SOFTWARE\\Airport", true);
Registry->WriteString("Kichko","Airport");
Registry->CloseKey(); delete Registry;
}
3.10 Вызов справки
void __fastcall TForm1::ToolButton16Click(TObject *Sender)
{
WinHelp(Form1->Handle, "HELP.HLP", HELP_CONTEXT, 1);
}
4 МОДУЛЬ ДАБАВЛЕНИЯ АЭРОПОРТОВ AIRUNIT.CPP
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
extern TCArrayPtr *HeadList;
extern DynamicArray<AnsiString> StrNode;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
TCBase *Elem= new TAirport;
TAirport *Elem1 = dynamic_cast<TAirport*>(Elem);
Elem1->SetKey(Edit1->Text);
Elem1->SetCountry(Edit2->Text);
if (HeadList == NULL) HeadList= new TCArrayPtr;
HeadList->AddElem(Elem);
Form1->TreeView1->Items->AddChildFirst(Form1->TreeView1->Selected, Elem->GetKey());
Form1->TreeView1->AlphaSort(true);
Form1->TreeView1->Selected->Expand(true);
Form1->TreeView1->OnChange(Form1->TreeView1, Form1->TreeView1->Selected);
}// BitBtn1Click
//---------------------------------------------------------------------------
void __fastcall TForm2::Button3Click(TObject *Sender)
{
Form2->Close();
}
5 МОДУЛЬ ДАБАВЛЕНИЯ РЕЙСОВ REISEUNIT.CPP
#include "ReiseUnit.h"
#include "ClassUnit.h"
#include "MainUnit.h"
#include "AirUnit.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
extern TCArrayPtr *HeadList;
extern DynamicArray<AnsiString> StrNode;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm3::Button1Click(TObject *Sender)
{
//TReise *Elem= new TReise;
TCBase *Elem= new TReise;
TReise *Elem1 = dynamic_cast<TReise*>(Elem);
Elem1->SetKey(Edit1->Text);
Elem1->Setcook(Edit2->Text);
TCBase *Node= (*HeadList)[StrNode[0]];
TAirport *Airport = dynamic_cast<TAirport*>(Node);
Airport->ArrayElem->AddElem(Elem);
Form1->TreeView1->Items->AddChildFirst(Form1->TreeView1->Selected, Elem->GetKey());
Form1->TreeView1->AlphaSort(true);
Form1->TreeView1->Selected->Expand(true);
Form1->TreeView1->OnChange(Form1->TreeView1, Form1->TreeView1->Selected);
}
void __fastcall TForm3::Button3Click(TObject *Sender)
{
Form3->Close();
}
6 МОДУЛЬ ДАБАВЛЕНИЯ ПАССАЖИРОВ PASSAGIRUNIT.CPP
#include "PassagirUnit.h"
#include "AirUnit.h"
#include "ClassUnit.h"
#include "MainUnit.h"
#include "ReiseUnit.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
extern TCArrayPtr *HeadList;
extern DynamicArray<AnsiString> StrNode;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm4::Button1Click(TObject *Sender)
{
//TPass *Elem= new TPass;
TCBase *Elem= new TPass;
TPass *Elem1 = dynamic_cast<TPass*>(Elem);
Elem1->SetKey(Edit1->Text);
TCBase *Node= (*HeadList)[StrNode[1]];
Node= (*(Node->ArrayElem))[StrNode[0]];
TReise *Reise = dynamic_cast<TReise*>(Node);
Reise->ArrayElem->AddElem(Elem);
Form1->TreeView1->Items->AddChildFirst(Form1->TreeView1->Selected, Elem->GetKey());
Form1->TreeView1->AlphaSort(true);
Form1->TreeView1->Selected->Expand(true);
Form1->TreeView1->OnChange(Form1->TreeView1, Form1->TreeView1->Selected);
}
void __fastcall TForm4::Button3Click(TObject *Sender)
{
Form4->Close();
}
7 МОДУЛЬ РАБОТЫ С ФАЙЛАМИ
extern TCArrayPtr *HeadList;
int CreateArrFile(HANDLE fl, int Size)
{
int fsize= GetFileSize(fl, NULL);
SetFilePointer(fl, 0, NULL, FILE_END);
DWORD dwCount;
for(int i= 0; i<= Size; i++)
WriteFile(fl, &Size, sizeof(Size), &dwCount, NULL);
return fsize;
}// CreateArrFile
7.1 Функция сохранение мультисписка в файл
// Сохранение файла
DWORD WINAPI SaveToFile(LPVOID FileName)
{
char *NFile= (char*)FileName; // Откроем файл
HANDLE hFile=
CreateFile(NFile, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 0, NULL);
if(!hFile) return false;
DWORD dwCount;
int CntAir= HeadList->GetCountElem();
int PosArrAir= CreateArrFile(hFile, CntAir);
for(int i1=0; i1 < CntAir; i1++)
{
SetFilePointer(hFile, PosArrAir+(i1+1)*sizeof(int), NULL, FILE_BEGIN);
int fsize= GetFileSize(hFile, NULL);
WriteFile(hFile, &fsize, sizeof(int), &dwCount, NULL);
SetFilePointer(hFile, 0, NULL, FILE_END);
TFAirport wRec;
strcpy(wRec.name, (*HeadList)[i1]->GetKey().c_str());
strcpy(wRec.country, ((TAirport*)(*HeadList)[i1])->GetCountry().c_str());
wRec.ArrReise= -1;
WriteFile(hFile, &wRec, sizeof(TFAirport), &dwCount, NULL);
if (((TAirport*)HeadList)->ArrayElem == NULL) continue;
TCArrayPtr* HeadReise= ((*HeadList)[i1])->ArrayElem;
int CntReise= HeadReise->GetCountElem();
int PosArrReise= CreateArrFile(hFile, CntReise);
SetFilePointer(hFile, PosArrReise-sizeof(int), NULL, FILE_BEGIN);
WriteFile(hFile, &PosArrReise, sizeof(int), &dwCount, NULL);
for(int i2=0; i2 < CntReise; i2++)
{
SetFilePointer(hFile, PosArrReise+(i2+1)*sizeof(int),
NULL, FILE_BEGIN);
int fsize= GetFileSize(hFile, NULL);
WriteFile(hFile, &fsize, sizeof(int), &dwCount, NULL);
SetFilePointer(hFile, 0, NULL, FILE_END);
TFReise wRecReise;
strcpy(wRecReise.number, (*HeadReise)[i2]->GetKey().c_str());
strcpy(wRecReise.time_in,
((TReise*)(*HeadReise)[i2])->Getcook().c_str());
wRecReise.ArrPassagir= -1;
WriteFile(hFile, &wRecReise, sizeof(TFReise), &dwCount, NULL);
if ((*HeadReise)[i2]->ArrayElem== NULL) continue;
TCArrayPtr* HeadPass= ((*HeadReise)[i2])->ArrayElem;
int CntPass= HeadPass->GetCountElem();
int PosArrPass= CreateArrFile(hFile, CntPass);
SetFilePointer(hFile, PosArrPass-sizeof(int), NULL, FILE_BEGIN);
WriteFile(hFile, &PosArrPass, sizeof(int), &dwCount, NULL);
for(int i3=0; i3 < CntPass; i3++)
{
SetFilePointer(hFile, PosArrPass+(i3+1)*sizeof(int),
NULL, FILE_BEGIN);
int fsize= GetFileSize(hFile, NULL);
WriteFile(hFile, &fsize, sizeof(int), &dwCount, NULL);
SetFilePointer(hFile, 0, NULL, FILE_END);
TFPassagir wRecPass;
strcpy(wRecPass.FIO,
(*HeadPass)[i3]->GetKey().c_str());
WriteFile(hFile, &wRecPass, sizeof(TFPassagir), &dwCount, NULL);
}
}
}
// Закроем файл
CloseHandle(hFile);
return true;
}// SaveToFile
7.2 Функция загрузки мультисписка из файла
DWORD WINAPI LoadFromFile(LPVOID FileName)
{
char *NFile= (char*)FileName;
// Откроем файл
HANDLE hFile=
CreateFile(NFile, GENERIC_READ,0, NULL, OPEN_EXISTING, 0, NULL);
if(!hFile) return false;
DWORD dwCount;
int CntAir;
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
ReadFile(hFile, &CntAir, sizeof(int), &dwCount, NULL);
HeadList = new TCArrayPtr;
for(int i1=0; i1 < CntAir; i1++)
{
TFAirport wRec;
SetFilePointer(hFile, (i1+1)*sizeof(int), NULL, FILE_BEGIN);
int PosElem;
ReadFile(hFile, &PosElem, sizeof(int), &dwCount, NULL);
SetFilePointer(hFile, PosElem, NULL, FILE_BEGIN);
ReadFile(hFile, &wRec, sizeof(TFAirport), &dwCount, NULL);
TAirport *Elem= new TAirport;
Elem->SetKey(wRec.name);
Elem->SetCountry(wRec.country);
Elem->ArrayElem = NULL;
HeadList->AddElem(Elem);
if(wRec.ArrReise == -1) continue;
int CntReise;
int PosArrReise= wRec.ArrReise;
ReadFile(hFile, &CntReise, sizeof(int), &dwCount, NULL);
TCArrayPtr* HeadReise= new TCArrayPtr;
((*HeadList)[i1])->ArrayElem= HeadReise;
for(int i2=0; i2 < CntReise; i2++)
{
TFReise wRecReise;
SetFilePointer(hFile, PosArrReise+(i2+1)*sizeof(int),
NULL, FILE_BEGIN);
int PosElem;
ReadFile(hFile, &PosElem, sizeof(int), &dwCount, NULL);
SetFilePointer(hFile, PosElem, NULL, FILE_BEGIN);
ReadFile(hFile, &wRecReise, sizeof(TFReise), &dwCount, NULL);
TReise *Elem= new TReise;
Elem->SetKey(wRecReise.number);
Elem->Setcook(wRecReise.time_in);
Elem->ArrayElem = NULL;
HeadReise->AddElem(Elem);
if(wRecReise.ArrPassagir == -1) continue;
int CntPass;
int PosArrPass= wRecReise.ArrPassagir;
ReadFile(hFile, &CntPass, sizeof(int), &dwCount, NULL);
TCArrayPtr* HeadPass= new TCArrayPtr;
((*HeadReise)[i2])->ArrayElem= HeadPass;
for(int i3=0; i3 < CntPass; i3++)
{
TFPassagir wRecPass;
SetFilePointer(hFile, PosArrPass+(i3+1)*sizeof(int),
NULL, FILE_BEGIN);
int PosElem;
ReadFile(hFile, &PosElem, sizeof(int), &dwCount, NULL);
SetFilePointer(hFile, PosElem, NULL, FILE_BEGIN);
ReadFile(hFile, &wRecPass, sizeof(TFPassagir), &dwCount, NULL);
TPass *Elem= new TPass;
Elem->SetKey(wRecPass.FIO);
HeadPass->AddElem(Elem);
}
}
}
// Закроем файл
CloseHandle(hFile);
return true;
}// LoadFromFile
8 РЕАЛИЗАЦИЯ С ПОМОЩЬЮ ШАБЛОНОВ
8.1 Описание классов
//---------------------------------------------------------------------------
template <class List>
class TArrayPtr
{
private:
int SizeArr;
int CountElem;
int Delta;
List **ArrPtr;
void ExpendArray();
public:
TArrayPtr();
~TArrayPtr();
int GetSizeArr(){return SizeArr};
int GetCountElem(){return CountElem};
List** GetArrayPtr(){return ArrPtr};
void AddElem(List *elem, int PosElem);
int FindSortElem(AnsiString key);
void DelElem(int PosDelElem);
List *ChangeElem(int PosDelElem);
List *operator [](int i){return(ArrPtr[i]);};
};
//---------------------------------------------------------------------------
class TPassagir
{
private:
AnsiString FIO;
public:
void SetFIO(AnsiString str){FIO =str;};
AnsiString GetFIO(){return FIO;};
bool operator < (AnsiString FindKey)
{ return(this->FIO< FindKey);};
bool operator > (AnsiString FindKey)
{ return(this->FIO > FindKey); };
};
//---------------------------------------------------------------------------
class TReise
{
private:
AnsiString Namber;
AnsiString Time_in;
AnsiString Time_out;
TArrayPtr<TPassagir> *ArrPtr;
public:
void SetNamber(AnsiString str){Namber =str;};
AnsiString GetNamber(){return Namber;};
void SetTime_in(AnsiString str){Time_in=str;};
AnsiString GetTime_in(){return Time_in;};
void SetTime_out(AnsiString str){Time_out=str;};
AnsiString GetTime_out(){return Time_out;};
void SetPtrArrPassagir(TArrayPtr<TPassagir>* Ptr){ ArrPtr= Ptr;};
TArrayPtr<TPassagir>* GetPtrArrPassagir(){return ArrPtr;};
bool operator < (AnsiString FindKey){return(this->Namber < FindKey);};
bool operator > (AnsiString FindKey){return(this->Namber > FindKey);};
};
//---------------------------------------------------------------------------
class TAirport
{
private:
AnsiString name;
AnsiString country;
AnsiString town;
TArrayPtr<TReise>* ArrPtr;
public:
void SetName(AnsiString str){name=str;};
AnsiString GetName(){return name;};
void SetCountry (AnsiString str){country=str;};
AnsiString GetCountry(){return country;};
void SetTown(AnsiString str){town=str;};
AnsiString GetTown(){return town;};
void SetPtrArrReise(TArrayPtr<TReise>* Ptr){ ArrPtr= Ptr;};
TArrayPtr<TReise>* GetPtrArrReise(){return ArrPtr;};
bool operator < (AnsiString FindKey)
{ return(this->name< FindKey); };
bool operator > (AnsiString FindKey)
{ return(this->name > FindKey); };
};
8.2 Реализация функции поиска
template <class List>
int TCArrayPtr<List>::FindSortElem ( AnsiString key )
{
// текущие границы массива
int Low = 0; //нижней границе массива указателей присвоить 0
int Hi = CountElem - 1;//верхней граница = количество элементов в массиве указателей
while ( Low <= Hi )
{
// средняя граница обрабатываемой части массива
int Middl = ( Hi + Low ) / 2;
if (*(ArrPtr[Middl] ) > key ) Hi = Middl - 1; else
if (*(ArrPtr[Middl] ) < key ) Low = Middl +1; else
return ( Middl );//иначе вернуть индекс среднего элемента
}
return ( Low ); // Перебран вест массив.Определена позиция
// возможной вставки нового элемента
}; //FindElem
8.3 Модуль для работы с аэропортами //---------------------------------------------------------------------------
extern TArrayPtr<TAirport>* HeadAir;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
TAirport *Elem= new TAirport;
Elem->SetName(Edit1->Text);
Elem->SetCountry(Edit2->Text);
Elem->SetPtrArrReise(NULL);
if (HeadAir == NULL) HeadAir= new TArrayPtr<TAirport>;
int PosElem= HeadAir->FindSortElem(Elem->GetName());
HeadAir->AddElem(Elem, PosElem);
Form1->TreeView1->Items->AddChild
(Form1->TreeView1->Selected, Elem->GetName());
Form1->TreeView1->AlphaSort(true);
Form1->TreeView1->Selected->Expand(true);
}// BitBtn1Click
//---------------------------------------------------------------------------
void __fastcall TForm2::Button3Click(TObject *Sender)
{
Form2->Close();
}
//---------------------------------------------------------------------------
9 РЕАЛИЗАЦИЯ С ПОМОЩЬЮ ФУНКЦИОНАЛЬНОГО ТИПА
9.1 Описание классов и структур
//---------------------------------------------------------------------------
typedef TFuncPtr (void*, AnsiString key);
//---------------------------------------------------------------------------
//Класс динамического массива указателей
class TArrayPtr
{
// описание скрытых элементов
private:
int SizeArr; //размер массива
int CountElem; // количество элементов в массиве
int Delta; // приращение массива
void **ArrPtr; // указатель на массив указателей
void ExpendArray(); // увеличение размера массива указателей
//описание доступных элементов
public:
// конструктор - инициализирует массив
TArrayPtr();
// деструктор - удаляет массив
~TArrayPtr();
// добавление элемента
void AddElem (void* Elem, int PosElem);
//поиск элемента
int FindSortElem(TFuncPtr* FuncPtr, AnsiString Key);
// удаление элемента
void DelElem (int PosDelElem);
// изменение элемента
void* ChangeElem (int PosDelElem);
// перегрузка оператора индексации
void* operator [] (int i)
{ return (ArrPtr[i]); };
}; // TCArrayPtr
//---------------------------------------------------------------------------
struct TPassagir
{
AnsiString FIO;
};
//---------------------------------------------------------------------------
struct TReise
{
AnsiString Namber;
AnsiString Time_in;
AnsiString Time_out;
TArrayPtr *ArrPtr;
};
//---------------------------------------------------------------------------
struct TAirport
{
AnsiString name;
AnsiString country;
AnsiString town;
TArrayPtr* ArrPtr;
};
//функции сравнения
//
int CompAir(void * Elem, AnsiString key);
//
int CompReise(void * Elem, AnsiString key);
//
int CompPass(void * Elem, AnsiString key);
9.2 Реализация функции поиска
//Поиск элемента в отсортированном списке
int TCArrayPtr::FindSortElem(TFuncPtr* FuncPtr, AnsiString Key)
// поиск элемента списка методом половинного деления массива индексов
// функция имеет двойное назначение - поиск месторасположения искомого элнмента
// и поиск вставки добавляемого элемента
{
// текущие границы массива
int Low = 0; //нижней границе массива указателей присвоить 0
int Hi = CountElem - 1;
while(Low <= Hi)
{
// средняя граница обрабатываемой части массива
int Middl = (Hi + Low)/2;
int CmpElem = FuncPtr ( ArrPtr[Middl], Key );
if ( CmpElem == 1 ) Hi = Middl - 1;
else
if(CmpElem == -1) Low = Middl + 1;
else
return(Middl);
}
return(Low); //перебран весь массив.
//Определена позиция возможной вставки нового элемента
};//FindSortElem
int CompAir(void * Elem, AnsiString key)
{
if (((TAirport*)Elem)->name < key) return -1;
else if (((TAirport*)Elem)->name > key) return 1;
else return 0;
}
int CompReise(void * Elem, AnsiString key)
{
if (((TReise*)Elem)->Namber < key) return -1;
else if (((TReise*)Elem)->Namber > key) return 1;
else return 0;
}
int CompPass(void * Elem, AnsiString key)
{
if (((TPassagir*)Elem)->FIO < key) return -1;
else if (((TPassagir*)Elem)->FIO > key) return 1;
else return 0;
}
9.3 Модуль работы с аэропортами
extern TArrayPtr* HeadAir;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
Form2->Edit1->SetFocus();
TAirport *Elem= new TAirport;
Elem->name=Edit1->Text;
Elem->country=Edit2->Text;
Elem->ArrPtr=NULL;
if (HeadAir == NULL) HeadAir= new TArrayPtr;
// функция как параметр
int PosElem= HeadAir->FindSortElem(CompAir, Elem->name);
HeadAir->AddElem(Elem, PosElem);
Form1->TreeView1->Items->AddChild
(Form1->TreeView1->Selected, Elem->name);
Form1->TreeView1->AlphaSort(true);
Form1->TreeView1->Selected->Expand(true);
Form1->TreeView1->OnChange
(Form1->TreeView1, Form1->TreeView1->Selected);
}// BitBtn1Click
//---------------------------------------------------------------------------
void __fastcall TForm2::Button3Click(TObject *Sender)
{
Form2->Close();
}
10 РЕАЛИЗАЦИЯ С ПОМОЩЬЮ ФУНКЦИОНАЛЬНОГО КЛАССА
10.1 Описание классов и структур
#define CSizeArr 20
#define CDeltaArr 10
template <class List>
class TCFunc
{
public:
int operator()(void* Ptr, AnsiString key)
{
if (*((List *)Ptr) > key) return 1;
else
if (*((List *)Ptr) < key) return -1;
else return 0;
};
void operator()(TTreeView *TV, AnsiString key)
{
TV->Items->AddChild(TV->Selected, key);
TV->AlphaSort(true);
TV->Selected->Expand(true);
TV->OnChange(TV, TV->Selected);
};
};
//---------------------------------------------------------------------------
//Класс динамического массива указателей
template <class List>
class TArrayPtr
{
// описание скрытых элементов
private:
int SizeArr; //размер массива
int CountElem; // количество элементов в массиве
int Delta; // приращение массива
List **ArrPtr; // указатель на массив указателей
void ExpendArray(); // увеличение размера массива указателей
//описание доступных элементов
public:
// конструктор - инициализирует массив
TArrayPtr();
// деструктор - удаляет массив
~TArrayPtr();
// возвращает количество элементов в массиве
int GetCountElem(){return CountElem;};
// добавление элемента
void AddElem (List* Elem, int PosElem);
//поиск элемента
int FindSortElem(TCFunc<List> FuncPtr, AnsiString Key);
// удаление элемента
void DelElem (int PosDelElem);
// изменение элемента
void* ChangeElem (int PosDelElem);
// перегрузка оператора индексации
List* operator [] (int i) { return (ArrPtr[i]); };
}; // TCArrayPtr
//---------------------------------------------------------------------------
struct TPassagir
{
AnsiString FIO;
bool operator < (AnsiString key)
{return (this->FIO < key);};
bool operator > (AnsiString key)
{return (this->FIO > key);};
};
//---------------------------------------------------------------------------
struct TReise
{
AnsiString Namber;
AnsiString Time_in;
AnsiString Time_out;
TArrayPtr<TPassagir> *ArrPtr; // указатель на голову пассажиров
bool operator < (AnsiString key)
{return (this->Namber < key);};
bool operator > (AnsiString key)
{return (this->Namber > key);};
};
//---------------------------------------------------------------------------
struct TAirport
{
AnsiString name;
AnsiString country;
AnsiString town;
TArrayPtr<TReise> *ArrPtr; // указатель на голову рейсов
// переопределение операторов сравнения
bool operator < (AnsiString key)
{return (this->name < key);};
bool operator > (AnsiString key)
{return (this->name > key);};
};
10.2 Реализация функции поиска
//Поиск элемента в отсортированном списке
// В качестве параметров функция получает ключ
template <class List>
int TCArrayPtr<List>::FindSortElem ( TCFunc<List> FuncPtr, AnsiString key )
// поиск элемента списка методом половинного деления массива индексов
// функция имеет двойное назначение - поиск месторасположения искомого элнмента
// и поиск вставки добавляемого элемента
{
// текущие границы массива
int Low = 0; //нижней границе массива указателей присвоить 0
int Hi = CountElem - 1; while(Low <= Hi)
{
// средняя граница обрабатываемой части массива
int Middl = (Hi + Low)/2;
int CmpElem = FuncPtr ( ArrPtr[Middl], key );
if ( CmpElem == 1 ) Hi = Middl - 1;
// для функций и функционального класса
else
if(CmpElem == -1) Low = Middl + 1;
else
return(Middl);
}
return(Low); //перебран весь массив.
//Определена позиция возможной вставки нового элемента
};//FindSortElem
10.3 Модуль работы с аэропортами
extern TArrayPtr<TAirport> *HeadAir;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
TCFunc<TAirport> FuncAir;
Form2->Edit1->SetFocus();
TAirport *Elem= new TAirport;
Elem->name=Edit1->Text;
Elem->country=Edit2->Text;
Elem->ArrPtr=NULL;
if (HeadAir == NULL) HeadAir= new TArrayPtr<TAirport>;
// функция как параметр
int PosElem= HeadAir->FindSortElem(FuncAir, Elem->name);
HeadAir->AddElem(Elem, PosElem);
FuncAir(Form1->TreeView1, Elem->name);
}// BitBtn1Click
//---------------------------------------------------------------------------
void __fastcall TForm2::Button3Click(TObject *Sender)
{
Form2->Close();
}
4
КC 060535.016.12
Документ
Категория
Рефераты
Просмотров
10
Размер файла
182 Кб
Теги
прогр, текст
1/--страниц
Пожаловаться на содержимое документа