есть код программы,нужно организовать счетчик nop... Попробовал сам, но ничего не вышло, так как количество при сортировки 100 элементов выдает 41 миллион. Пример организации счетчика у одногрупника,но у него код на много проще. Код | uses 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+12; 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.
|
|