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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2018, 14:50   #1
oleg no
 
Регистрация: 07.05.2017
Сообщений: 4
По умолчанию Организация счетчика в стеке

есть программа работы со стеком и нужно организовать счетчик, так как в этом вопросе не силен, решил обраться чтобы узнать, где что упустил или переборщил.
[CODEses
SysUtils;
type
tItem = ^pItem;
pItem = record
n : Integer;
x : tItem;
end;

type
tStack = record
Items : tItem;
Empty : boolean;
end;
var
t,t1,t2: TDateTime;
ch:int64;
function NewStack : tStack;
var
Stack : tStack;
begin
Stack.Items := nil;
Stack.Empty := True;
NewStack := Stack;
ch:=ch+5;
end;

procedure Push(n : Integer; var Stack : tStack);
var
tmp : tItem;
begin
New(tmp);
tmp^.n := n;
tmp^.x := Stack.Items;
Stack.Items := tmp;
Stack.Empty := False;
ch:=ch+10;
end;

function Pop(var Stack : tStack) : Integer;
var
res : Integer;
tmp : tItem;
begin
if Not Stack.Empty then
begin
tmp := Stack.Items;
Stack.Items := Stack.Items^.x;
Stack.Empty := Stack.Items = nil;
res := tmp^.n;
Dispose(tmp);
ch:=ch+13;
end;
Pop := res;
ch:=ch+2;
end;

function CreateStack(n : Integer) : tStack;
var
Stack : tStack;
begin
Stack := NewStack;
while n > 0 do
begin
Push(Random(200)-50, Stack);
Dec(n);
ch:=ch+3;
end;
CreateStack := Stack;
ch:=ch+3;
end;

procedure PrintStack(Stack : tStack);
var
tmp : tItem;
begin
tmp := Stack.Items;
if Stack.Empty then
Write('Стек пуст!')
else
while tmp <> nil do
begin
Write(#32, tmp^.n); tmp := tmp^.x;
ch:=ch+2;
end;
ch:=ch+3;
WriteLn;
end;

procedure ClearStack(var Stack : tStack);
begin
while Not Stack.Empty do Pop(Stack);
ch:=ch+2;
end;

procedure SortStack(var Stack : tStack);
var
swap : Boolean;
tmpStack : tStack;
n1, n2 : Integer;
begin
if Stack.Empty then Exit;
tmpStack := NewStack;
repeat
swap := False;
n1 := Pop(Stack);
while Not Stack.Empty do
begin
n2 := Pop(Stack);
if n1 > n2 then
begin
Push(n2, tmpStack); swap := True;
end
else
begin
Push(n1, tmpStack); n1 := n2;
end;
ch:=ch+2;
end;
Push(n1, Stack);
while Not tmpStack.Empty do
Push(Pop(tmpStack), Stack);
ch:=ch+3;
until Not swap;
ch:=ch+3;
end;

var
Stack : tStack;
begin
Stack := CreateStack(1000);
writeln('Не отсортированный стек');
PrintStack(Stack);
t1:=now;
writeln('отсортированный стек');
SortStack(Stack);
PrintStack(Stack);
ClearStack(Stack);
t2:=now; t:=t2-t1;
writeln('Время сортировки: ',FormatDateTime('hh:mm:ss.zzz',t)) ;
write('количество операций со стеком: ',ch);
readln;
end.][/CODE]
счетчик делал как у одногрупника, то бишь где присваивание +1 к счетчику,если присваиваются указатели 2-3 и тд, но выходят слишком большие цифры. Уже не первый день голову ломаю с этими счетчиками
Код:
program Project4;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type ochered=^Rec;
     Rec=record
     info:    integer;
     next:    ochered;
     end;
var
head, head1:  ochered;
n, i, j, z, k,  y, x, x1: integer;
t,t1,t2: TDateTime;
ch: int64;

procedure push(var head:ochered; x:integer);  // 6
var a:        ochered;
begin
    new(a);                                //+1
    a^.info:=x;                            //+2
    a^.next:=head;                         //+2
    head:=a;                               //+1
    ch:=ch+6;
end;

procedure pop(var head:ochered; var x:integer);  //8+
var a, p:     ochered;
begin
   a:=head;  p:=head; ch:=ch+3;          //+2
       while a^.next<>nil do begin       //+2
         p:=a; a:=a^.next; ch:=ch+4;     //+3
       end;
   x:=a^.info; p^.next:=nil;             //+4
   dispose(a);                           //+1
   ch:=ch+5;
end;

function empty(head:ochered): boolean;    //2
begin
   empty:=head=nil;                      //+2
   ch:=ch+2;
end;

procedure iniz(var head:ochered; var n:integer);  //1+
var x, i:      integer;
begin
   for i:= 1 to n do begin
      x:=Random(501)+300;             //+3
      push(head,x);                   //+6
      ch:=ch+9;
   end;
end;

BEGIN
ch:=0; //счетчик
write('Enter the number of items: ');
   readln(n);
   t1:=now;
   head := nil;
iniz(head,n);
head1:=nil;
ch:=ch+6;

For i:= 1 to n-1 do
  For j:= n downto i+1 do begin
    if not empty(head1) then begin  //+3
      head:=head1;                    //+1
      head1:=nil;                     //+1
      ch:=ch+2;
    end;
    ch:=ch+1;
    For z:=1 to j-2 do begin   //1+
       pop(head,y); push(head1,y);//+6+8+
    end;
    ch:=ch+2;
    pop(head,x); pop(head,x1); // 16+2*
    If x>x1 then begin       //+1
      push(head1,x); push(head1,x1);
    end //+12
    else begin
      push(head1,x1); push(head1,x);
    end; //+12
    ch:=ch+1;
    If j<n then begin                    //+1
        For k:= 1 to n-j do begin      //1+
          pop(head,y); push(head1,y);       //+6+8
        end;
        ch:=ch+1;
    end;
    ch:=ch+1;
end;

For i:= 1 to n do begin
  pop(head1,x);
  writeln('stack[',i,'] = ',x);
  ch:=ch+1;
end;
ch:=ch+1;
t2:=now; t:=t2-t1;
writeln;
writeln('Your time: ',FormatDateTime('hh:mm:ss.zzz',t));
writeln('Num of operations: ',ch);
readln;

  try
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.

Последний раз редактировалось oleg no; 28.03.2018 в 14:53.
oleg no вне форума Ответить с цитированием
Старый 28.03.2018, 14:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну, во-первых, по правилам хорошего тона надо в начале программы обязательно проиницилизировать переменную:
Код:
ch:=0; //обнулить счетчик
во-вторых, не не очень понятно, почему к счётчику добавляются где 2, где 3, а где даже 13.

в-третьих, а что означает
Цитата:
Сообщение от oleg no Посмотреть сообщение
если присваиваются указатели 2-3 и тд, но выходят слишком большие цифры.
?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.03.2018, 15:04   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Скорее всего это счетчик операций. Для указателей, наверное, учитывается разыменование и собственно присваивание. Но сначала нужно нормальное ТЗ, а то гадать можно долго.
p51x на форуме Ответить с цитированием
Старый 28.03.2018, 15:13   #4
oleg no
 
Регистрация: 07.05.2017
Сообщений: 4
По умолчанию

с помощью указателей сделать сортировка стека используя процедуры pop и push
oleg no вне форума Ответить с цитированием
Старый 28.03.2018, 15:19   #5
oleg no
 
Регистрация: 07.05.2017
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну, во-первых, по правилам хорошего тона надо в начале программы обязательно проиницилизировать переменную:
Код:
ch:=0; //обнулить счетчик
во-вторых, не не очень понятно, почему к счётчику добавляются где 2, где 3, а где даже 13.

в-третьих, а что означает
?
да делал по примеру,но я понял к чему вы клоните,просто уже запутался и понял наверное вы про что. Просто вообще беда,препод задал задание с написанием программы и нахождение Nod, но вообще не объяснил как считать и пришлось по примеру одногрупника делать.
if Not Stack.Empty then
begin
tmp := Stack.Items; /1 присваивание
Stack.Items := Stack.Items^.x; /1+1+1+1 присваивание указателей
Stack.Empty := Stack.Items = nil;/1+1+1+1
res := tmp^.n;/1+1
Dispose(tmp);/1
ch:=ch+13;
oleg no вне форума Ответить с цитированием
Старый 28.03.2018, 15:44   #6
oleg no
 
Регистрация: 07.05.2017
Сообщений: 4
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Скорее всего это счетчик операций. Для указателей, наверное, учитывается разыменование и собственно присваивание. Но сначала нужно нормальное ТЗ, а то гадать можно долго.
Создать стек и сортировать его с помощью pop и push. И найти nop, но видел что люди писали в своих работах операция со стеком,так что не знаю разные ли это вещи

Последний раз редактировалось oleg no; 28.03.2018 в 15:54.
oleg no вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Максимум в стеке akademochka Общие вопросы C/C++ 5 12.03.2013 23:19
количество элементов в стеке svkpro Помощь студентам 8 30.11.2012 22:40
Pascal. Сортировка в стеке aleksandrbol Помощь студентам 5 04.12.2011 20:10