Matías Blanco – Sergio Pérez. The Problem A few peregrins, each one with his own strenght and...

Post on 23-Jan-2016

216 views 0 download

Transcript of Matías Blanco – Sergio Pérez. The Problem A few peregrins, each one with his own strenght and...

CAMINO DE SANTIAGOSAINT JAMES’ WAY

Matías Blanco – Sergio Pérez

The ProblemA few peregrins, each one with his own strenght and money want to make the Saint James’ Way. They can start their journey from three different places: Roncesvalles, Somport or Nájera… but the way is long and they will need to rest in order to recover their energy.When a peregrin arrives to a city the first thing he does is trying to sleep at a free hostel. In this case he spents no money at all. If the hostel is at its full capacity he’ll try to pay for a room at a Hotel. He’ll be always resting better at a hotel than at a free hostel. He’ll recover more energy but at a cost. If a peregrin can’t pay, he’ll not rest at all. If he has not enought energy to move to the next city, he’ll quit his journey.

Our solution We’ve used protected types – A city is a

protected type, and the whole way is formed by them. So the way could be know as an array of protected types.

A city will have these properties: The next city (integer representing the position of

the city in the array) The cost for moving to the next city (in terms of

energy) The numbersof rooms the local hostel has. The energy recovered if sleeping at a free hoStel The energy recovered if sleeping at a Hotel The price of a room at the hotel

Ciudadprotected type Ciudad is

procedure Init(next_cost : Integer;next_c: Integer; plazasA : Integer; F_Recupera_Alb : Integer; HotelCuesta :Integer; F_Recupera_Hot : Integer);procedure DormirEnAlbergue (Id : Integer; PuedeDormir : out Boolean; Fuerza : in out Integer);procedure SalirDeAlbergue (Id : Integer);procedure DormirEnHotel (Id : Integer; Dinero : in out Integer; PuedeDormir : out Boolean; Fuerza : in out

Integer);procedure SalirDeHotel(Id : Integer);function get_next_ciu return Integer;function get_next_ciu_cuesta return Integer;

privatenext_ciu_cuesta : Integer;next_ciu : Integer;PlazasAlbergue : Integer;F_Recupera_Alblbergue : Integer;Precio_hotel : Integer;F_Recupera_Hotel: Integer;

end Ciudad;

Ciudad (2)procedure DormirEnAlbergue (Id : Integer; PuedeDormir : out Boolean;

Fuerza : in out Integer) is begin PuedeDormir := False; -- En un principio no

if PlazasAlbergue > 0 then Put_Line("El peregrino "&Integer'Image(Id)&" consigue sitio en

albergue"); Put_Line("+ "&Integer'Image(F_Recupera_Alblbergue)&"

fuerza"); Put_Line(Integer'Image(PlazasAlbergue)&" plazas"); plazasAlbergue := PlazasAlbergue - 1; Fuerza := Fuerza + F_Recupera_Alblbergue; PuedeDormir := True; -- Entonces sà end if; end DormirEnAlbergue;

Ciudad (4)procedure SalirDeHotel (Id : Integer) is begin

Put_Line("El peregrino "&Integer'Image(Id)&" se va del hotel");

end SalirDeHotel;

function get_next_ciu return Integer is begin return next_ciu; end get_next_ciu;

function get_next_ciu_cuesta return Integer is begin return next_ciu_cuesta; end get_next_ciu_cuesta;

Camino

type Camino is array (1 .. MAX_CIUDADES) of Ciudad;

CaminoDeSantiago : Camino;

Peregrino task body Peregrino is Dinero : Integer; Fuerzas : Integer; Fracaso : Boolean; Tiempo_Dormir : constant := 3.0; CiudadActual : Integer; PuedeDormir : Boolean; Descansa_En : TDescanso; begin Fuerzas := Integer(Random(G)*Float(MAX_FUERZAS-2))+2; Dinero := Integer(Random(G)*Float(MAX_DINERO-1))+1; CiudadActual := Integer(Random(G)*2.0)+1; -- 1, 2 o 3

Fracaso := False; -- Inicializado a false

Peregrino (2)while CiudadActual /= SANTI and not Fracaso loop

Descansa_En := nada; -- Por defecto

CaminoDeSantiago(CiudadActual).DormirEnAlbergue(Id, PuedeDormir, Fuerzas);

if not PuedeDormir then Put_Line("El peregrino "&Integer'Image(Id)&" no encuentra sitio en el albergue");

CaminoDeSantiago(CiudadActual).DormirEnHotel(Id, Dinero, PuedeDormir, Fuerzas);

if not PuedeDormir then Put_Line("El peregrino "&Integer'Image(Id)&" no puede

permitirse el hotel"); else Descansa_En := hotel; end if; else Descansa_En := albergue; end if; ...

Peregrino (3)

if PuedeDormir then delay Duration(Tiempo_Dormir*Random(G)); if Descansa_En = albergue then

CaminoDeSantiago(CiudadActual).SalirDeAlbergue(Id); elsif Descansa_En = hotel then

CaminoDeSantiago(CiudadActual).SalirDeHotel(Id); end if; -- Se va si ha descansado else Put_Line("El peregrino "&Integer'Image(Id)&" no descansa

en "&Integer'Image(CiudadActual)); end if;

Peregrino (4) if Fuerzas < CaminoDeSantiago(CiudadActual).get_next_ciu_cuesta

then Put_Line(“¡¡POBRE!! El peregrino "&Integer'Image(Id)&"

fracaso, no tiene fuerzas!!"); Fracaso := True; -- Jarl else -- Si puede... if CiudadActual /= SANTI then Put_Line("El peregrino "&Integer'Image(Id)&" a por la ciudad

"&Integer'Image(CaminoDeSantiago(CiudadActual).get_next_ciu)); Fuerzas := Fuerzas -

CaminoDeSantiago(CiudadActual).get_next_ciu_cuesta; Ciudadactual :=

CaminoDeSantiago(CiudadActual).get_next_ciu; end if; end if;end loop; -- sale de aquí = ya no va a ningín sitio más

Peregrino (5)

… continúa desde “fin loop” de recorrer nodos

if not Fracaso then Put_Line("BIENNNNN!!!

Peregrino"&Integer'Image(Id)&" ha llegado a Santiago de Compostela!! Rece por nosotros! Para aprobar!!");

end if;end Peregrino;

Initializationprocedure InitNodos is begin

-- Informacion del camino, ayuda x J. Peris (gracias) CaminoDeSantiago(1).Init(3,3,2,1,3,2); --

Roncesvalles CaminoDeSantiago(2).Init(4,4,2,1,3,1); -- Somport CaminoDeSantiago(3).Init(2,2,1,1,3,1); -- Nájera CaminoDeSantiago(4).Init(5,6,1,2,3,2); -- Otro CaminoDeSantiago(5).Init(6,4,1,2,3,2); --

… CaminoDeSantiago(9).Init(0,0,1000,1000,1000,1000);

end InitNodos;

Initialization (2)

begin

InitNodos;

for I in 1..MAX_PEREGRIN loop Peregrinos := new Peregrino(I); delay Duration(Random(G)); end loop;

end CaminoTProtAda;

Screenshot

Questions?

Thank you.