29
PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

Embed Size (px)

Citation preview

Page 1: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

PRÁCTICA INVENTADATOP MANTAMatías Blanco – Sergio Pérez

Page 2: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

EnunciadoUn 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.

Page 3: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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.

Page 4: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

Citas ADA Tareas:

Almacen Piratilla Pe Ping Policia Citacion

Page 5: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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

Page 6: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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.

Page 7: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 8: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 9: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 10: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 11: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

Citas ADA – Pe Pingtask 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;

Page 12: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 13: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 14: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

Citas ADA – Piratillatask 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;

Page 15: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 16: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 17: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

Citas ADA – Policiatask 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;

Page 18: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 19: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

Citas ADA – Policia (3) AlmacenInvestigado:= AlmacenInvestigado + 1;

if (AlmacenInvestigado = MAX_ALMACENES + 1) then

AlmacenInvestigado:= 1;

end if;

end loop;

end Policia;

Page 20: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 21: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 22: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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;

Page 23: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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.

Page 24: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

Tipos Protegidos - Almacenprotected 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;

Page 25: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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)

Page 26: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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

Page 27: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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

Page 28: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

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

...

...

Page 29: PRÁCTICA INVENTADA TOP MANTA Matías Blanco – Sergio Pérez

Fin

¿…?