Помощь - Поиск - Пользователи - Календарь
Полная версия: Однонаправленный список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
FENIX
Объект - однонаправленный список без головного элемента.
Частное от деления первых 2-х элементов поместить на 3-е место, если первый элемент больше, иначе заменить первые элементы их суммой.
Что-то не допираю, как сделать unsure.gif
volvo
Для начала прочитать здесь: FAQ: Списки, и создать сам список... Я думаю, после прочтения проблема исчезнет smile.gif ...
FENIX
Цитата(volvo @ 29.03.05 21:36)
Для начала прочитать здесь: FAQ: Списки, и создать сам список... Я думаю, после прочтения проблема исчезнет smile.gif ...

Список я создал и все вроде работает (я только не пойму, что с памятью - ПОСЛЕ работы проги ее становится больше blink.gif ).
:low:
Код


Uses Crt;
type Inf = Real;

   Ptr = ^EL;
   EL = record
      Dn : Inf;
      Nx : Ptr;
   end;

  List = object
  Last, First : ptr;
  Count : integer;

  Constructor Init;
  Destructor Done;

  Procedure Delenie;
  Procedure Add_End (D : Inf);
  Procedure Add_Head (D : Inf);
  Procedure Clear;
  Procedure EraseElement (p : ptr);
  Procedure Print;
  end;

  Constructor List.Init;
  begin
     Count := 0;
     First := nil;
     Last := nil;
  end;

  Destructor List.Done;
  begin
     Clear;
  end;

  Procedure List.Clear;
     begin
        EraseElement(First);
        Count := 0;
        Last := nil;
     end;

  Procedure List.EraseElement(p : ptr);
  begin
     if p <> nil then
     begin
        EraseElement(p^.Nx);
        Dispose(p);
        p := nil;
    end;
  end;

  Procedure List.Add_Head(D : Inf);
  var p, q : Ptr;
  begin
     New(p);
     p^.Dn := D;
     p^.Nx := q;
     q := p;
  end;

  procedure List.Add_End(D : Inf);
  var p : Ptr;
  begin
     New(p);
     p^.Dn := D;
     p^.Nx := nil;
     if Last = nil then
     begin
        First := p;
        Last := p;
     end
     else
     begin
        Last^.Nx := p;
        Last := p;
     end;
     Inc(Count);
  end;

  Procedure List.Print;
  var p : Ptr;
  begin
     p := First;
     While p <> nil do
     begin
        write(p^.Dn : 4,' ');
        p := p^.Nx;
     end;
     writeln;
  end;

=====================================================
  Procedure List.Delenie;
  var q, s, c : ptr;
  Chastnoe, a, b : inf;
  begin
     a := First^.Dn;
     q := First^.Nx;
     b := s^.Dn;
     If a > b then
     begin
     Chastnoe := a / b;
     s := q^.Nx;
     s := nil;
     end
     else
     writeln('Help plz;) ');
  end;
=====================================================

  var L1 : List;
      A : integer;

  BEGIN
  ClrScr;


{$I+}
     Assign(input, 'input.txt');
     Reset(input);
{$I-}
    while not EoF do
    begin
       Read(A);
       {L1.Add_Head(A);}
       L1.Add_End(A);
    end;
    writeln('Pamyati DO= ',MemAvail);
        writeln;
        L1.Print;
        L1.Delenie;
        Close(Input);
        L1.Done;
        writeln;
        writeln('Pamyati POSLE= ',MemAvail);
        readln;
  END.

В процедуре Delenie я и намерен все сделать. Частное находит верно, но не могу понять, как 3-ий элемент заменить частным...
volvo
Цитата(FENIX @ 29.03.05 21:18)
Список я создал и все вроде работает (я только не пойму, что с памятью - ПОСЛЕ работы проги ее становится больше blink.gif ).


blink.gif Может, потому что сравниваем некорректно? Уж если брать второй MemAvail после деструктора, то наверное, первый раз MemAvail нужно брать перед конструктором (который, кстати, не вызывается, а это - грубейшая ошибка) ...

А насчет процедуры - я бы исправил вот так ...
Код
Procedure List.Delenie;
var
 Chastnoe, a, b : inf;
 pp: ptr;
begin
 pp := first;
 a := pp^.Dn; { берем первый элемент }
 pp := pp^.Nx; { перемещаемся ко второму }
 b := pp^.Dn; { берем второй элемент }
 pp := pp^.Nx; { перемещаемся к третьему }

 If (a > b) and (abs(b) > 10E-6) then begin { на ноль не делим }
   Chastnoe := a / b;
   pp^.Dn := Chastnoe; { результат - в третий элемент }
 else begin
   { вот тут немного условие неясно, но я думаю,
      по аналогии разобраться можно }
 end;
end;
volvo
Кстати, FENIX, в программе есть еще 2 недочета:

1. В процедуре добавления в список спереди - не увеличивается счетчик элементов и начнутся проблемы при добавлении элемента в пустой список. Вот более правильный вариант:
Код
Procedure List.Add_Head(D : Inf);
var p, q : Ptr;
begin
 New(p);
 p^.Dn := D;
 p^.Nx := q;
 If First = nil Then Last := p; { <--- Это было упущено }
 q := p;
 Inc(Count); { <--- Это тоже }
end;


2. Процедуру добавления элементов в хвост списка можно немного оптимизировать:
Код
procedure List.Add_End(D : Inf);
var p : Ptr;
begin
 New(p);
 p^.Dn := D;
 p^.Nx := nil;
 if Last = nil then First := p
 else Last^.Nx := p;

 Last := p;
 Inc(Count);
end;
FENIX
Спасибо за замечания и дополнения :D

{Ушел кодить}

==========================

Доделал! :D

Может, кривовато, но работает:
:low:
Код

else {2 sly4ai - zamena pervbIx elementov ix symmoi}
     begin
        p := first;
        a := p^.Dn;
        p := p^.Nx;
        b := p^.Dn;
        Symma := a + b;
        p := first;
        a := p^.Dn;
        p^.Dn := Symma;
        p := p^.Nx;
        b := p^.Dn;
        p^.Dn := Symma;
     end;
volvo
Ну, зачем же так сложно?
Ведь a и b уже считаны !!!
Код
Procedure List.Delenie;
var
Chastnoe, a, b : inf;
pp: ptr;
begin
pp := first;
a := pp^.Dn; { берем первый элемент }
pp := pp^.Nx; { перемещаемся ко второму }
b := pp^.Dn; { берем второй элемент }
pp := pp^.Nx; { перемещаемся к третьему }

If (a > b) and (abs(b) > 10E-6) then begin { на ноль не делим }
  Chastnoe := a / b;
  pp^.Dn := Chastnoe; { результат - в третий элемент }
else begin
  p := first; p^.Dn := a + b;
  p := p^.Nx; p^.Dn := a + b;
end;
end;
FENIX
Хм...
Как оказалось, оба задания я понял неправильно...
И решать их нужно по-другому... blink.gif

===========================

Но я решил :D

volvo
Огромное спасибо еще раз :D :molitva:
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.