close

Вход

Забыли?

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

?

Лаб 8(Report)

код для вставкиСкачать
Лабораторная работа №8
Работа с классами
8.1 Цель работы
Познакомиться со способами представления мультисписков на базе класса массива указателей. При помощи перегрузок, шаблонов и функциональных классов запрограммировать алгоритмы обработки списка: добавление элемента, удаление элемента, поиск элемента, удаление всего списка элементов и замена элемента.
Обеспечить выбор операций над линейным списком с помощью компонента PopUpMenu. Вывод данных из элементов списка обеспечить с помощью компонента ListBox и StringGrid.
8.2 Программное обеспечение
Для выполнения работы используется пакет Borland C++ Builder 6 в сочетании со справочным комплексом MSDN (Microsoft Developer's Network).
8.3 Теоретические сведения
В общем случае объявление перегрузки имеет вид:
<тип возвращаемого параметра> operator <оператор для которого определяется перегрузка> (<тип передаваемого параметра>)
Функциональный класс в общем случае объявляется следующим образом:
template <class List>
class <Имя класса>
{
public:
<тип возвращаемого параметра> operator () (<тип передаваемого параметра>)
};
8.4 Ход работы
1 В ходе работы были реализованы следующие классы: класс массива указателей на элементы списка, классы элементов списка, а также функциональный класс;
2 Был создан проект для работы с двухуровневым мультисписком на базе: класса массива указателей на элементы списка, а также классов элементов линейного списка;
3 Было обеспечено использование перегрузок.
Реализацию интерфейса обеспечили с помощью стандартных компонент Borland C++ Builder.
Текст программы
Файл UnitMain.cpp
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TListPredpr<TProduction> *Array;
TFuncCmp<TProduction> *ComparePr;
TFuncCmp<TUzel> *CompareUz;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
GroupBox1->Caption = "Данные об изделии";
Label4->Show();
Edit4->Show();
Label3->Caption = "Цена";
if (ListBox1->ItemIndex != -1)
{
TProduction *Pr = (*Array)[Array->FindInSortListR(ListBox1->Items-> Strings[ListBox1->ItemIndex].c_str(), ComparePr, 0, Array->GetArrCount() - 1)];
Edit1->Text = Pr->name;
Edit2->Text = Pr->code;
Edit3->Text = Pr->price;
Edit4->Text = Pr->view;
*(Pr->poduz) >> (ListBox2);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox2Click(TObject *Sender)
{
GroupBox1->Caption = "Данные об узле";
Label4->Hide();
Edit4->Hide();
Label3->Caption = "Цех - изготовитель";
if (ListBox1->ItemIndex != -1)
{
TProduction *Pr = (*Array)[Array->FindInSortListR(ListBox1->Items-> Strings[ListBox1->ItemIndex].c_str(), ComparePr, 0, Array->GetArrCount() - 1)];
if (ListBox2->ItemIndex != -1)
{
TListPredpr<TUzel> *UzHead = Pr->poduz;
TUzel *Uz;
Uz = new TUzel;
Uz = (*UzHead)[UzHead->FindInSortListR(ListBox2->Items->Strings[ListBox1-> ItemIndex].c_str(), CompareUz, 0, UzHead->GetArrCount() - 1)];
Edit1->Text = Uz->name;
Edit2->Text = Uz->code;
Edit3->Text = Uz->zeh;
}
}
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Array = new TListPredpr<TProduction>;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
TProduction *Pr;
Pr = new TProduction;
int i;
for (i = 0; i < Edit1->Text.Length(); Pr->name[i] = Edit1->Text.c_str()[i], i++);
Pr->name[i] = '\0';
for (i = 0; i < Edit2->Text.Length(); Pr->code[i] = Edit2->Text.c_str()[i], i++);
Pr->code[i] = '\0';
for (i = 0; i < Edit3->Text.Length(); Pr->price[i] = Edit3->Text.c_str()[i], i++);
Pr->price[i] = '\0';
for (i = 0; i < Edit4->Text.Length(); Pr->view[i] = Edit4->Text.c_str()[i], i++);
Pr->view[i] = '\0';
Pr->poduz = new TListPredpr<TUzel>;
Array->AddElem(Pr, ComparePr);
*Array >> ListBox1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
delete Array->DelElem(ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), ComparePr);
*Array >> ListBox1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
TProduction *Pr;
Pr = new TProduction;
Pr = Array->DelElem(ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), ComparePr);
int i;
for (i = 0; i < Edit1->Text.Length(); Pr->name[i] = Edit1->Text.c_str()[i], i++);
Pr->name[i] = '\0';
for (i = 0; i < Edit2->Text.Length(); Pr->code[i] = Edit2->Text.c_str()[i], i++);
Pr->code[i] = '\0';
for (i = 0; i < Edit3->Text.Length(); Pr->price[i] = Edit3->Text.c_str()[i], i++);
Pr->price[i] = '\0';
for (i = 0; i < Edit4->Text.Length(); Pr->view[i] = Edit4->Text.c_str()[i], i++);
Pr->view[i] = '\0';
Array->AddElem(Pr, ComparePr);
*Array >> ListBox1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MenuItem1Click(TObject *Sender)
{
TProduction *Pr = (*Array)[Array->FindInSortListR(ListBox1->Items-> Strings[ListBox1->ItemIndex].c_str(), ComparePr, 0, Array->GetArrCount() - 1)];
TListPredpr<TUzel> *UzHead = Pr->poduz;
TUzel *Uz;
Uz = new TUzel;
int i;
for (i = 0; i < Edit1->Text.Length(); Uz->name[i] = Edit1->Text.c_str()[i], i++);
Uz->name[i] = '\0';
for (i = 0; i < Edit2->Text.Length(); Uz->code[i] = Edit2->Text.c_str()[i], i++);
Uz->code[i] = '\0';
for (i = 0; i < Edit3->Text.Length(); Uz->zeh[i] = Edit3->Text.c_str()[i], i++);
Uz->zeh[i] = '\0';
UzHead->AddElem(Uz, CompareUz);
*UzHead >> ListBox2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MenuItem2Click(TObject *Sender)
{
TProduction *Pr = (*Array)[Array->FindInSortListR(ListBox1->Items-> Strings[ListBox1->ItemIndex].c_str(), ComparePr, 0, Array->GetArrCount() - 1)];
TListPredpr<TUzel> *UzHead = Pr->poduz;
delete (UzHead->DelElem(ListBox2->Items->Strings[ListBox2-> ItemIndex].c_str(), CompareUz));
*UzHead >> ListBox2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MenuItem3Click(TObject *Sender)
{ TProduction *Pr = (*Array)[Array->FindInSortListR(ListBox1->Items-> Strings[ListBox1->ItemIndex].c_str(), ComparePr, 0, Array->GetArrCount() - 1)];
TListPredpr<TUzel> *UzHead = Pr->poduz;
TUzel *Uz;
Uz = UzHead->DelElem(ListBox2->Items->Strings[ListBox2->ItemIndex].c_str(), CompareUz);
int i;
for (i = 0; i < Edit1->Text.Length(); Uz->name[i] = Edit1->Text.c_str()[i], i++);
Uz->name[i] = '\0';
for (i = 0; i < Edit2->Text.Length(); Uz->code[i] = Edit2->Text.c_str()[i], i++);
Uz->code[i] = '\0';
for (i = 0; i < Edit3->Text.Length(); Uz->zeh[i] = Edit3->Text.c_str()[i], i++);
Uz->zeh[i] = '\0';
UzHead->AddElem(Uz, CompareUz);
*UzHead >> ListBox2;
}
//---------------------------------------------------------------------------
Файл UnitFunc.h
#ifndef Unit2H
#define Unit2H
#include <StdCtrls.hpp>
#include "_str.h"
//---------------------------------------------------------------------------
template <class List>
class TFuncCmp
{
public:
int operator ()(void *pointer, char *key)
{
switch (*(List *)pointer && key)
case -1:
return(-1);
case 1:
return(1);
case 0:
return(0);
}
};
//---------------------------------------------------------------------------
template <class List>
class TListPredpr
{
private:
int ArrSize;
int ArrCount;
int Delta;
List **array;
void ExpendArray();
public:
TListPredpr();
~TListPredpr();
int GetArrCount(){return(ArrCount);};
int FindInSortListR(char *key, TFuncCmp<List> *FuncCmp, int left, int right);
void AddElem(List *elem, TFuncCmp<List> *FuncCmp);
List *DelElem(char *key, TFuncCmp<List> *FuncCmp);
List *operator [](int i){return(array[i]);};
void operator >>(TListBox *LB);
};
//---------------------------------------------------------------------------
typedef struct Uzel
{
char name[20];
char code[10];
char zeh[5];
bool operator && (char *key)
{
return(strcmp(name, key));
}
void operator >> (TListBox *LB)
{
LB->Items->Add((AnsiString)name);
}
} TUzel;
//---------------------------------------------------------------------------
typedef struct Production
{
char name[20];
char code[10];
char price[5];
char view[10];
TListPredpr<TUzel> *poduz;
bool operator && (char *key)
{
return(strcmp(name, key));
}
void operator >> (TListBox *LB)
{
LB->Items->Add((AnsiString)name);
}
} TProduction;
//---------------------------------------------------------------------------
template <class List>
TListPredpr<List>::TListPredpr()
{
Delta = 8;
ArrSize = 8;
ArrCount = 0;
array = new List *[ArrSize];
}
//---------------------------------------------------------------------------
template <class List>
TListPredpr<List>::~TListPredpr()
{
for (int i = 0; i < ArrCount; i++)
{
delete array[i];
}
}
template <class List>
void TListPredpr<List>::AddElem(List *elem, TFuncCmp<List> *FuncCmp)
{
if (ArrSize == ArrCount)
ExpendArray();
int pos = FindInSortListR(elem->name, FuncCmp, 0, ArrCount - 1);
for (int i = ArrCount - 1; i > pos; i--)
(*array)[i + 1] = (*array)[i];
array[pos] = elem;
ArrCount++;
}
//---------------------------------------------------------------------------
template <class List>
List *TListPredpr<List>::DelElem(char *key, TFuncCmp<List> *FuncCmp)
{
int pos = FindInSortListR(key, FuncCmp, 0, this->ArrCount - 1);
List *pointer = array[pos];
for (int i = pos; i > ArrCount - 1; i++)
(*array)[i] = (*array)[i + 1];
ArrCount--;
return(pointer);
}
//---------------------------------------------------------------------------
template <class List>
int FindInSortListR(char *key, TFuncCmp<List> *FuncCmp, int left, int right)
{
int middle = (right - left)/2;
if (left <= right)
switch (FuncCmp(*array[middle], key))
case -1:
middle = FindInSortListR(key, FuncCmp, middle + 1, right);
case 1:
middle = FindInSortListR(key, FuncCmp, left, middle - 1);
return(middle);
}
//---------------------------------------------------------------------------
template <class List>
void TListPredpr<List>::operator >> (TListBox *LB)
{
LB->Items->Clear();
for (int i = 0; i < ArrSize; i++)
*array[i] >> LB;
}
//---------------------------------------------------------------------------
template <class List>
void TListPredpr<List>::ExpendArray()
{
ArrSize += Delta;
List **array1 = new List *[ArrSize];
for (int i = 0; i < ArrCount; i++)
array1[i] = array[i];
array = array1;
}
//---------------------------------------------------------------------------
#endif
Заключение
В этой лабораторной работе мы познакомились со способами представления мультисписков на базе класса массива указателей. При помощи перегрузок, шаблонов и функциональных классов запрограммировали алгоритмы обработки списка: добавление элемента, удаление элемента, поиск элемента, удаление всего списка и замена элемента.
Выполнил студент группы СП - 031 Солодовник В.С.
1
Документ
Категория
Рефераты
Просмотров
28
Размер файла
83 Кб
Теги
report, лаб
1/--страниц
Пожаловаться на содержимое документа