Консультация № 180873
21.11.2010, 13:33
51.70 руб.
0 29 1
Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
Помогите с решением этой лабораторной на тему "Стек и Очередь" 19 вариант
вот тег фаила:
ЛР6https://rfpro.ru/upload/3384
Отчет оформлять ненадо, просто требуется выполнить реализацию стека и очереди для 19 варианта на FPC и решение задачи с ипользованием данной реализации стека и очереди.
Оформить ответ как единая программа. Можно модуль, но с ними всегда проблемы - чтото со средой не то.

Спасибо за внимание.

Обсуждение

давно
Профессионал
304622
583
22.11.2010, 00:14
общий
Скачал файл и не понял, где там "19-й вариант"?
Неизвестный
22.11.2010, 20:10
общий
Варианты индивидуальных заданий смотрите!
Неизвестный
22.11.2010, 20:10
общий
Также можно писать на АБС паскале
Неизвестный
22.11.2010, 21:01
общий
Адресаты:
Будете писать? Задание несложное - нежно наполнить содержимым функции (и процедуры)
давно
Профессионал
304622
583
23.11.2010, 21:07
общий
Цитата: 422
Будете писать?


Я не понял где там "19 вариант". И автор ничего не поясняет. Если Вы поняли -- пожалуйста, пишите.
давно
Профессионал
304622
583
23.11.2010, 21:14
общий
Цитата: 324791
Варианты индивидуальных заданий смотрите!


Уже смотрел -- ничего не понял. Трудно было просто взять свой "19 вариант" и выложить в мини-форум?

Кажется, Boriss понял ваше задание. Вопросы -- к нему.
давно
Посетитель
7438
7205
24.11.2010, 14:22
общий
Адресаты:
Я не понял, в чем, собственно, сложность?
Открываем таблицу на странице 7. Видим строку
[table]
[row][col]Номер варианта[/col][col]Номер модуля для стека[/col][col]Номер модуля для очереди[/col][col]Номер задачи[/col][/row]
[row][col]
19
[/col][col]
8
[/col][col]
9
[/col][col]
11
[/col][/row]
[/table]
Далее, находим задачу 11 (на странице 17), модуль 8 для реализации стека (стр 21), модуль 9 для очереди (стр 26)
Что непонятного?
Будете делать? Продлить срок для подачи ответа?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Профессионал
304622
583
24.11.2010, 14:41
общий
Адресаты:
Ну не заметил я этой таблицы! Всё равно моё высокоблагородие оскорблено неуважением.

....

Продлевайте. :)
давно
Профессионал
304622
583
24.11.2010, 14:42
общий
В тексте говорится
uses list4; {см лаб.раб. №5}


Имеется "лаб.раб. №5"?
давно
Старший Модератор
31795
6196
24.11.2010, 15:19
общий
Адресаты:
Цитата: Сергей Бендер
Имеется "лаб.раб. №5"?


имеется
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Профессионал
304622
583
24.11.2010, 18:08
общий
Цитата: Зенченко Константин Николаевич
Имеется "лаб.раб. №5"?


имеется


Во-о-от оно как! Спасибо. Поглядим.
Неизвестный
28.11.2010, 14:28
общий
Адресаты:
Поглядели? Сделаете?
Неизвестный
28.11.2010, 15:55
общий
будет кто браться??
Неизвестный
28.11.2010, 18:04
общий
Даю возможность Сергею. Сам несколько занят - отчеты-с
Неизвестный
28.11.2010, 20:04
общий
Даю возможность Сергею. Сам несколько занят - отчеты-с


будем ждать
Неизвестный
28.11.2010, 20:05
общий
Если хотите я могу прикрепить примерный отчет с выполненным вариантом(не моим) но там есть решение моей задачи....реализация её, но дял другого стека и очереди соответственно
Неизвестный
28.11.2010, 20:54
общий
Мне не надо.
давно
Профессионал
304622
583
28.11.2010, 21:09
общий
Извините, несколько заплюхался кое с чем. Есть некоторые неоднозначности и ...

Короче, что-то нарисовал для стэка и очереди -- копилируются успешно. Но головная неготова, посему поверить корректность пока нельзя. Выкладываю, что получилось. Проверяй -- может напортачил чего.

Головную надеюсь завтра нарисовать.

Код:

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 EndPtr(var L:List);
Procedure MovePtr(var L:List);
{Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);}

Implementation
Procedure InitMem;
{устанавливает Flag каждoго элемента
в FALSE, вызывается в разделе операторов модуля}
var i:word;
begin
for i:=0 to SizeList do
MemList[i].Flag:=false;
end;

Function NewMem: word;
{возвращает номер свободного элемента}
var i:word;
begin
i:=0;
while (not MemList[i].Flag) and (i<=SizeList) do
inc(i);
NewMem:= i;
end;

Function EmptyMem: boolean;
{возвращает TRUE, если в
массиве нет свободных элементов}
begin
EmptyMem:= NewMem>SizeList;
end;

Procedure DisposeMem(n:word);
{делает n-й элемент мас-сива свободным}
begin
MemList[n].Flag:=false;
end;

Procedure InitList(var L:List);
begin
L.Start:=0;
L.Ptr:=0;
L.N:=0;
end;

Procedure PutList(var L:List; E:BaseType);
begin

end;

{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; { FullList }

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
L.ptr:=L.start
end; { BeginPtr }

Procedure MovePtr(var L:List);
begin
if MemList[L.ptr].next=0 then
ListError:=ListEnd
else
L.ptr:=MemList[L.ptr].next;
end; { MovePtr }

Procedure EndPtr(var L:List);
begin
repeat
MovePtr(L);
until ListError=ListEnd;
end;

{Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);}

end.


Код:

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;
{возвращает номер свободного элемента}
var i:PtrEl;
begin
i:=0;
while (not 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.ptr;
MemList[i].Data:=b;
s.ptr:=i;
end;
end;

procedure GetStack(var s : stack; var b : basetype);
var i:PtrEl;
begin
if s.ptr=0 then
ListError:=ListEnd
else begin
i:=s.ptr;
b:=MemList[s.ptr].Data;
MovePtr(s);
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);{разрушить стек}
var i,j:PtrEl;
begin
i:=s.start;
while i<>0 do
begin
{Dispose(MemList[i].Data);}
{Тут по идее надо удалять данные.
Но голый pointer удалять нельзя.
А чтобы знать размер данных, они должны быть
определены раньше этого модуля. Как-то нелогично.}
DisposeMem(i);
i:=MemList[i].next;
end;
s.ptr:=0;
s.start:=0;
end;

end.


Код:

Unit Fifo9;
Interface
Const
FifoOk = 0;
FifoOver = 1;
FifoUnder= 2;
var FifoError:0..2;
Type
BaseType = TInquiry;

TInquiry= record
Name: String[10]; {имя запроса}
Р: Byte; {приоритет}
Time1: Word; {время выполнения
задачи процессором P1}
Time2: Word; {время выполнения
задачи процессором P2}
end;
Const
FifoSize = 65520 div sizeof(BaseType);
Type
Index = 0..FifoSize;
TBuf = array[Index] of BaseType;
Fifo = record
PBuf: ^TBuf;
SizeBuf: word; {количество элементов в массиве}
Uk1 : Index; {указывает на "голову" очереди}
Uk2 : Index; {указывает на "хвост" очереди}
end;
procedure InitFifo(var f : fifo; size: word);
{инициализация очереди}
procedure PutFifo(var f : fifo; b : basetype);
{поместить элемент в очередь}
procedure GetFifo(var f : fifo; var b : basetype);
{извлечь элемент из очереди}
function EmptyFifo(f : fifo):boolean; {очередь пуста}
procedure DoneFifo(var f: fifo);{разрушить очередь}

implementation

procedure InitFifo(var f : fifo; size: word);
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+1
then FifoError:=FifoOver
else begin
inc(f.SizeBuf);
incFifo(f.Uk1);
f.PBuf^[f.Uk1]:=b;
end;
end;

procedure GetFifo(var f : fifo; var b : basetype);
begin
if f.SizeBuf<=0
then FifoError:=FifoUnder
else begin
b:=f.PBuf^[f.Uk2];
dec(f.SizeBuf);
incFifo(f.Uk2);
end;
end;

function EmptyFifo(f : fifo):boolean; {очередь пуста}
begin
EmptyFifo:= f.SizeBuf = 0;
end;

procedure DoneFifo(var f: fifo);{разрушить очередь}
begin
dispose(f.PBuf);
f.SizeBuf:=0;
f.Uk1:=0;
f.Uk2:=0;
end;

end.
давно
Профессионал
304622
583
28.11.2010, 21:10
общий
Если хотите я могу прикрепить примерный отчет с выполненным вариантом(не моим) но там есть решение моей задачи....реализация её, но дял другого стека и очереди соответственно


Давай, давай. Я такое всегда смотрю.
Неизвестный
29.11.2010, 17:23
общий
смотрите в прикреплении
Прикрепленные файлы:
dc81f1f7a7d0f8ebfa0e4882b68b07a9.rar
давно
Профессионал
304622
583
29.11.2010, 19:10
общий
Цитата: 324791
смотрите в прикреплении


Завтра посмотрю.

А ты выложенные мной тексты посмотрел? Я уже в них пару ошибок нашёл.

Вот текст головной программы. Сырой, только что написал. И почти без комментариев (пока). Ищи ошибки.


Код:

uses stack8,Fifo9,list4;

const Phigh=0.3; {veroyatnost postupleniya zadach s vysokim prioritetom}
Tinqmax=10; {maksimalnoe vremy vypolneniya protsessorom}
dTg=8; {srednee vremia intervala mezhdu zadachami v generatore}



type TProc = record
inq:TInquiry; {ispoliaemaya zadacha}
pinq:^TInquiry; {dlia otpravki v steka}
S:stack;
Tstart:Word;
end;

var F1,F2,F3,F4:Fifo;
P1,P2:TProc;
T,Tg:Word;
ri:word;
r:real;
G:TInquiry;


function RandName:string;
var i:integer;
s:string[10];
begin
for i:=1 to 10 do
s[i]:=chr(ord('a') + random(26));
RandName:=s;
end;

begin
InitFifo(F1,0);
InitFifo(F2,0);
InitFifo(F3,0);
InitFifo(F4,0);
InitStack(P1.S);
P1.Tstart:=65535;
P1.inq.Name:='';
InitStack(P2.S);
P2.Tstart:=65535;
P2.inq.Name:='';

Tg:=1000; {vremia raboty generatora }
T:=0;
randomize;
repeat
{rabota generatora}
r:=random;
if r< 1/dTg
then begin
G.Name:=RandName;
G.Time1:=random(Tinqmax)+1;
G.Time2:=random(Tinqmax)+1;
if random < Phigh
then begin
G.P:=0;
PutFifo(F1,G);
end
else begin
G.P:=1;
PutFifo(F2,G);
end
end;

{protsessor P1}
with P1 do
begin
if (inq.Name<>'') and (T>Tstart + inq.Time1)
then begin
if inq.P=0 then PutFifo(F3,inq)
else PutFifo(F4,inq);
inq.Name:='';
end;

if not EmptyFifo(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;
GetFifo(F1,inq);
Tstart:=T;
end;

if inq.Name<>''
then begin
if not EmptyFifo(F2)
then begin
GetFifo(F2,inq);
Tstart:=T;
end
else if not EmptyStack(S)
then begin
GetStack(S,pinq);
inq:=pinq^;
dispose(pinq);
Tstart:=T;
end;
end;

{protsessor P2}
with P2 do
begin
if (inq.Name<>'') and (T>Tstart + inq.Time2)
then begin
{if inq.P=0 then PutFifo(F3,inq)
else PutFifo(F4,inq);
OUT}
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;
GetFifo(F3,inq);
Tstart:=T;
end;

if inq.Name<>''
then begin
if not EmptyFifo(F4)
then begin
GetFifo(F4,inq);
Tstart:=T;
end
else if not EmptyStack(S)
then begin
GetStack(S,pinq);
inq:=pinq^;
dispose(pinq);
Tstart:=T;
end;
end;
end;
until EmptyFifo(F1) and EmptyFifo(F2) and EmptyFifo(F3)
and EmptyFifo(F4) and EmptyStack(P1.S) and EmptyStack(P2.S);
end.


Завтра/послезватра доведу до ума.
Неизвестный
29.11.2010, 22:46
общий
Сейчас немножко занят но завтра обязательно отпишусь о тестировании мной...
Неизвестный
01.12.2010, 01:43
общий
Код протестировал....кое-где чnо добавил.....некоторые ошибки исправил, но они не существенные в основном, а вызванные при компиляции....
Выкладываю то что в результате наредактировал:

Основаная программа main:
Код:
uses stack8,Fifo9,list4;

const Phigh=0.3; {veroyatnost postupleniya zadach s vysokim prioritetom}
Tinqmax=10; {maksimalnoe vremy vypolneniya protsessorom}
dTg=8; {srednee vremia intervala mezhdu zadachami v generatore}



type TProc = record
inq:TInquiry; {ispoliaemaya zadacha}
pinq:^TInquiry; {dlia otpravki v steka}
S:stack;
Tstart:Word;
end;

var F1,F2,F3,F4:Fifo;
P1,P2:TProc;
T,Tg:Word;
ri:word;
r:real;
G:TInquiry;


function RandName:string;
var i:integer;
s:string[10];
begin
for i:=1 to 10 do
s[i]:=chr(ord('a') + random(26));
RandName:=s;
end;

begin
InitFifo(F1,0);
InitFifo(F2,0);
InitFifo(F3,0);
InitFifo(F4,0);
InitStack(P1.S);
P1.Tstart:=65535;
P1.inq.Name:='';
InitStack(P2.S);
P2.Tstart:=65535;
P2.inq.Name:='';

Tg:=1000; {vremia raboty generatora }
T:=0;
randomize;
repeat
{rabota generatora}
r:=random;
if r< 1/dTg
then begin
G.Name:=RandName;
G.Time1:=random(Tinqmax)+1;
G.Time2:=random(Tinqmax)+1;
if random < Phigh
then begin
G.P:=0;
PutFifo(F1,G);
end
else begin
G.P:=1;
PutFifo(F2,G);
end
end;

{protsessor P1}
with P1 do
begin
if (inq.Name<>'') and (T>Tstart + inq.Time1)
then begin
if inq.P=0 then PutFifo(F3,inq)
else PutFifo(F4,inq);
inq.Name:='';
end;

if not EmptyFifo(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;
GetFifo(F1,inq);
Tstart:=T;
end;

if inq.Name<>''
then begin
if not EmptyFifo(F2)
then begin
GetFifo(F2,inq);
Tstart:=T;
end
else if not EmptyStack(S)
then begin
GetStack(S,pinq);
inq:=pinq^;
dispose(pinq);
Tstart:=T;
end;
end;

{protsessor P2}
with P2 do
begin
if (inq.Name<>'') and (T>Tstart + inq.Time2)
then begin
{if inq.P=0 then PutFifo(F3,inq)
else PutFifo(F4,inq);
OUT}
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;
GetFifo(F3,inq);
Tstart:=T;
end;

if inq.Name<>''
then begin
if not EmptyFifo(F4)
then begin
GetFifo(F4,inq);
Tstart:=T;
end
else if not EmptyStack(S)
then begin
GetStack(S,pinq);
inq:=pinq^;
dispose(pinq);
Tstart:=T;
end;
end;
end;
end;
until (EmptyFifo(F1) and EmptyFifo(F2) and EmptyFifo(F3) and EmptyFifo(F4) and EmptyStack(P1.S) and EmptyStack(P2.S));
end.


Модуль LIST4 оставил без изменения.....есть еще свой вариант, сделанный вчера....так сказать модернезированный модуль....хотите выложу....

Код:
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 EndPtr(var L:List);
Procedure MovePtr(var L:List);
{Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);}

Implementation
Procedure InitMem;
{устанавливает Flag каждoго элемента
в FALSE, вызывается в разделе операторов модуля}
var i:word;
begin
for i:=0 to SizeList do
MemList[i].Flag:=false;
end;

Function NewMem: word;
{возвращает номер свободного элемента}
var i:word;
begin
i:=0;
while (not MemList[i].Flag) and (i<=SizeList) do
inc(i);
NewMem:= i;
end;

Function EmptyMem: boolean;
{возвращает TRUE, если в
массиве нет свободных элементов}
begin
EmptyMem:= NewMem>SizeList;
end;

Procedure DisposeMem(n:word);
{делает n-й элемент мас-сива свободным}
begin
MemList[n].Flag:=false;
end;

Procedure InitList(var L:List);
begin
L.Start:=0;
L.Ptr:=0;
L.N:=0;
end;

Procedure PutList(var L:List; E:BaseType);
begin

end;

{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; { FullList }

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
L.ptr:=L.start
end; { BeginPtr }

Procedure MovePtr(var L:List);
begin
if MemList[L.ptr].next=0 then
ListError:=ListEnd
else
L.ptr:=MemList[L.ptr].next;
end; { MovePtr }

Procedure EndPtr(var L:List);
begin
repeat
MovePtr(L);
until ListError=ListEnd;
end;

{Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);}

end.



Вот тег кода stack8:
Код:
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;
{возвращает номер свободного элемента}
var i:PtrEl;
begin
i:=0;
while (not 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.ptr;
MemList[i].Data:=b;
s.ptr:=i;
end;
end;

procedure GetStack(var s : stack; var b : basetype);
var i:PtrEl;
begin
if s.ptr=0 then
ListError:=ListEnd
else begin
i:=s.ptr;
b:=MemList[s.ptr].Data;
MovePtr(s);
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);{разрушить стек}
var i,j:PtrEl;
begin
i:=s.start;
while i<>0 do
begin
{Dispose(MemList[i].Data);}
{Тут по идее надо удалять данные.
Но голый pointer удалять нельзя.
А чтобы знать размер данных, они должны быть
определены раньше этого модуля. Как-то нелогично.}
DisposeMem(i);
i:=MemList[i].next;
end;
s.ptr:=0;
s.start:=0;
end;

end.


Вот Fifo9:

Код:
Unit Fifo9;
Interface
uses stack8,list4;
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;
TBuf = array[Index] of BaseType;
Fifo = record
PBuf: ^TBuf;
SizeBuf: word; {количество элементов в массиве}
Uk1 : Index; {указывает на "голову" очереди}
Uk2 : Index; {указывает на "хвост" очереди}
end;
procedure InitFifo(var f : fifo; size: word);
{инициализация очереди}
procedure PutFifo(var f : fifo; b : basetype);
{поместить элемент в очередь}
procedure GetFifo(var f : fifo; var b : basetype);
{извлечь элемент из очереди}
function EmptyFifo(f : fifo):boolean; {очередь пуста}
procedure DoneFifo(var f: fifo);{разрушить очередь}

implementation

procedure InitFifo(var f : fifo; size: word);
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+1
then FifoError:=FifoOver
else begin
inc(f.SizeBuf);
incFifo(f.Uk1);
f.PBuf^[f.Uk1]:=b;
end;
end;

procedure GetFifo(var f : fifo; var b : basetype);
begin
if f.SizeBuf<=0
then FifoError:=FifoUnder
else begin
b:=f.PBuf^[f.Uk2];
dec(f.SizeBuf);
incFifo(f.Uk2);
end;
end;

function EmptyFifo(f : fifo):boolean; {очередь пуста}
begin
EmptyFifo:= f.SizeBuf = 0;
end;

procedure DoneFifo(var f: fifo);{разрушить очередь}
begin
dispose(f.PBuf);
f.SizeBuf:=0;
f.Uk1:=0;
f.Uk2:=0;
end;

end.


Существенно мало что изменилось....но ошибок на FPC при компиляции нет....
Сергей Бендер жду пока доведете до ума.....прикрепляю файлы использованые при компиляции и старый модуль list4 но уже несколько свой.....
Прикрепленные файлы:
7e3a481570bd23425afb96122aebc2ff.rar
Неизвестный
01.12.2010, 01:45
общий
В основном при компиляции были проблемы с непониманием модулей друг друга.....тип то описан в одном модуле а в другом используется без uses....вот такие моменты правил...
Неизвестный
01.12.2010, 15:18
общий
Адресаты:
Сергей! Не пора в ответ что-то писать?
Неизвестный
02.12.2010, 17:50
общий
Оч жду))
давно
Профессионал
304622
583
03.12.2010, 17:00
общий
Оч жду))


Забыл на работе флэшку с файлами!!! Извини, завтра.
давно
Профессионал
304622
583
04.12.2010, 15:13
общий
Оч жду))


Работает. Вечером напишу комментарии и выложу ответ.
давно
Профессионал
304622
583
05.12.2010, 20:00
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич!

Итак, готово.

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 }

{Procedure EndPtr(var L:List);
Procedure MoveTo(var L:List; N:word);
Procedure DoneList(var L:List);
Procedure CopyList(var L1,L2:List);}

end.


STACK8.PAS
Код:

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;
begin
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);
{инициализация очереди}
procedure PutFifo(var f : fifo; b : basetype);
{поместить элемент в очередь}
procedure GetFifo(var f : fifo; var 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 GetFifo(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;

procedure DoneFifo(var f: fifo);{разрушить очередь}
begin
dispose(f.PBuf);
f.SizeBuf:=0;
f.Uk1:=0;
f.Uk2:=0;
end;

end.


MODEL.PAS
Код:

uses stack8,Fifo9,list4;

const Phigh=0.3; {вероятность получения задач с высоким приоритетом}
Tinqmax=10; {максимальное время обработки задачи процессором}
dTg=3; {среднее время выдачи задач генератором}
Tg=100; {время работы генератора}

type TProc = record
inq:TInquiry; {исполняемая задача}
pinq:^TInquiry; {указатель для отправки/полчения
задач из стека}
S:stack;
Tstart:Word; {время полчения текущей задачи}
end;

var F1,F2,F3,F4:Fifo; {очереди}
P1,P2:TProc; {процессоры}
T:Word; {текущее время}
r:real;
G:TInquiry; {задача формируемая генератором}


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);

writeln('-----------------');
write('F1 ');
PrintFifo(F1);

write('F2 ');
PrintFifo(F2);

write('P1.S ');
PrintStack(P1.S);

write('P1 ');
{Вывод оставшегося времени выполнения задачи}
if P1.inq.Name<>'' then write('(',P1.inq.Name,',',(P1.Tstart + P1.inq.Time1) - T,') ');
writeln;

writeln('-----------------');
write('F3 ');
PrintFifo(F3);

write('F4 ');
PrintFifo(F4);

write('P2.S ');
PrintStack(P2.S);

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.Name='') and (P2.inq.Name='');
end.
Форма ответа