Кольцевой список

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
v.pro
Сообщения: 2
Зарегистрирован: 25 дек 2013, 23:56

26 дек 2013, 00:01

Всем добрый вечер! Помогите, пожалуйста, доделать задание.
Вот условие:
"Описать класс КОЛЬЦЕВОЙ СПИСОК из произвольных объектов и реализовать действия над списками:
1) Начать работу
2) Длина списка
3) Перейти к следующему элементу
4) Текущий элемент
5) Вставить элемент
6) Удалить элемент
Описать класс ЭЛЕМЕНТ на базе начального объекта, который имеет методы "показать" и "равно", и решить задачу вычисления максимального колличества равных элементов списка, идущих подряд.
Решить задачу для элементов, что вмещают в себе массивы заданного размера."
Описание классов у меня есть и вроде правильное. А вот с самой програмкой не могу разобраться:

Код: Выделить всё

const q=3;

type
  AnyRef = ^AnyObject;
  AnyObject = Object
                public
                  Constructor Init;
                  Destructor Done;
              end;

  Constructor AnyObject.Init;
    begin
    end;
  Destructor AnyObject.Done;
    begin
    end;

type

  rlist = ^relem;
  relem = record
            obj: AnyRef;
            next: rlist
          end;

type

  List = Object(AnyObject)
           r: rlist;
           public
             Constructor RLInit;
             Function Len: integer;
             Procedure Next;
             Function Current: AnyRef;
             Procedure Insert;
             Procedure Delete;
             Destructor RLDone;
         end;

  Constructor List.RLInit;
    begin
      r:=nil
    end;

  Function List.Len: integer;
    var i: word;
        p: rlist;
    begin
      i:=0;
      p:=r;
      if p<>nil then
        repeat
          p:=p^.next;
          i:=i+1
        until p=r;
      Len:=i
    end;

  Procedure List.Next;
    begin
      if r<>nil then
        begin
          r:=r^.next;
        end
      else
        begin
          writeln('Next: Spysok pust');
          halt
        end;
    end;

  Function List.Current: AnyRef;
    begin
      if r<>nil then
        begin
          Current:=r^.obj;
        end
      else
        begin
          writeln('Current: Spysok pust');
          halt;
          Current:=nil;
        end;
    end;

  Procedure List.Insert;
    var p: rlist;
        n: AnyRef;
    begin
      new(p);
      if r=nil then
        begin
          p^.obj:=n;
          p^.next:=p;
        end
      else
        begin
          p^:=r^;
          r^.obj:=n;
          r^.next:=p;
        end;
      r:=p;
    end;

  Procedure List.Delete;
    var p: rlist;
    begin
      if r=nil then
        begin
          writeln('Delete: Spysok pust');
          halt
        end;
      if r^.next=r then
        begin
          p:=r;
          r:=nil
        end
      else
        begin
          p:=r^.next;
          r^:=p^
        end;
      dispose(p)
    end;

  Destructor List.RLDone;
    var p,p1: rlist;
        n: AnyRef;
    begin
      p:=r;
      while p<>nil do
        begin
          n:=p^.obj;
          p1:=p;
          p:=p^.next;
          dispose(p1);
        end;
        r:=nil;
    end;

type M = array [1..q] of integer;

type

  Element = Object(AnyObject)
              mas: M;
              public
                Constructor ElemInit;
                Procedure Show;
                Function Equals(elem: Element): boolean;
                Destructor ElemDone;
            end;

  Constructor Element.ElemInit;
    var mas1: M;
    begin
      mas:=mas1;
    end;

  Procedure Element.Show;
    var j: integer;
    begin
      for j:=1 to q do
        begin
          write(mas[j]);
        end;
    end;

  Function Element.Equals(elem: Element): boolean;
    var mas1: M;
    h: integer;
    begin
      for h:=1 to q do
        begin
          if mas[h]=mas1[h] then
            begin
              Equals:=true;
            end
          else
            begin
              Equals:=false;
            end;
        end;
    end;

  Destructor Element.ElemDone;
    begin
    end;

{-----------------------------------------------------------------------}

var msv: M;
    sp,sp1: List;
    k,l,s: integer;
    elem: Element;
begin
  sp.RLInit;
  sp1.RLInit;
  write('Vvedite dlinu spyska = ');
  read(l);
  for k:=1 to l do
    begin
      

     msv.Insert(elem);
end;
end.
Если бы элементы не состояли из массивов, а просто из цифр, то другое дело. А я с информатикой, увы, не дружила никогда, а тем более с ООП. Мне одногрупник подсказал, что вроде внутри программы в цикле for k:=1 to l создать по одному об’єкту класса Element (пусть будет elem), заполнить его mas, и вставить его в список: "msv.Insert(elem)", а потом сравнивать elem и elem^.next (или что-то вроде того). Но я так и не разобралась, что он имел в виду...
Искала-искала информацию о элементах-массивах, но ничегошеньки не нашла( Поэтому прошу вас, помогите разобраться, что к чему.
Заранее спасибо большое!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

26 дек 2013, 01:03

Класс ELEMENT опишите, как наследник от AnyObject, добавив в него поле, являющееся массивом, например, 5 чисел.
Тут весь фокус в том, что вы сначала пишете программу для работы с циклическим списком, а потом практически ничего не меняя, субклассите AnyObject, и у вас элементами списка становятся маленькие массивчики, а всё написанное ранее продолжает успешно работать.
"показать" — наверное имеется в виду вывод на экран. Т.е. просто вывод на экран массива.
"равно" — это должен быть метод, который принимает указатель на другой элемент в качестве аргумента, и проверяет идентичность. Т.е. сравнивает эти массивы.

PS
Лично я бы всё сделал не так как тут написано. Ни rlist, ни relem не нужны. У самого AnyObject должны быть 2 поля: Prev и Next. Все базовые операции должны быть реализованы как методы AnyObject.
v.pro
Сообщения: 2
Зарегистрирован: 25 дек 2013, 23:56

26 дек 2013, 01:11

Спасибо за ответ! Сейчас попробую сделать, как вы написали)
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

27 дек 2013, 12:22

Naeel Maqsudov писал(а): "показать" — наверное имеется в виду вывод на экран. Т.е. просто вывод на экран массива.
Для большей универсальности можно в класс ELEMENT вставить метод ToString: String, который будет отвечать за визуальное представление элемента
It's a long way to the top if you wanna rock'n'roll
Ответить