PRÁCTICA INVENTADA
TOP MANTA
Matías Blanco – Sergio Pérez
Enunciado
Un grupo de N individuos de Bolaños, tras ver muchos dibujos de Sin Chan en la televisión, han
decidido imitar el comportamiento de sus héroes los asiáticos. Habiendo visto tan poco mundo, han
tenido que decidir entre montar un restaurante o ponerse a copiar CDs para el topmanta.
Como uno
de ellos era informático, optaron por lo segundo. Así, se organizaron del siguiente modo:
● N de ellos copiarían CDs, para lo cual, cada cierto tiempo, tendrían que reponer los CDs
vírgenes que usan para tal tarea.
● Ellos mismos irían al polígono industrial y buscarán en algún almacén por si hay CD's
suficientes. Si los hay, los cogen.
● Si no quedan suficientes, llamarán al relaciones públicas, antes llamado Pepe, ahora
conocido como Pe Ping. Éste se encargará de llenar los almacenes.
● Sólo cuando Pe Ping haya repuesto, los demás podrán coger CDs de ese almacén.
Enunciado (2)
Este negocio era demasiado fácil para ser verdad, hasta que un día apareció el primo de Pe Ping,
llamado Hoo Lee Ann, para complicarlo todo. Avisó a la policía, diciéndoles que en el polígono se
encontraban almacenes donde había CDs que se usaban para piratería. La policía empezó entonces
a hacer rondas, de almacén en almacén. Cuando iban a investigar uno de ellos (que no lo hacían
siempre porque eran vagos), a veces (que no siempre) Pe Ping recibía un chivatazo de su amigo el
corrupto. Cuando lo recibía, movía los CDs de un almacén al siguiente. Si la policía iba sin aviso y
no encontraba CDs no pasaba nada, había sido una falsa sospecha. Por el contrario, si encontraba
CDs mandaban a Pe Ping a la carcel, pero Pe Ping, que era un poquito... inculpaba a
algunos de sus piratillas, que serían los que fueran a la cárcel por él. Cuando salieran de la cárcel,
continuarían trabajando.
Citas ADA

Tareas:
 Almacen
 Piratilla
 Pe
Ping
 Policia
 Citacion
Citas ADA - Almacen


Representa un almacén con N_CDs_ALMA CDs.
Tanto un piratilla, como la policía, como Pe Ping
tienen acceso al mismo.
 Piratilla
– lectura
 PePing – lectura/escritura
 Policia – lectura/escritura
Citas ADA – Almacén (2)







Init – Inicializa almacén
Pilla_CDs – Devuelve los CDs que se piden y OK si hay suficientes, si no, not OK.
Llenar – Llena el almacén.
Vaciar – Saca los CD's que queden y nos devuelve cuántos son.
Meter – Introduce un número determinado de CDs. Llenar podría utilizar esta
entrada pero se han separado por significar cosas diferentes.
PoliInvestiga – Devulve el número de CDs que hay dentro de ese almacén.
PoliRequisa – La policía vacía el almacén.
Citas ADA – Almacén (3)
task type Almacen is
entry Init(Idd: in Integer);
entry Pilla_CDs(Idd: in Integer; N_CDs: in Integer; OK: in out
Boolean);
entry Llenar;
entry Vaciar(N_CDs: in out Integer);
entry Meter(N_CDs: in Integer);
entry PoliInvestiga(N_CDs: in out Integer);
entry PoliRequisa;
end Almacen;
Almacenes: array (1..MAX_ALMACENES) of Almacen;
Citas ADA – Almacén (4)
task body almacen is
Id: Integer;
N_CDS_ALMA: Integer;
begin
accept Init (Idd: in Integer) do
Id:= Idd;
end Init;
N_CDS_ALMA:= MAX_CDs_ALMACEN; -- Lleno en un principio
loop
select
accept Pilla_CDs (Idd: in Integer; N_CDs: in Integer; OK: in out Boolean) do
if (N_CDs <= N_CDs_ALMA) then
Put("El piratilla " & Integer'Image(Idd) & " coge " & Integer'Image(N_CDs) & " CDs del almacen " & Integer'Image(Id) );New_Line;
N_CDs_ALMA:= N_CDs_ALMA - N_CDs;
OK:=True;
else
OK:= False;
end if;
end Pilla_CDs;
Citas ADA – Almacén (5)
…or…
accept Llenar do
if (N_CDs_ALMA >= MAX_CDs_ALMACEN) then
Put("El almacen " & Integer'Image(Id) & "ya no hace falta llenarlo.");New_Line;
else
Put("PePing empieza a llenar el almacen " & Integer'Image(Id));New_Line;
N_CDs_ALMA:= MAX_CDs_ALMACEN;
delay 1.0;
Put("PePing termina de llenar el almacen " & Integer'Image(Id));New_Line;
end if;
end Llenar;
or
accept Vaciar(N_CDs: in out Integer) do
Put("PePing vacia el almacen " & Integer'Image(Id));New_Line;
N_CDs:= N_CDs_ALMA;
N_CDs_ALMA:=0;
end Vaciar;
Citas ADA – Almacén (6)
..or… accept Meter(N_CDS: in Integer) do
Put("PePing mete " & Integer'Image(N_CDS) & " CDs de la mudanza en el almacen " & Integer'Image(Id));New_Line;
N_CDs_ALMA:= N_CDs_ALMA + N_CDs;
end Meter;
or
accept PoliInvestiga(N_CDs: in out Integer) do
N_CDs:= N_CDs_ALMA;
end PoliInvestiga;
or
accept PoliRequisa do
N_CDs_ALMA:=0;
end PoliRequisa;
end select;
end loop;
end Almacen;
Citas ADA – Pe Ping
task body PePing is
AlmacenesRepo: TAlmacenesReposicion;
AuxSacar: Integer:= 0;
begin
for I in 1..MAX_ALMACENES loop
AlmacenesRepo(I):= False; -- No hay ninguno en reposicion
end loop;
loop
select
accept Reponer(Id: in Integer; N:in Integer) do
if (not AlmacenesRepo(N)) then
Put("PePing recibe la llamada del piratilla " & Integer'Image(Id) & " avisando para el en almacen " & Integer'Image(N));New_Line;
AlmacenesRepo(N):=True;
Almacenes(N).Llenar; AlmacenesRepo(N):=False;
else
Put("PePing recibe la llamada del piratilla " & Integer'Image(Id) & " avisando para el en almacen " & Integer'Image(N) & ": ya
avisado!");New_Line;
end if;
end Reponer;
Citas ADA – Pe Ping (2)
or
accept Soplo(NumAlmacen: in Integer) do
Put("La poli filtra a PePing que se va a investigar el almacen " & Integer'Image(NumAlmacen));New_Line;
Almacenes(NumAlmacen).Vaciar(AuxSacar);
delay (1.0); -- tarda un poco en mudar
if (NumAlmacen < MAX_ALMACENES) then
Almacenes(NumAlmacen+1).Meter(AuxSacar);
else
Almacenes(1).Meter(AuxSacar);
end if;
end Soplo;
Citas ADA – Pe Ping (3)
or
accept Carcel do
Put("PePing a la carcel, pero... para librarse...");New_Line;
for I in 1..MAX_PIRATAS loop
if (Random(G) < 0.3) then
Put("... inculpa y manda al piratilla " & Integer'Image(I) & " a la carcel x(");New_Line;
Citacion.MandarCitacion(I);
end if;
end loop;
end Carcel;
end select;
end loop;
end Peping;
Citas ADA – Piratilla
task body Piratilla is
Id: Integer;
N_CDs: Integer;
OK: Boolean;
CarcelFlag: Boolean;
AlmacenActual: Integer:=0;
begin
accept Init(Idd: in Integer) do
Id:= Idd;
N_CDs:= Integer(Float(MAX_CDS_PIDEN-MIN_CDS_PIDEN)*Random(G))+MIN_CDS_PIDEN;
CarcelFlag:=False;
end Init;
Citas ADA – Piratilla (2)
loop
-- Graba
Put("El piratilla " & Integer'Image(Id) & " están grabando");New_Line;
delay Duration(0.1*Float(N_CDs)*Random(G));
-- Mira si le han pillado----Citacion.VerTablon(Id, CarcelFlag);
if (CarcelFlag) then
Put("El pirata " & Integer'Image(Id) & " se va a la carcel");New_Line;
delay 20.0;
Put("El pirata " & Integer'Image(Id) & " sale de la carcel");New_Line;
end if;
Citas ADA – Piratilla (3)
AlmacenActual:=NumeroAleatorio.Random(F);
OK:=False;
Put("El piratilla " & Integer'Image(Id) & " necesita CDs y va al almacen " & Integer'Image(AlmacenActual) & " a ver si puede pillarlos");New_Line;
while (not OK) loop
Citacion.VerTablon(Id, CarcelFlag);
if (CarcelFlag) then
Put("El piratilla " & Integer'Image(Id) & " se libra de la carcel porque no tiene CDs!");New_Line;
end if;
Almacenes(AlmacenActual).Pilla_CDs(Id, N_CDs, OK);
if (not OK) then
Put("El piratilla " & Integer'Image(Id) & " avisa a PePing de que no hay CDs suficientes para el en el almacen " &
Integer'Image(AlmacenActual));New_Line;
PePing.Reponer(Id, AlmacenActual);
Put("*");
end if;
end loop;
Put("El piratilla " & Integer'Image(Id) & " consigue los CDs (");Put(N_CDs,0);Put(")");New_Line;
end loop;
end Piratilla;
Citas ADA – Policia
task body Policia is
AlmacenInvestigado: Integer;
CDsEncautados: Integer;
begin
Reset(G);
AlmacenInvestigado:= 1; -- Empiezan por el primero.
loop
delay Duration(Random(G) * 3.0 + 3.0); -- Un cafetillo…
CDsEncautados := 0;
Citas ADA – Policia (2)
if (Random(G) < 0.8) then
if (Random(G) < 0.5) then
PePing.Soplo(AlmacenInvestigado);
delay 1.0;
end if;
Almacenes(AlmacenInvestigado).PoliInvestiga(CDsEncautados);
if (CDsEncautados > 0) then
PePing.Carcel;
-- Aqui pueden seguir sacando mientras no requisen
Almacenes(AlmacenInvestigado).PoliRequisa;
Put("Se requisan " & Integer'Image(CdsEncautados) & " CDs del almacen " & Integer'Image(AlmacenInvestigado));New_Line;
end if;
end if;
Citas ADA – Policia (3)
AlmacenInvestigado:= AlmacenInvestigado + 1;
if (AlmacenInvestigado = MAX_ALMACENES + 1) then
AlmacenInvestigado:= 1;
end if;
end loop;
end Policia;
Citas ADA – Citacion
task body Citacion is
Denuncias: TPiratasCitados;
begin
for I in 1..MAX_PIRATAS loop
Denuncias(I):= False;
end loop;
loop
select
accept MandarCitacion(Id: in Integer) do
Denuncias(Id):= True;
end MandarCitacion;
or
accept VerTablon(Id: in Integer; Denuncia: in out Boolean) do
Denuncia:=Denuncias(Id); Denuncias(Id):=False;
end VerTablon;
end select;
end loop;
end Citacion;
Citas ADA – variables y tipos…
procedure TopMantaCitasAda is
G: Generator;
-- Constantes
MAX_PIRATAS: constant Integer:= 10; -- tipos que copian CDs
MAX_CDs_ALMACEN: constant Integer:= 2000; -- CDs que caben en un almacen
MAX_CDs_PIDEN: constant Integer:= 200; -- Numero de CDs que piden como mucho
MIN_CDs_PIDEN: constant Integer:= 100; -- Minimo de CDs que pueden pedir
MAX_ALMACENES: constant Integer:= 4; -- Almacenes por los que se puede mover la mercancia
-- Aleatorio discreto
subtype valores is Integer range 1..MAX_ALMACENES;
package NumeroAleatorio is new Ada.Numerics.Discrete_Random(valores);
F: NumeroAleatorio.Generator;
-- Tipos y Variables
type TAlmacenesReposicion is array (1..MAX_ALMACENES) of Boolean;
type TPiratasCitados is array (1..MAX_PIRATAS) of Boolean;
Citas ADA – procesos…
Begin
Reset(G);
for I in 1..MAX_ALMACENES loop
Almacenes(I).Init(I);
end loop;
for I in 1..MAX_PIRATAS loop
Piratillas(I).Init(I);
end loop;
end TopMantaCitasAda;
Tipos Protegidos



Las tareas se mantienen
Almacen se convierte en un tipo protegido.
Como no se realiza ninguna comprobación, no hacen
falta entradas, son todo procedimientos.
Tipos Protegidos - Almacen
protected type Almacen is
procedure Init (Idd: in Integer);
procedure Pilla_CDs (Idd: in Integer; N_CDs: in Integer; OK: in out Boolean);
procedure Llenar; -- Para reponer
procedure Vaciar (N_CDs: in out Integer);
procedure Meter (N_CDs: in Integer);
procedure PoliInvestiga (N_CDs: in out Integer); -- La poli quiere investigar
procedure PoliRequisa;
private
Id: Integer;
N_CDs_ALMA: Integer := MAX_CDS_ALMACEN;
end Almacen;
Ejecución
$ ./TopMantaCitasAda
El piratilla 1 están grabando
El piratilla 2 están grabando
El piratilla 3 están grabando
El piratilla 4 están grabando
El piratilla 5 están grabando
El piratilla 6 están grabando
El piratilla 7 están grabando
El piratilla 8 están grabando
El piratilla 9 están grabando
El piratilla 10 están grabando
El piratilla 3 necesita CDs y va al almacen 4 a ver si puede pillarlos
El piratilla 3 coge 121 CDs del almacen 4
El piratilla 3 consigue los CDs (121)
El piratilla 3 están grabando
El piratilla 3 necesita CDs y va al almacen 1 a ver si puede pillarlos
El piratilla 3 coge 121 CDs del almacen 1
El piratilla 3 consigue los CDs (121)
El piratilla 3 están grabando
El piratilla 8 necesita CDs y va al almacen 1 a ver si puede pillarlos
El piratilla 8 coge 171 CDs del almacen 1
El piratilla 8 consigue los CDs (171)
Ejecución (2)
El piratilla 8 están grabando
El piratilla 2 necesita CDs y va al almacen 4 a ver si puede pillarlos
El piratilla 2 coge 119 CDs del almacen 4
El piratilla 2 consigue los CDs (119)
El piratilla 2 están grabando
El piratilla 9 necesita CDs y va al almacen 3 a ver si puede pillarlos
El piratilla 9 coge 125 CDs del almacen 3
El piratilla 9 consigue los CDs (125)
El piratilla 9 están grabando
El piratilla 9 necesita CDs y va al almacen 1 a ver si puede pillarlos
El piratilla 9 coge 125 CDs del almacen 1
El piratilla 9 consigue los CDs (125)
El piratilla 9 están grabando
El piratilla 9 necesita CDs y va al almacen 1 a ver si puede pillarlos
El piratilla 9 coge 125 CDs del almacen 1
El piratilla 9 consigue los CDs (125)
El piratilla 9 están grabando
El piratilla 6 necesita CDs y va al almacen 1 a ver si puede pillarlos
El piratilla 6 coge 141 CDs del almacen 1
El piratilla 6 consigue los CDs (141)
El piratilla 6 están grabando
El piratilla 1 necesita CDs y va al almacen 4 a ver si puede pillarlos
Ejecución (3)
El piratilla 1 coge 162 CDs del almacen 4
El piratilla 1 consigue los CDs (162)
El piratilla 1 están grabando
El piratilla 2 necesita CDs y va al almacen 1 a ver si puede pillarlos
El piratilla 2 coge 119 CDs del almacen 1
El piratilla 2 consigue los CDs (119)
El piratilla 2 están grabando
El piratilla 5 necesita CDs y va al almacen 1 a ver si puede pillarlos
El piratilla 5 coge 119 CDs del almacen 1
El piratilla 5 consigue los CDs (119)
El piratilla 5 están grabando
PePing a la carcel, pero... para librarse...
... inculpa y manda al piratilla 5 a la carcel x(
... inculpa y manda al piratilla 6 a la carcel x(
Se requisan 2000 CDs del almacen 2
El pirata 6 se va a la carcel
El piratilla 9 necesita CDs y va al almacen 1 a ver si puede pillarlos
El piratilla 9 coge 125 CDs del almacen 1
El piratilla 9 consigue los CDs (125)
El piratilla 9 están grabando
El piratilla 3 necesita CDs y va al almacen 4 a ver si puede pillarlos
Ejecución (4)
El piratilla 3 coge 121 CDs del almacen 4
El piratilla 3 consigue los CDs (121)
Se requisan 1149 CDs del almacen 4
El piratilla 9 necesita CDs y va al almacen 3 a ver si puede pillarlos
El piratilla 9 avisa a PePing de que no hay CDs suficientes para el en el almacen 3
PePing recibe la llamada del piratilla 9 avisando de que no hay CDs sufientes para el en almacen 3
PePing empieza a llenar el almacen 3
El piratilla 3 necesita CDs y va al almacen 4 a ver si puede pillarlos
El piratilla 3 avisa a PePing de que no hay CDs suficientes para el en el almacen 4
PePing termina de llenar el almacen 3
PePing recibe la llamada del piratilla 3 avisando de que no hay CDs sufientes para el en almacen 4
*PePing empieza a llenar el almacen 4
El piratilla 9 coge 125 CDs del almacen 3
El piratilla 9 consigue los CDs (125)
El piratilla 9 están grabando
El piratilla 9 necesita CDs y va al almacen 2 a ver si puede pillarlos
El piratilla 9 avisa a PePing de que no hay CDs suficientes para el en el almacen 2
...
...
Fin
¿…?
Descargar

Práctica Inventada