Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porTeodoro Zara Modificado hace 10 años
1
Matías Blanco – Sergio Pérez
2
The Problem A 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.
3
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
4
Ciudad protected 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; private next_ciu_cuesta : Integer; next_ciu : Integer; PlazasAlbergue : Integer; F_Recupera_Alblbergue : Integer; Precio_hotel : Integer; F_Recupera_Hotel: Integer; end Ciudad;
5
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;
6
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;
7
Camino type Camino is array (1.. MAX_CIUDADES) of Ciudad; CaminoDeSantiago : Camino;
8
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
9
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;...
10
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;
11
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 loop; -- sale de aquí = ya no va a ningín sitio más
12
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;
13
Initialization procedure 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;
14
Initialization (2) begin InitNodos; for I in 1..MAX_PEREGRIN loop Peregrinos := new Peregrino(I); delay Duration(Random(G)); end loop; end CaminoTProtAda;
15
Screenshot
16
Questions? Thank you.
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.