Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
алгоритмы.docx
Скачиваний:
9
Добавлен:
28.05.2015
Размер:
774.21 Кб
Скачать

1.3. Вставка структур

Программный пример представляет процедуру, выполняющую вставку элемента в любое место очереди. { Вставка элемента в очередь } const MAX_EVENT = 100; type EvtType = string[80]; var event: array[1..MAX_EVENT] of EvtType; spos, rpos, t: integer; ch:char; done:boolean; { добавить в очередь } procedure Qstore(q:EvtType); begin if spos=MAX_EVENT then WriteLn('List full') else begin event[spos] := q; spos := spos+1; end; end; End.

1.4. Извлечение.

Извлечение элемента из очереди выполняется просто. Из массива извлекается первый элемент, и весь массив смещается влево, а последний элемент удаляется.

 { Извлечение элемента из очереди } function Qretrieve:EvtType; begin if rpos=spos then begin WriteLn('No appointments scheduled.); Qretrieve := ''; end else begin rpos := rpos+1; Qretrieve := event[rpos-1]; end; end;

На практике в односвязных списках используется преимущественно операция удаления элемента, следующего за данным, так как проход по всему списку - слишком дорогостоящая операция. Получается, также, что мы не можем быстро удалить текущий элемент. [2]

1.5. Анализ сложности алгоритма

Пространственная сложность – О(n) т.е. линейная зависимость от размера очереди.  Удвоение размера задачи удвоит и необходимое время. Сложность обычной вставки О(1) (Устойчивое время работы не зависит от размера задачи).[3]

1.6. Класс входных данных, для которых применим алгоритм или структура

Входными данными в данном алгоритме могут выступать любые натуральные числа. При написании программы и её тестирования использовались данные целого типа integer, в диапазоне значений -2147483648 … 2147483647.

1.7. Примеры практических задач, где может использоваться данный алгоритм.

Очередь в программировании используется, как и в реальной жизни, когда нужно совершить какие-то действия в порядке их поступления, выполнив их последовательно. Примером может служить организация событий в Windows. Когда пользователь оказывает какое-то действие на приложение, то в приложении не вызывается соответствующая процедура (ведь в этот момент приложение может совершать другие действия), а ему присылается сообщение, содержащее информацию о совершенном действии, это сообщение ставится в очередь, и только когда будут обработаны сообщения, пришедшие ранее, приложение выполнит необходимое действие.

Клавиатурный буфер BIOS организован в виде кольцевого массива, обычно длиной в 16 машинных слов, и двух указателей: на следующий элемент в нём и на первый незанятый элемент.

  1. 2. Разработка визуализатора.

2.1. Выбор средств разработки

В качестве средства разработки был выбран объектно-ориентированный язык высокого уровня Delphi, как не единственный, а более освоенный изученный объектно-ориентированный язык программирования.

2.2. Определение отображаемых элементов, проектирование интерфейса

Разработка и проектирование интерфейса были продуманы и реализованы в ходе выполнения курсовой работы. На рис. 2 представлен скриншот приложения.

Рис. 2.2.1

Для создание интерфейса в среде разработки Delphi7 были выбраны следующие элементы:

  1. Label –для создания надписей и элементов графики.

  2. Edit – для вводимых пользователем значений.

  3. Button – клавиши управления.

  4. StringGrid – для отображения массива.

2.3. Разработка алгоритмов прямого пошагового выполнения визуализации и выполнения отката

//Запись очереди в таблицу типа TStringGrid.

procedure QueueToSg(const aQueue : TQueue; aSg : TStringGrid);

var

i,j : Integer;

begin

aSg.Rows[0].Clear;

aSg.Rowcount:=2;

if aQueue.Cnt = 0 then begin

aSg.ColCount :=1;

aSg.Cells[0, 0] := '';

end else begin

aSg.ColCount := aQueue.cnt;

for i := 0 to aQueue.cnt-1 do

aSg.Cells[i, 0] :=aQueue.Arr[i];

end;

for j := 0 to aQueue.Cnt do asg.Cells[j,1]:='...';

if aQueue.start<>-1 then

begin

asg.Cells[aQueue.start,1]:='start';

asg.Cells[aQueue.ent,1]:='end';

if aQueue.start=aQueue.ent then asg.Cells[aQueue.ent,1]:='start end';

end;

if (aQueue.free<>-1) and (aQueue.cnt=0) then

asg.Cells[aQueue.free,1]:='free';

end;

procedure enq(var aQueue : TQueue; const aData : TData);

var

j:integer;

begin

with aQueue do begin

if cnt<length(arr) then begin

inc(cnt);

arr[cnt-1]:=adata;

inc(ent);

if start=-1 then inc(start);

if cnt=length(arr) then

free:=-1

ELSE inc(free);

end else

begin

form1.edit3.text:=arr[start];

arr[start]:=adata;

inc(start);

ent:=start-1;

if start>length(arr)-1 then start:=0;

end;

end;

end;

//Изъятие элемента из начала очереди.

function popr(var aQueue : TQueue):string;

var

i,j : Integer;

begin

if aQueue.cnt=0 then exit;

popr:=aQueue.arr[aQueue.start];

aQueue.arr[aQueue.start]:='';

aQueue.free:=aQueue.start;

if aQueue.cnt<>0 then

with aQueue do begin

if start=ent then

begin

start:=-1;

ent:=-1;

cnt:=0;

free:=0;

end;

if start=0 then begin

for i := 0 to cnt-2 do

arr[i]:=arr[i+1];

aQueue.arr[aQueue.Cnt-1]:='';

dec(ent);

dec(cnt);

end;

if start>ent then begin

for i := start to cnt-2 do

arr[i]:=arr[i+1];

aQueue.arr[aQueue.Cnt-1]:='';

dec(cnt);

end;

if start=cnt then begin

start:=0;

end; end;

Блок-схема алгоритма процедуры представлена в Приложении 1 и 2