![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
тема:Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических очередей»
есть начало, но его нужно переделать так, чтобы выполнялось след: - информационные объекты являются квартирами дома с парой свойств Номер и Площадь - квартиры объединяются в рамках объекта Дом (свойство - НомерДома) на основе динамической очереди - дома объединяются в рамках объекта Улица (свойство - Название) на основе упорядоченного массива. Для этой задачи надо спроектировать набор необходимых классов, имена которых, а также имена их свойств и методов должны соответствовать поставленной задаче. - в классах ввести методы доступа к закрытым свойствам - использование динамической версии массива не является обязательным вот начало: Код:
uses
classes,
SysUtils;
type
T = integer;
TypizFile = file of T; // типизированный файл
TQueueItem = class // класс - элемент очереди
private
Data: T; // мои данные
Next: TQueueItem; // указатель на следующий элемент
private
constructor Create(value: T); // создание элемента очереди
end;
TQueue = class // класс очередь
private
Marker: T; // для метки очередей, для их поиска
First, Last: TQueueItem; // указатели начала и конца
public
constructor Create; // инициализация очереди
destructor Free;
procedure Put(value: T); // добавление элемента
function Get: T; // удаление
procedure Print; // просмотр
function Empty: boolean; // проверка на пустоту
// procedure Save (value: T); //сохранение в файл
// procedure Load (value: T); // загрузка из файла
end;
{Класс TCont обьявляем контейнерным классом}
TCont = class // класс-контейнер
private // свойства
mas: array of TQueue; // динамический массив
procedure Add(theQueue: TQueue);
public
Constructor Create; // создание массива указателей очередей
Procedure Add_main; // добавить новые очереди в контейнер
Procedure Delete_main;
procedure Scan_main;
// procedure Save (value: T); //сохранение контейнера в файл
// procedure Load (value: T); // загрузка из файла
end;
{========================================}
// инициализация элемента
constructor TQueueItem.Create(value: T);
begin
Data := value;
next := nil;
end;
{==========================================}
// инициализация очереди
Constructor TQueue.Create;
begin
first := nil; last := nil; // создаем пустую очередь
end;
// Освобождаем память, которую занимала очередь
destructor TQueue.Free;
begin
while not Empty do Get; // удаляем все элементы
end;Последний раз редактировалось Admin, 29.06.2011 в 15:54. |
|
#2
|
||||
|
||||
|
А нельзя ли использовать стандартные классы, например TList или вам нужно свой класс реализовать?
|
|
#3
|
|||
|
|||
|
а все равно кучу своего дописывать.
Для внутреннего списка я обычно использую TObjectList, который как Items с соотв. методами доступа вытягиваю в интерфейс. Вообще, в задании не указано как делать очереди. Т.е. имплементация может быть любая. только вот я не понимаю зачем для данной задачи вообще очередь... Я бы делал как-то так: Код:
type
TBaseClass = class
public
// create new instance
constructor Create; virtual; overload;
// create instance and load from stream
constructor Create(AStream : TStream); virtual; overload;
// save/load object to/from stream
procedure SaveToStream(AStream : TStream); virtual; abstract;
procedure LoadFromStream(AStream : TStream); virtual; abstract;
end;
TApartment = class(TBaseClass)
priivate
FNumber : Integer;
FSquare : Integer;
public
procedure SaveToStream(AStream : TStream); override;
procedure LoadFromStream(AStream : TStream); override;
property Number : Integer read FNumber write SetNumber;
property Square : Integer read FSquare write SetSquare;
end;
THouse = class(TBaseClass)
private
FNumber : Integer;
FItems : TObjectList;
public
procedure SaveToStream(AStream : TStream); override;
procedure LoadFromStream(AStream : TStream); override;
function Add(AItem : TApartment) : Integer;
function AddNew(ANumber, ASquare : Integer) : Integer;
procedure Remove(AItem : TApartment);
procedure Delete(AIndex : Integer);
procedure IndexOf(AItem : TApartment) : Integer; overload;
procedure IndexOf(ANumber : Integer) : Integer; overload;
property Number : Integer read FNumber write SetNumber;
property Items[Index : Integer] : TApartment read GetApartment;
property Count : Integer read GetCount;
end;и т.д. когда перенесешь код в среду, то нажми Ctrl+Shift+C и среда догенерит все, чего не хватает (сетеры/гетеры и заготовки для методов). |
|
#4
|
|||
|
|||
|
вопрос по поводу класса TDom.. как сделать так, чтоб элементы собирались в динамичекую структуру?
Код:
type
TKvartira = class // класс квартир
private
Number : Integer;
S : Integer;
procedure SetNumber(aNumber:integer);
function GetNumber:integer;
proedure SetS(kvS:integer);
function GetS:integer;
public
constructor Create (aNumber:integer; aS:integer);
property
fNumber:integer read GetNumber write SetNumber;
property
fS:integer read GetS write SetS;
end;
type
TDom = class // класс дом
private
head, tail : TKvartira;
fDom : Integer;
public
constructor Create (ADom : Integer);
destructor Destroy;override;
function IsEmpty : boolean;
function Get : Kvartira;
procedure Put (value : Kvartira);
property Dom : Integer read fDom;
end;
type
TUlica = class // класс улица
private
fTitle : string;
Arr : array of TDom;
function GetDom (index : Integer) : TDom;
function GetCount : Integer;
public
constructor Create (ATitle : string);
destructor Destroy;override;
procedure Add(Q : TDom);
procedure Del: TDom;
procedure Print (Q : TDom);
property Title : string read fTitle;
property Count : Integer read GetCount;
property Dom[index : Integer] : TDom read GetDom; default;
end;Последний раз редактировалось medvedeva, 25.07.2011 в 20:09. |