Показать сообщение отдельно
  #15  
Старый 26.02.2010, 10:55
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

В общем тоже не ахти - давно с такими примитивами не работал и старался изменения по минимуму - но вроде работает
Код:
program new_stack;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type
  PElem = ^TElem;
  TElem = record // структура элемента
    inf: real;
    next: PElem;
  end;

  TStack = record
    first: PElem;
  end;

  TOcher = record
    first: PElem;
    last: PElem;
  end;

  /////////////////////// Добавляем в стек ///////////////////////////////////////

procedure Push_stak(var Stack: TStack; Sim: real);
var
  x: PElem;
begin
  New(X);
  X^.inf := Sim;
  X^.next := Stack.first;
  Stack.first := X;
end;

//////////////////////////// Достаём верхний элемент стека /////////////////////

function Pop_stak(var Stack: TStack; var INF: real): Boolean;
var
  x: PElem;
begin
  if Stack.first = nil then
    Result := false
  else
  begin
    Result := true;
    X := Stack.first;
    Stack.first := X^.next;
    INF := X^.inf;
    Dispose(x);
  end;
end;

//////////////////////////// Удаляем элемент стека /////////////////////

procedure Remove_stak(var Stack: TStack; Elem: PElem);
var
  x: PElem;
begin

  if Stack.first = Elem then
    Stack.first := Elem^.next
  else
  begin
    X := Stack.first;
    while X^.next <> nil do
    begin
      if X^.next = Elem then
      begin
        X^.next := Elem^.next;
        break;
      end;
      X := X^.next;
    end;

    Dispose(Elem);
  end;
end;
//////////////////////////////////////////////////////////////////////////////////

//////////////////////// Занесение в очередь ///////////////////////////////////

procedure Push_Ocher(var Ocher: TOcher; c: real);
var
  Elem: PElem;
begin
  new(Elem);
  Elem^.inf := c;
  Elem^.Next := nil;
  if Ocher.first = nil {проверяем, пуста ли очередь} then
    Ocher.first := Elem {ставим указатель начала очереди на первый созданный элемент}
  else
    Ocher.last^.next := Elem; {ставим созданный элемент в конец очереди}
  Ocher.last := Elem; {переносим указатель конца очереди на последний элемент}
end;

///////////////////////////// Чтение из очереди /////////////////////////////////

function Pop_Ocher(var Ocher: TOcher; var INF: real): Boolean;
var
  Elem: PElem;
begin
  if Ocher.first = nil then
    Result := false
      //    writeln('Очередь пуста')
  else
  begin
    Result := true;
    Elem := Ocher.first; {ставим промежуточный указатель на первый элемент очереди}
    INF := Elem^.inf; {считываем искомое значение в переменную с}
    Ocher.first := Elem^.Next; {указатель начала переносим на следующий элемент}
    if Elem^.Next = nil then {очередь пуста}
      Ocher.last := nil;
    dispose(Elem); {освобождаем память, занятую уже ненужным первым элементом}
  end;
end;

var
  MY: TStack;
  TmpElem, NextElem: PElem;
  I: Integer;
  uz, R, S: real;
  Ocher: TOcher;
begin
  R := 0;
  S := 0;
  Randomize;
  write('Input Uz :');
  readln(uz);

  MY.first := nil;
  Ocher.first := nil;
  Ocher.last := nil;

  for I := 0 to 10 do
  begin
    Push_stak(MY, random(10000) / 100);
  end;

  write('Ishodn stack :');

  TmpElem := MY.first;
  while TmpElem <> nil do
  begin
    write(Format('%.2f', [TmpElem^.inf]));
    write('-->');
    TmpElem := TmpElem^.next;
  end;
  writeln('');
  readln;

  TmpElem := MY.first;
  while TmpElem <> nil do
  begin
    NextElem := TmpElem^.next;
    if TmpElem^.inf <= uz then // не превосходят, значит <= а было <
    begin
      R := R + TmpElem^.inf;
      Push_Ocher(Ocher, TmpElem^.inf); {помещаем элемент в очередь }
      Remove_stak(MY, TmpElem); {удаляем из стека}
    end
    else // значит больше
    begin
      S := S + TmpElem^.inf;
    end;
    TmpElem := NextElem;
  end;

  /////////////// Вывод стека ////////////////////////////////////////////////
  write('Stack :');
  TmpElem := MY.first;
  while TmpElem <> nil do
  begin
    write(Format('%.2f', [TmpElem^.inf]));
    write('-->');
    TmpElem := TmpElem^.next;
  end;
  writeln('');

  /////////////// Вывод Очереди ////////////////////////////////////////////////
  write('Ocher :');
  TmpElem := Ocher.first;
  while TmpElem <> nil do
  begin
    write(Format('%.2f', [TmpElem^.inf]));
    write('-->');
    TmpElem := TmpElem^.next;
  end;
  writeln('');

  /////////////// Вывод итогового числа ////////////////////////////////////////////////
  write('Iskomoe chislo : ');
  write((uz + R) / (uz + S));

  ///// очищаем
  while Pop_stak(MY, R) do ;
  while Pop_Ocher(Ocher, R) do ;

  readln;
end.
Смотри - если что не так или вопросы процитируй отвечу.
( я не очень люблю много коментов - ленивый )
Ответить с цитированием