|
|
Регистрация | << Правила форума >> | 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. |