Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2009, 13:13   #1
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
Вопрос Массив указателей (с помощью ООП)

Привет всем!

Вот у меня такое задание - реализовать ммассив из динам-х очредей со всеми типовыми операциями для данной струк-ры.
Т.е создается массив, элементами которого должны быть собственно очереди, а очереди заполняются нашими данными (например с типом integer). В консольном варианте я это сделала, теперь надо это же задание решить с помощью ООП.

В общем я подумала и решила создать 3 класса:
Класс TQItem будет хранит элемент очереди
Класс TQueue будет хранить собственно очередь (содеожит все объекты класса TQItem).
Класс TMassQu обьявляем контейнерным. Будет иметь одно свойство – масссив из N элементов типа TQueue, т.е. объявим как массив из очередей.

Вроде классы описала, но у меня возникли первые трудности - как написать процедуру Constructor Create для этих классов.
Я знаю, что конструктор Create нужен для выделение памяти и его нужно обязательно ввести.
Но мне не понятно, как это сделать для этих классов...
Помогите мне разобраться в этом вопросе, пожалуста (просто я начала изучать ООП только в этом семестре и пока я еще не все понимаю).

вот моя наработка

Код:
TYPE

{Класс TQueueItem -  элемент очереди}

  TQItem=class // заголовок класса
  private // свойства класса
    data: integer; // поле-данные
    next: TQItem;// поле-адрес на следующий элемент
  public //методы класса
   Constructor Create;//создание одного элемента
  end; // конец описания класса

{Класс TQueue - собственно очередь}

  TQueue=class// заголовок класса
  private
    First, Last: TQItem // указатели на начало и конец очереди
  public
    Constructor Create;//создать пустую очередь
    Procedure AddQ // добавление элемента в очередь;
  end;

{Класс TMassQu обьявляем контейнерным}

  TMassQu = class //класс-контейнер
  private
    mass: array [1..10] of TQueue;//элементы массива
  public
    Constructor Create;//создание пустого массива указателей
    Procedure AddMasQ; // добавление очереди в массив
  end;

{================================}
Constructor TQItem.Create (x:integer);   //создание одного элемента
begin
 next:=nil;
 data:= x; // наши данные
end;

{================================}
Constructor TQueue.Create ; //инициализация очереди
begin
  First := nil; Last := nil;
end;

{================================}
Constructor TMassQu.Create ();//инициализация массива указателей
var
 i:integer;
begin
  for i := 1 to N do mass[i] :=  nil; // обнуляем массив
end;
{================================}
diliana вне форума Ответить с цитированием
Старый 26.11.2009, 13:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Можно глупый вопрос?
Если это в Делфи, то не хочешь ли ты воспользоваться уже имеющимися средствами TListObject, TQueue и пр.?
Или преподаватели запрещают?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.11.2009, 13:34   #3
MadReason
Ищу работу
Форумчанин
 
Аватар для MadReason
 
Регистрация: 16.02.2007
Сообщений: 269
По умолчанию

"Реализация конструктора несколько необычна. Во-первых, в теле конструктора нет привычных операторов New, обеспечивающих выделение динамической памяти (всю необходимую работу по выделению памяти выполняет компилятор). Во-вторых, формально конструктор не возвращает значения, хотя в программе обращение к конструктору осуществляется как к методу-функции."

память и так выделяется при использовании конструктора.
Пишу на Delphi все что угодно, недорого, красиво, с комментариями
###icq 107335###
MadReason вне форума Ответить с цитированием
Старый 26.11.2009, 13:35   #4
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Можно глупый вопрос?
Если это в Делфи, то не хочешь ли ты воспользоваться уже имеющимися средствами TListObject, TQueue и пр.?
Или преподаватели запрещают?
Честно говоря, это я не уточняла у препода.
Даже не знаю...
На Делфи я делала только консольные приложения.

А можно тоже глупый вопрос - а как лучше сделать, так чтобы была польза, чтобы научиться и понять предмет изучения? Ну я имею в виду как будет лучше - воспользоваться средствами Делфи или самой делать?
diliana вне форума Ответить с цитированием
Старый 26.11.2009, 14:18   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот тее небольшой ликбез:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses   contnrs,
  SysUtils;

// Итак это наш класс элементов
  type
   TMyClass=class
// Здесь некие поля
    Data:integer;
   end;
//Это класс-контейнер для элементов
   TMyCont=class
   Private
  { здесь элементы накапливаются в некий список стандартными средствами
  делфи. Он удобен тем что позволяет контролировать уборку мусора за собой при
  освобожденнии т.е. когда он будет освобождаться автоматом и освободятся все элементы}
    l:TObjectList;
    function GetItem(index:integer): TMyClass;
    procedure SetItem(index:integer; const Value: TMyClass);
   Public
// Это своство получающее очередной элемент по номеру
    Property Item[index:integer]:TMyClass read GetItem write SetItem; default;
// Это функция создающая и добавляющая элемент в контейнер
    Function Add:TMyClass;
// Создание и освобождение контейнера
    Constructor Create;
    Destructor Free;
   end;


{ TMyCont }

function TMyCont.Add: TMyClass;
begin
// Смысл этого в том что создается экземпляр класс и возвращается в виде результата
 Result:=TMyClass.Create;
// Ну и аккумулируется в список.
 l.Add(Result);
end;

constructor TMyCont.Create;
begin
// Список мы заранее создадим
 l:=TObjectList.Create;
end;

destructor TMyCont.Free;
begin
// И не забудем освободить
 l.Free;
end;

function TMyCont.GetItem(index:integer): TMyClass;
begin
// если элемента под таким номером нет вернется NIL иначе вернется объект
 Result:=nil;
 if (index>=0)and(index<l.Count) then Result:=TMyClass(l[index]);
end;

procedure TMyCont.SetItem(index:integer; const Value: TMyClass);
begin

end;


 var my:TMyCont;i:integer;mm:TMyClass;
begin
 // Итак наполним список
  my:=TMyCont.Create;
   for i:=0 to 10 do begin
    with my.Add do begin
     Data:=random(100);
    end;
   end;
// Пройдемся по нему и выведем на экран
  i:=0;
  mm:=my[i];
  while mm<>nil do begin
   write(mm.data:6);
   inc(i);
   mm:=my[i];
  end;
// Освободив главный класс TObjectList освободит и все его элементы
  my.Free;
  readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Это самое простое из надежных.
Есть также TQueue - Это очередь. ею можно заменить TObjectList в соответствии с заданием.
Вопросы будут?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.11.2009, 08:45   #6
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

Stilet
Спасибо за проведенный ликбез.
Я анализировала ваш код, читала лекционные материалы, не все конечно еще поняла, но некоторые вещи уже уяснила.

Цитата:
Это самое простое из надежных.
Есть также TQueue - Это очередь. ею можно заменить TObjectList в соответствии с заданием.
Вопросы будут?
В общем я скомпилировала ваш код, все работает отлично.
И по вашему совету попробовала сделать то же самое с TQueue.
Но не компилится.

Вот сообщение
[DCC Error] Q2.dpr(36): E2003 Undeclared identifier: 'Add'
[DCC Error] Q2.dpr(56): E2149 Class does not have a default property

То есть есть 2 ошибки - Необьявленный индентификатор 'Add' и Класс не имеет свойств по умолчанию.

Вот этот код

Код:
program Q2;

{$APPTYPE CONSOLE}

uses
  Contnrs,// <- в этом модуле класс  TQueue
  SysUtils;

type

   TMyClass=class// это наш класс элементов
      Data:integer;// Здесь поля - наши данные
   end;


   TMyCont=class //Это класс-контейнер для элементов
   Private
    q: TQueue; // !!! свойство ОЧЕРЕДИ
    function GetItem(index:integer): TMyClass;
    procedure SetItem(index:integer; const Value: TMyClass);
   Public
// Это своство получающее очередной элемент по номеру
    Property Item[index:integer]:TMyClass read GetItem write SetItem; default;
    Function Add : TMyClass;// Это функция создающая и добавляющая элемент в контейнер
    Constructor Create;// Создание и освобождение контейнера
    Destructor Free;
   end;

{ TMyCont }

function TMyCont.Add: TMyClass;
begin
{Смысл этого в том что создается экземпляр класс
и возвращается в виде результата}
 Result:=TMyClass.Create;
 q.Add(Result); // Ну и аккумулируется в список.
end;


constructor TMyCont.Create;
begin
 q:=TQueue.Create; // заранее создадим очередь
end;


destructor TMyCont.Free;
begin
 q.Free;// И не забудем освободить
end;

function TMyCont.GetItem(index:integer): TMyClass;
begin
{если элемента под таким номером нет вернется NIL
иначе вернется объект }
 Result:=nil;
 if (index>=0)and(index<q.Count) then Result:=TMyClass(q[index]);
end;

procedure TMyCont.SetItem(index:integer; const Value: TMyClass);
begin

end;


 var
 my:TMyCont;
 i:integer;
 mm:TMyClass;

begin
  my:=TMyCont.Create; // наполним очередь
   for i:=0 to 10 do begin
    with my.Add do begin
     Data:=random(100);
    end;
   end;
  i:=0;// Пройдемся по нему и выведем на экран
  mm:=my[i];
  while mm<>nil do begin
   write(mm.data:6);
   inc(i);
   mm:=my[i];
  end;
  my.Free;// Освободив главный класс TQueue освободит и все его элементы
  readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
diliana вне форума Ответить с цитированием
Старый 30.11.2009, 11:19   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
[DCC Error] Q2.dpr(36): E2003 Undeclared identifier: 'Add'
Солнышко, ну хелп то для кого писан?
Там же четко по мятому сказано какие методы TQueue поддерживает, и метода ADD в нем нет.
Это же очередь - там по анналогии методы Push (Аккумулирует в очередь) и Pop (Выбирает из очереди)

отсюда:
Код:
 q.Push(Result); // Ну и аккумулируется в список.
И соответственно метод GetItem может получать только из вершины очереди. отсюда вместо свойства сделай его число функцией:
Код:
   TMyCont=class //Это класс-контейнер для элементов
   Private
    q: TQueue; // !!! свойство ОЧЕРЕДИ
   Public
// Это своство получающее очередной элемент по номеру
    Function Add : TMyClass;// Это функция создающая и добавляющая элемент в контейнер
    function GetItem: TMyClass;
    Constructor Create;// Создание и освобождение контейнера
    Destructor Free;
   end;
Ну и:
Код:
function TMyCont.GetItem: TMyClass;
begin
{если элемента под таким номером нет вернется NIL
иначе вернется объект }
 Result:=nil;
 if q.Count>0 then Result:=TMyClass(q.Pop);
end;
И наконец:
Код:
  mm:=my.GetItem;
  while mm<>nil do begin
   write(mm.data:6);
   inc(i);
   mm:=my.GetItem;
  end;
P.S. - И да пускай хелп станет тебе ближе чем все методички мира.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.11.2009, 12:07   #8
diliana
Форумчанин
 
Аватар для diliana
 
Регистрация: 24.05.2009
Сообщений: 119
По умолчанию

Stilet
спасибо большое за внимание.

Но я так не могу делать, когда не понимаю. А просто так брать даже готовый код, который не смогу обьяснить - я так не хочу.
Я хочу знать и понять ООП.
Поэтому решила делать с самого начала.
Сделаю так - сначала напишу отдельно очередь с помощью классов. Я уже так и делаю. Структура будет такая - класс элементов и класс очередь. Так мне намного понятнее. За основу взяла примерный код с лекции по теме.
В общем сначала реализую одну очередь, а потом сделаю класс-контейнер для многих очередей.
diliana вне форума Ответить с цитированием
Старый 30.11.2009, 12:12   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
сначала реализую одну очередь
Ради бога. Рекомендую посмотреть в Делфи как устроен класс TQueue, и сделатьпо аналогии.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив указателей (паскаль) diliana Помощь студентам 19 14.11.2009 11:53
Сортировка строк по алфавиту в структуре с помощью указателей Anarki Общие вопросы C/C++ 2 23.10.2009 19:36
Массив указателей на структуры SNAKE89 Общие вопросы C/C++ 4 27.12.2007 10:14