http://www.fing.edu.uy/inco/cursos/sistoper/examenes/2014/Sol2014MAR.pdf
Esta solucion estaria bien? En negrita esta lo que se modifica respecto a la solucion planteada
Task Portero Is
ENTRY llega_embarazada(out id: integer);
ENTRY llega_adulto_mayor(out id: integer);
ENTRY llega_adulto(out id: integer);
ENTRY salir(id: integer);
//NO ESTA ACA ATENDER CLIENTE
ENTRY indicar_ejecutivo[1..20](out ejecutivo: integer);
ENTRY termine_ejec(nro_ejec: integer)
End Task;
Task Body Portero Is
VAR libres, orden, ejec_libres: cola of Integer; //son los ejutivos libres
i,n:Iinteger;
Begin
for i = 1 to 5
Ejecutivos[i].dame_id(i);
endfor
for i = 1 to 20
libres.encolar(i); //numero que le dan a los clientes
endfor;
i = 1;//primer numero que se le da al clinte
loop
SELECT
when cant < 20 AND llega_embarazada'count = 0 AND llega_adulto_mayor'count = 0 =>
ACCEPT llega_adulto(out id: integer)
id=i;
End;
i = libres.desencolar();
orden.encolar(i);
cant = cant + 1;
OR when cant < 20 AND llega_embarazada'count = 0 =>
ACCEPT llega_adulto_mayor(out id: integer)
id=i;
End;
i = libres.desencolar();
orden.encolar(i);
cant = cant + 1;
OR when cant < 20 =>
ACCEPT llega_embarazada(out id: integer)
id=i;
End;
i = libres.desencolar();
orden.encolar(i);
cant = cant + 1;
OR ACCEPT salir(id: integer)
i=id;
End;
libres.encolar(i);
cant = cant - 1;
OR when ejec_libres.NotEmpty() && orden.NotEmpty() => ACCEPT indicar_ejecutivo[orden.dequeue()](ejecutivo) // tal vez el orden.deque() se hagas mas veces de las que quiero si la guarda se cumple y luego primero el select toma un "salir" o la entrada de otro cliente?????
ejecutivo = ejec_libres.dequeue();
End;
OR ACCEPT termine_ejec(nro_ejec: integer)
n=nro_ej;
End;
ejec_libres.enqueue(n);
ENDSELECT;
endloop
End Task;
Task Type Cliente Is
End Task;
Task Body Cliente Is
VAR id, ejecutivo: integer;
planilla: Planilla;
plan: Plan;
Begin
if tipo_cliente() = Embarazada
Portero.llega_embarazada(id);
else if tipo_cliente() = AdultoMayor
Portero.llega_adulto_mayor(id);
else
Portero.llega_adulto(id);
endif;
endif;
planilla = rellenar_planilla();
Portero.indicar_ejecutivo[id](ejecutivo);
Ejecutivos[ejecutivo].elaborar_plan(planilla, plan);
Portero.salir(id);
End Task;
Task Type Ejecutivo Is
ENTRY dame_id(id: integer);
ENTRY elaborar_plan(planilla: Planilla, out plan: Plan);
End Task;
Task Body Ejecutivo Is
VAR mi_id: Integer;
// no esta atender
Begin
ACCEPT dame_id(id: integer)
mi_id = id;
END;
Loop
SELECT
ACCEPT elaborar_plan(planilla: Planilla, out plan: Plan)
plan = elaborar_plan(planilla);
END;
Portero.termine_ejec(mi_id)
ELSE
ordenar_carpetas();
ENDSELECT;
EndLoop
EndTask;
VAR Ejecutivos: array (1..5) of Ejecutivo;