close

Вход

Забыли?

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

?

Лаб 6(Report)

код для вставкиСкачать
Лабораторная работа №6
Работа с классами
6.1 Цель работы
Познакомиться со способами представления мультисписков на базе линейных однонаправленных списков при помощи шаблона класса, элементы которых расположены в динамической памяти. Запрограммировать алгоритмы обработки линейного списка: добавление элемента, удаление элемента, поиск элемента, удаление всего списка элементов и замена элемента.
Обеспечить выбор операций над линейным списком с помощью компонента PopUpMenu. Вывод данных из элементов списка обеспечить с помощью компонента ListBox и StringGrid.
6.2 Программное обеспечение
Для выполнения работы используется пакет Borland C++ Builder 6 в сочетании со справочным комплексом MSDN (Microsoft Developer's Network).
6.3 Теоретические сведения
Класс - это структура данных, которая кроме членов данных содержит функции работы с членами данных. В общем случае объявление класса имеет следующий вид:
class <Имя класса>
{
private:
<список деклараций полей и функций работы с полями>
public:
<список деклараций полей и функций работы с полями>
};
Шаблон класса в общем случае объявляется следующим образом:
template <class List>
class <Имя класса>
{
private:
<список деклараций полей и функций работы с полями>
public:
<список деклараций полей и функций работы с полями>
};
6.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> *Head;
//---------------------------------------------------------------------------
__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;
Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));
Edit1->Text = Pr->name;
Edit2->Text = Pr->code;
Edit3->Text = Pr->price;
Edit4->Text = Pr->view;
Pr->poduz->ListOutput(ListBox2, InfProducts);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox2Click(TObject *Sender)
{ GroupBox1->Caption = "Данные об узле";
Label4->Hide();
Edit4->Hide();
Label3->Caption = "Цех - изготовитель";
if (ListBox1->ItemIndex != -1)
{
TProduction *Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));
if (ListBox2->ItemIndex != -1)
{
TListPredpr<TUzel> *UzHead = Pr->poduz;
TUzel *Uz;
Uz = new TUzel;
Uz = *(UzHead->FindInSortListR(UzHead->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpUzels));
Edit1->Text = Uz->name;
Edit2->Text = Uz->code;
Edit3->Text = Uz->zeh;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Head = 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>;
Pr->next = NULL;
Head->AddToSortList(Pr, InfProducts, CmpProducts);
Head->ListOutput(ListBox1, InfProducts);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
delete Head->DeleteFromSortList(ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());
Head->ListOutput(ListBox1, InfProducts);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
TProduction *Pr;
Pr = new TProduction;
Pr = Head->DeleteFromSortList(ListBox1->Items->Strings[ListBox1->ItemIndex].c_str());
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->next = NULL;
Head->AddToSortList(Pr, InfProducts, CmpProducts);
Head->ListOutput(ListBox1, InfProducts);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MenuItem1Click(TObject *Sender)
{
TProduction *Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));
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';
Uz->next = NULL;
UzHead->AddToSortList(Uz, InfUzels, CmpUzels);
UzHead->ListOutput(ListBox2, InfUzels);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MenuItem2Click(TObject *Sender)
{
TProduction *Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));
TListPredpr<TUzel> *UzHead = Pr->poduz;
delete UzHead->DeleteFromSortList(ListBox2->Items->Strings[ListBox2->ItemIndex].c_str());
UzHead->ListOutput(ListBox2, InfUzels);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MenuItem3Click(TObject *Sender)
{ TProduction *Pr = *(Head->FindInSortListR(Head->GetHeadAddr(), ListBox1->Items->Strings[ListBox1->ItemIndex].c_str(), CmpProducts));
TListPredpr<TUzel> *UzHead = Pr->poduz;
TUzel *Uz;
Uz = UzHead->DeleteFromSortList(ListBox2->Items->Strings[ListBox2->ItemIndex].c_str());
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';
Uz->next = NULL;
UzHead->AddToSortList(Uz, InfUzels, CmpUzels);
UzHead->ListOutput(ListBox2, InfUzels);
}
//---------------------------------------------------------------------------
Файл UnitFunc.h
#ifndef Unit2H
#define Unit2H
#include <StdCtrls.hpp>
#include "_str.h"
//---------------------------------------------------------------------------
typedef int TFCmpPtr(void*, char *key);
typedef char *TFInfPtr(void*);
//---------------------------------------------------------------------------
template <class List>
class TListPredpr
{
private:
List *head;
public:
TListPredpr(){head = NULL;};
~TListPredpr();
List **GetHeadAddr(){return(&head);};
void AddToSortList(List *elem, TFInfPtr *Inform, TFCmpPtr *Compare);
List *DeleteFromSortList(char *key);
List **FindInSortListR(List **prev, char *key, TFCmpPtr *Compare);
void ListOutput(TListBox *LB, TFInfPtr *Inform);
};
//---------------------------------------------------------------------------
typedef struct Uzel
{
char name[20];
char code[10];
char zeh[5];
Uzel *next;
} TUzel;
//---------------------------------------------------------------------------
typedef struct Production
{
char name[20];
char code[10];
char price[5];
char view[10];
TListPredpr<TUzel> *poduz;
Production *next;
} TProduction;
int CmpProducts(void *elem, char *key)
{
return(strcmp(((TProduction *)elem)->name, key));
}
//---------------------------------------------------------------------------
int CmpUzels(void *elem, char *key)
{
return(strcmp(((TUzel *)elem)->name, key));
}
//---------------------------------------------------------------------------
char *InfProducts(void *elem)
{
return(((TProduction *)elem)->name);
}
//---------------------------------------------------------------------------
char *InfUzels(void *elem)
{
return(((TUzel *)elem)->name);
}
//---------------------------------------------------------------------------
template <class List>
TListPredpr<List>::~TListPredpr()
{
for (List *wp = head; wp != NULL; head = wp)
{
wp = head->next;
delete head;
}
}
//---------------------------------------------------------------------------
template <class List>
void TListPredpr<List>::AddToSortList(List *elem, TFInfPtr *Inform, TFCmpPtr *Compare)
{
List **pointer;
pointer = FindInSortListR(&head, Inform(elem), Compare);
elem->next = *pointer;
*pointer = elem;
}
//---------------------------------------------------------------------------
template <class List>
List *TListPredpr<List>::DeleteFromSortList(char *key)
{
List **pointer = FindInSortListR(&head, key, CmpProducts);
List *pointer1 = *pointer;
*pointer = (*pointer)->next;
return(pointer1);
}
//---------------------------------------------------------------------------
template <class List>
List **TListPredpr<List>::FindInSortListR(List **prev, char *key, TFCmpPtr *Compare)
{
if ((*prev != NULL) && (Compare(*prev, key) < 0))
prev = FindInSortListR(&((*prev)->next), key, Compare);
return(prev);
}
//---------------------------------------------------------------------------
template <class List>
void TListPredpr<List>::ListOutput(TListBox *LB, TFInfPtr *Inform)
{
LB->Items->Clear();
for (List *pointer = head; pointer != NULL; pointer = pointer->next)
LB->Items->Add((AnsiString)Inform(pointer));
}
//---------------------------------------------------------------------------
#endif
Заключение
В этой лабораторной работе мы познакомились с способами представления мультисписков на базе линейных однонаправленных списков при помощи шаблона класса, элементы которых расположены в динамической памяти. Запрограммировали алгоритмы обработки линейного списка: добавление элемента, удаление элемента, поиск элемента, удалене всего списка и замена элемента.
Выполнил студент группы СП - 031 Солодовник В.С.
1
Документ
Категория
Рефераты
Просмотров
14
Размер файла
78 Кб
Теги
report, лаб
1/--страниц
Пожаловаться на содержимое документа