Вопрос № 180873: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Помогите с решением этой лабораторной на тему "Стек и Очередь" 19 вариант вот тег фаила: ЛР6http://rfpr...
Вопрос № 180873:
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: Помогите с решением этой лабораторной на тему "Стек и Очередь" 19 вариант вот тег фаила: ЛР6http://rfpro.ru/upload/3384 Отчет оформлять ненадо, просто требуется выполнить реализацию стека и очереди для 19 варианта на FPC и решение задачи с ипользованием данной реализации стека и очереди. Оформить ответ как единая программа. Можно модуль, но с ними всегда
проблемы - чтото со средой не то.
Отвечает Сергей Бендер (6-й класс) :
Здравствуйте, Юдин Евгений Сергеевич!
Итак, готово.
1) Работает вроде правильно. Я проиграл параметрами -- результы соответствующие. 2) Из заготовок повыкидывал лишнее: что-то стёр, что-то закомментарил. Сначала пытался реализовывать всё строго по прописанному -- сильно усложняется всё без всякой пользы. (Например, удаление списка с нетипизированным указателем на Data реализуется в модлую двольно путанно. При том, что оно в программе не нужно.) 3) В задании не сказано как генерируются
задачи. Сделал по собственному пониманию. dTg -- среднее время между событиями. Это величина обратная к средней частоте события в смысле показательного вероятностного распределния. Отсюда вытекает условие "if r<1/dTg". 4) Хотя в задании сказано все задачи выводить в виде (имя,время), я не понял зачем это выводить для очередей и стеков. Тем более что для одних очередей сответствует Time1, другим -- Time2. Значит надо будет писать разные процедуры вывода. Я
вывел только в процессоре оставшееся вермя. Если время обязательно должно быть и в очередях со стеками, добавь или напиши мне.
В общем, вот:
List4.pas
Код:
Unit List4; Interface Const ListOk
= 0; ListNotMem = 1; ListUnder = 2; ListEnd = 3; SizeList = 100; Type BaseType = Pointer; Index = 0..SizeList; PtrEl = Index; Element = Record Data : BaseType; Next : PtrEl; Flag : Boolean {TRUE, если элемент } {принадле
жит ОЛС } End; {FALSE, если "свободен"} List = Record Start,Ptr : PtrEl; N : Word End; Var MemList: array[Index] of Element; ListError : 0..3; Procedure InitList(var L:List); {Procedure PutList(var L:List; E:BaseType); Procedure GetList(var L:List; var E:BaseType); Function ReadList(var L:List):Pointer;} Function EmptyList(var L:List):boolean; Function
EndList(var L:List):boolean; Function Count(var L:List):Word; Procedure BeginPtr(var L:List); Procedure MovePtr(var L:List); {Procedure EndPtr(var L:List); Procedure MoveTo(var L:List; N:word); Procedure DoneList(var L:List); Procedure CopyList(var L1,L2:List);}
Implementation
Procedure InitList(var L:List); begin L.Start:=0; L.Ptr:=0; L.N:=0; end;
{Procedure PutList(var L:List;
E:BaseType); Procedure GetList(var L:List; var E:BaseType); Function ReadList(var L:List):Pointer;}
Function EmptyList(var L:List):boolean; begin EmptyList:=L.start=0; end;
Function EndList(var L:List):boolean; begin EndList:=MemList[L.ptr].next=0; end; { EndList }
Function Count(var L:List):Word; begin Count:=L.N-1 end; { Count }
Procedure BeginPtr(var L:List); begin if L.start=0 then ListError:=ListNotMem else
begin ListError:=ListOk; L.ptr:=L.start; end; end; { BeginPtr }
Procedure MovePtr(var L:List); begin if L.ptr=0 then ListError:=ListNotMem else begin L.ptr:=MemList[L.ptr].next; if L.ptr=0 then ListError:=ListEnd end; end; { MovePtr }
unit stack8; interface uses list4; {см лаб.раб. №5} const StackOk=ListOk; StackUnder=ListUnder; StackOver=ListNotMem; type stack=list;
procedure InitStack(var s : stack); {инициализация стека} procedure PutStack(var s : stack; b : basetype);
{поместить элемент в стек} procedure GetStack(var s : stack; var b : basetype); {извлечь элемент из стека } function EmptyStack(s : stack):boolean; {стек пуст} procedure ReadStack(s:Stack;var b : basetype); {прочитать элемент из вершины стека} {procedure DoneStack(var s:Stack);}{разрушить стек} var stackerror:byte;
implementation
Function NewMem: word; {воз
вращает номер свободного элемента, начиная с 1-го 0-й зарезервирован, как недействующий (аналог nil)} var i:PtrEl; begin i:=1; while MemList[i].Flag and (i<=SizeList) do inc(i); NewMem:= i; end;
Procedure DisposeMem(n:PtrEl); {помечает n-й элемент мас-сива как свободный} begin MemList[n].Flag:=false; end;
procedure InitStack(var s : stack); begin InitList(s); end;
procedure PutStack(var s : stack; b : basetype); var
i:PtrEl; begin i:=NewMem; {находит свободный элемент} if i>SizeList then stackerror:=ListNotMem else begin MemList[i].next:=s.start; {ставит его в голову стека} MemList[i].Data:=b; MemList[i].Flag:=true; s.start:=i; {сдвигает на него голову стека} inc(s.N); end; end;
procedure GetStack(var s : stack; var b : basetype); var i:PtrEl; be
gin if s.start=0 then ListError:=ListEnd else begin {Запоминается элемент и данные из него. Хотя можно обойтись без i и подавать в DisposeMem саму s.start } i:=s.start; b:=MemList[s.start].Data; s.start:=MemList[s.start].next; DisposeMem(i); end; end;
function EmptyStack(s : stack):boolean; begin EmptyStack:=EmptyList(s); end;
procedure ReadStack(s:Stack;var b : basetype); begin if s.ptr=0 then
ListError:=ListEnd else b:=MemList[s.ptr].Data; end;
{procedure DoneStack(var s:Stack);}
end.
FIFO9.PAS
Код:
Unit Fifo9;
Interface Const FifoOk = 0; FifoOver = 1; FifoUnder= 2; var FifoError:0..2; Type TInquiry= record Name: String[10]; {имя запроса} P: Byte; {приоритет} Time1: Word; {время выполнения задачи процессором P1} Time2: Word; {время выполнения задачи процессором P2} end; BaseType = TInquiry;
Const
FifoSize = 65520 div sizeof(BaseType); Type Index = 0..FifoSize-1; TBuf = array[Index] of BaseType; Fifo = record PBuf: ^TBuf; SizeBuf: word; {количество элементов в массиве} Uk1 : Index; {указывает на "голову" очереди} Uk2 : Index; {указывает на "хвост" очереди} end; procedure InitFifo(var f : fifo; size: word); {инициализация очереди} procedu
re PutFifo(var f : fifo; b : basetype); {поместить элемент в очередь} procedure GetFifo(var f : fifo; va
r b : basetype); {извлечь элемент из очереди} function EmptyFifo(f : fifo):boolean; {очередь пуста} procedure DoneFifo(var f: fifo);{разрушить очередь}
implementation
procedure InitFifo(var f : fifo; size: word); var i:integer; begin new(f.PBuf); f.SizeBuf:=0; f.Uk1:=0; f.Uk2:=0;
end;
procedure incFifo(var Uk:Index); {Сдвиг указателя очереди с учётом перехода через конец массива} begin if Uk<FifoSize
then inc(Uk) else Uk:=0; end;
procedure PutFifo(var f : fifo; b : basetype); begin if f.SizeBuf>FifoSize then FifoError:=FifoOver else begin inc(f.SizeBuf); if f.SizeBuf>1 {при добавлении первого элемента положение указателей менять не надо} then incFifo(f.Uk2); f.PBuf^[f.Uk2]:=b; end; end;
procedure Ge
tFifo(var f : fifo; var b : basetype); begin if f.SizeBuf<=0 then FifoError:=FifoUnder else begin b:=f.PBuf^[f.Uk1]; {f.PBuf^[f.Uk1].Name:='';!!!} dec(f.SizeBuf); if f.SizeBuf>0 then incFifo(f.Uk1); {при удалении последнего элемента сдвигать уже ничего не надо } end; end;
function EmptyFifo(f : fifo):boolean; {очередь пуста} begin EmptyFifo:= f.SizeBuf = 0; end;
const Phigh=0.3; {вероятность получения задач с высоким приоритетом} Tinqmax=10; {максимальное время обработки задачи процессором} dTg=3; {среднее время выдачи задач генератором} Tg=100; {время работы генератора}
type TProc = record inq:TInquiry; {исполняемая задача} pinq:^TInquiry; {указатель для отправки/полчения задач из
стека} S:stack; Tstart:Word; {время полчения текущей задачи} end;
function RandName(Time:Word):string; {Формирование имени задачи.} var i:integer; s:string[10]; begin str(Time,s); {В начале ставится текущее время
} for i:=length(s)+1 to 10 do s:=s + chr(ord('a') + random(26)); RandName:=s; end;
procedure PrintFifo(f:fifo); {Вывод очереди на экран} var i:integer; begin if f.SizeBuf>0 then begin if f.Uk2>=f.Uk1 {очередь одним куском: голова дальше хвоста } then for i:=f.Uk1 to f.Uk2 do write(f.PBuf^[i].Name,' '); if f.Uk2<f.Uk1 {очередь разделена: на две части } then begin
for i:=f.Uk1 to FifoSize-1 do {от хвоста до конца массива} write(f.PBuf^[i].Name,' '); for i:=0 to f.Uk2 do {от начала массива до головы} write(f.PBuf^[i].Name,' '); end; end; writeln; end;
procedure PrintStack(s:stack); {Вывод стека на экран} var p:^TInquiry; begin BeginPtr(s); if ListError=ListOk then while ListError<>ListEnd do
begin ReadStack(s,pointer(p)); write(p^.Name,' '); MovePtr(s);
end; writeln; end;
begin InitFifo(F1,0); InitFifo(F2,0); InitFifo(F3,0); InitFifo(F4,0); InitStack(P1.S); P1.Tstart:=65535; {пока не сгенерирована никакая задача, задаётся заведомо большое число } P1.inq.Name:=''; {пустая строка в Name -- признак отсутствия задачи} InitStack(P2.S); P2.Tstart:=65535; P2.inq.Name:='';
T:=0; randomize;
repeat {Работа генератора} r:=random; {разыгрывается генерирование задачи} if T>Tg then r:=1/dTg+1; {если закончилось время работы генератора} if r< 1/dTg then begin G.Name:=RandName(T); G.Time1:=random(Tinqmax)+1; G.Time2:=random(Tinqmax)+1; r:=random; {разыгрывается приоритет з
адачи} if r < Phigh then begin G.P:=0; {высокий приоритет} G.Name[10]:='0'; {приоритет добаляется в имя задачи} PutFifo(F1,G); end else begin G.P:=1; {низкий приоиртет} G.Name[10]:='1'; PutFifo(F2,G); end end;
{процессор P1}
with P1 do begin {обработка текущей задачи} if (inq.Name<>'') and (T>=Tstart + inq.Time1) {если в процессоре есть задача и время её обработоки истекло} then begin {отправить её в очередь F3 или F4} if inq.P=0 then PutFifo(F3,inq) else PutFifo(F4,inq);
inq.Name:=''; end;
if not EmptyFifo(F1) {если очередь F1 (с высоким приоритетом) не пуста } then begin if (inq.Name<>'') and (inq.P=1) {если в процессоре есть задача с низким приоритетом} then begin {учесть время потарченное на обработку задачи} inq.Time1:=inq.Time1 - (T -
Tstart); {отправить в стек} new(pinq); pinq^:=inq; PutStack(S,pinq); inq.Name:=''; end; {если процессор стал свободен} if inq.Name='' then begin GetFifo(F1,inq);
Tstart:=T; end; end; {если ни в процессоре ни в очереди F1 не оказалось задачи с высоким приоритетом} if inq.Name='' then begin {проверить стек} if not EmptyStack(S) then begin GetStack(S,pointer(pinq)); inq:=pinq^; dispose(pinq);
Tstart:=T; end {проверить очередь F2} else if not EmptyFifo(F2) then begin GetFifo(F2,inq); Tstart:=T; end; end; end;
{процессор P2} with P2 do begin {аналогично процесс
ору P1} if (inq.Name<>'') and (T>=Tstart + inq.Time2) then begin
{удаление выполненой задачи} inq.Name:=''; end;
if not EmptyFifo(F3) then begin if (inq.Name<>'') and (inq.P=1) then begin inq.Time2:=inq.Time2 - (T - Tstart); new(pinq); pinq^:=inq; PutStack(S,pinq); inq.Name:='';
end; if inq.Name='' then begin GetFifo(F3,inq); Tstart:=T; end; end;
if inq.Name='' then begin if not EmptyStack(S) then begin GetStack(S,pointer(pinq));
inq:=pinq^; dispose(pinq); Tstart:=T; end else if not EmptyFifo(F4) then begin GetFifo(F4,inq); Tstart:=T; end; end; end;
inc(T); {следующий отсчёт времени}
{Вывод на экран}
writeln('================='); writeln('Time ',T);
write('P1 '); {Вывод оставшегося времени выполнения задачи} if P1.
inq.Name<>'' then write('(',P1.inq.Name,',',(P1.Tstart + P1.inq.Time1) - T,') '); writeln;
write('P2 '); {Вывод оставшегося времени выполнения задачи}
if P2.inq.Name<>'' then write('(',P2.inq.Name,',',(P2.Tstart + P2.inq.Time2) - T,') '); writeln;
readln;
{завершение работы после времени Tg и опустошения всех очередей, стеков и процессоров} until (T>Tg) and EmptyFifo(F1) and EmptyFifo(F2) and EmptyFifo(F3) and EmptyFifo(F4) and EmptyStack(P1.S) and EmptyStack(P2.S) and (P1.inq.N
ame='') and (P2.inq.Name=''); end.
Ответ отправил: Сергей Бендер (6-й класс)
Ответ отправлен: 05.12.2010, 20:00
Номер ответа: 264537
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 264537
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.