- •Пояснительная записка
- •2014 Г.
- •Оглавление
- •Введение
- •1. Очередь в циклическом массиве.
- •1.1. Описание работы алгоритма
- •1.2. Способы построения
- •1.3. Вставка структур
- •1.4. Извлечение.
- •1.5. Анализ сложности алгоритма
- •1.6. Класс входных данных, для которых применим алгоритм или структура
- •1.7. Примеры практических задач, где может использоваться данный алгоритм.
- •2. Разработка визуализатора.
- •2.1. Выбор средств разработки
- •2.2. Определение отображаемых элементов, проектирование интерфейса
- •2.3. Разработка алгоритмов прямого пошагового выполнения визуализации и выполнения отката
- •2.4. Особенности программной реализации
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 машинных слов, и двух указателей: на следующий элемент в нём и на первый незанятый элемент.
2. Разработка визуализатора.
2.1. Выбор средств разработки
В качестве средства разработки был выбран объектно-ориентированный язык высокого уровня Delphi, как не единственный, а более освоенный изученный объектно-ориентированный язык программирования.
2.2. Определение отображаемых элементов, проектирование интерфейса
Разработка и проектирование интерфейса были продуманы и реализованы в ходе выполнения курсовой работы. На рис. 2 представлен скриншот приложения.
Рис. 2.2.1
Для создание интерфейса в среде разработки Delphi7 были выбраны следующие элементы:
Label –для создания надписей и элементов графики.
Edit – для вводимых пользователем значений.
Button – клавиши управления.
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