Помощь - Поиск - Пользователи - Календарь
Полная версия: Нужна помощь в описании класов. контейнер на базе очереди.
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
medvedeva
тема:Объектная реализация контейнера на основе комбинированной структуры «Упорядоченный массив динамических очередей»
есть начало, но его нужно переделать так, чтобы выполнялось след:
- информационные объекты являются квартирами дома с парой свойств Номер и Площадь
- квартиры объединяются в рамках объекта Дом (свойство - НомерДома) на основе динамической очереди
- дома объединяются в рамках объекта Улица (свойство - Название) на основе упорядоченного массива.

Для этой задачи надо спроектировать набор необходимых классов, имена которых, а также имена их свойств и методов должны
соответствовать поставленной задаче.
- в классах ввести методы доступа к закрытым свойствам
- использование динамической версии массива не является обязательным
вот начало:
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;

заранее спасибо!
IUnknown
Во-первых, необходимо уточнение:
Цитата
дома объединяются в рамках объекта Улица (свойство - Название) на основе упорядоченного массива.
Упорядоченного по какому признаку?

Во вторых - код совершенно нечитаемый, поскольку ты не воспользовалась подсветкой (выпадающий список CODE)
medvedeva
Цитата(IUnknown @ 29.06.2011 16:23) *

Во-первых, необходимо уточнение:
Упорядоченного по какому признаку?

думаю они должны быть упорядоченны по номеру дома... такое возможно?
medvedeva
код пыталась отредактировать, но чёт не получилось, судя по сообщению..
IUnknown
Возможно все... В первом приближении - вот так:

... (Показать/Скрыть)
Теперь осталось сделать так, чтобы со всем этим было удобно работать. Для этого надо знать, как именно ты собираешься это все использовать.
medvedeva
ничего себе... спасибо огромное! для начала вот с этим всем разберусь, потом.... раньше делала всё в консольке, поэтому было проще... надо в оконном виде... буду думать теперь что положить на форму и потом уже описывать методы и всё остальное... но чёт пока каша, если честно... но уже спасибо=)
snejinka
вопрос по этой же теме... запись использовать нельзя... только классы... как тогда?
IUnknown
Не поверишь, достаточно заменить Record на Class и описать конструктор:

type
Apts =
class
Number : Integer;
S : Integer;
constructor Create (nValue, sValue : Integer);
end;

constructor Apts.Create (nValue, sValue : Integer);
begin
Number := nValue;
S := sValue;
end;
, функция Apt больше не нужна. Но потребуется внести еще два изменения:
1) заполнение очереди теперь надо делать так:
   with Hs_02 do
begin
(*
Put (Apt(1, 100));
Put (Apt(2, 120));
Put (Apt(3, 100));
Put (Apt(4, 150));
*)
Put (Apts.Create(1, 100));
Put (Apts.Create(2, 120));
Put (Apts.Create(3, 100));
Put (Apts.Create(4, 150));
end;
2) деструктор очереди примет вот такой вид:
destructor TQueue.Destroy;
var Value : Apts;
begin
while not IsEmpty do
begin
Value := Get;
Value.Free; // Если этого не сделать - будет утечка памяти
end;
end;


А вообще мне очень не нравится, когда начинают накладывать ограничения. Задача сделать это на Дельфи? Какие могут быть "... использовать нельзя"? Всё, что доступно в языке, должно использоваться. Иначе тут же начинается изобретение костылей из-за ограничений вместо собственно решения задачи. Вот зачем, спрашивается, делать Apts классом? Просто чтобы было? Чтобы "крутое ООП" реализовать, ни шагу без классов? Смысла в этом ровно ноль. С записями я могу не беспокоиться об удалении из кучи, ибо записи там не создавались. В случае классов я должен еще и следить за тем, чтобы где-то в другом месте (вдруг мне понадобится удалить элемент из очереди не в ее деструкторе?) не было утечки. Кому нужна эта лишняя головная боль?
Гость
Цитата(IUnknown @ 2.07.2011 11:02) *

Кому нужна эта лишняя головная боль?

эта головная боль нужна преподу, который походу других примеров просто не знает... он зациклился на этих домах, улицах.... я считаю, что вообще этот пример по очереди не подходит.... потому что много всяких ньюансов... но, БИк ЗУР РАХМАТ smile.gif [Большое спасибо, тат. - Lapp]
Гость
простите конечно, но я опять к этой теме... на препода слов уже нет... мне надо было показать ему описание классов с этими домами и очередями... я ему скинула

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)

private
{ Private declarations }
public
{ Public declarations }
end;
type
Apts =
class
Number : Integer;
S : Integer;
end;

TQItem = Apts;

TQueueItem = class
Data : TQItem;
next : TQueueItem;
public
constructor Create (value : TQItem);
end;
type
TQueue = class
private
head, tail : TQueueItem;
fHouse : Integer;

public

constructor Create (AHouse : Integer);
destructor Destroy;override;

function IsEmpty : boolean;
function Get : TQItem;
procedure Put (value : TQItem);

property House : Integer read fHouse;
end;
type
TContainer = class
private
fTitle : string;
Arr : array of TQueue;
function GetHouse (index : Integer) : TQueue;
function GetCount : Integer;

public
constructor Create (ATitle : string);
destructor Destroy;override;

procedure Add(Q : TQueue);
property Title : string read fTitle;
property Count : Integer read GetCount;
property Houses[index : Integer] : TQueue read GetHouse; default;
end;


var
Form1: TForm1;


на что получаю вот что:
1. Описание классов - отдельный модуль (один или несколько)
2. Класс Квартира: это не класс, а какое-то недоразумение!
3. Зачем вводить второе имя: TQItem = Apts;
4. Имена классов, свойств и методов должны быть содержательными: никаких Queue, Container и т.д.
5. Где метод удаления из списка и методы работы с файлами?
IUnknown
Цитата
на что получаю вот что:
1. Описание классов - отдельный модуль (один или несколько)
2. Класс Квартира: это не класс, а какое-то недоразумение!
3. Зачем вводить второе имя: TQItem = Apts;
4. Имена классов, свойств и методов должны быть содержательными: никаких Queue, Container и т.д.
5. Где метод удаления из списка и методы работы с файлами?
Я бы ответил вот так:

1. Описание классов НЕ ОБЯЗАНО быть в отдельных модулях, нечего "размазывать" эти несколько строк по десятку файлов.
2. Класс Квартира тут вообще не нужен, тут вполне достаточно Записи, если кто-то требует использования классов там, где они не нужны - то пускай он не удивляется недоразумениям. (Справедливости ради я бы все-таки добавил конструктор, я показывал как именно в посте №8)
3. Вот хочу и ввожу. Чем дополнительное имя помешало? Память при описании типа не выделяется, что не так? Не понимаем - значит "плохо"? Я захочу проверить, как работает очередь с целыми числами - присвою TQItem = Integer, и пускай компилятор мне скажет, где что надо поправить, а не буду ползать по программе и искать, "а где же тут еще надо заменить Apts на Integer"... Это называется "абстрагирование", если что.
4. Имена более чем содержательные: Queue - она и в Африке "Очередь", и если что-то делает работу Очереди, то оно должно называться TQueue, а не Ochered, и не TutBudutZapisaniUlicy... Собственно, TContainer по той же причине. Это именно контейнер (подними глаза на название темы: "Контейнер на базе очереди", и TQueue/TCOntainer, оказывается, несодержательны... Бред...)
5. Добавь - будет... Я программу "под ключ" делать не собираюсь. Во-первых - потому что это ТВОЕ задание, а во-вторых - Дельфи под Debian-ом почему-то не очень работает. Ты не в курсе, почему? smile.gif Текстовую версию (используя FPC) я набросал, основа - есть, дальше - сама. А приходить и говорить, что чего-то там нет - не надо. Ты покажи, что сделано самостоятельно, что пыталась, что не получилось. Поможем исправить...
Гость
Цитата(IUnknown @ 5.07.2011 19:46) *

Ты покажи, что сделано самостоятельно, что пыталась, что не получилось. Поможем исправить...

вот что получилось, думаю не хватает многого...

unit Unit1;

interface
type
TDom = class
private
Number : Integer;
S : Integer;
public
constructor Create (value : TDom);
end;
type
TUlica = class
private
head, tail : TDom;
fHouse : Integer;
public
constructor Create (AHouse : Integer);
destructor Destroy;override;
function IsEmpty : boolean;
function Get : Dom;
procedure Put (value : Dom);
property House : Integer read fHouse;
end;
type
TGorod = class
private
fTitle : string;
Arr : array of TUlica;
function GetHouse (index : Integer) : TUlica;
function GetCount : Integer;
public
constructor Create (ATitle : string);
destructor Destroy;override;
procedure Add(Q : TUlica);
property Title : string read fTitle;
property Count : Integer read GetCount;
property Houses[index : Integer] : TUlica read GetHouse; default;
end;

implementation

end.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.