# Route 66
Töltsd fel a 4 részfeladat megoldását tartalmazó bead1, bead2, bead3, bead4
könyvtár tartalmát (csak .ads és .adb fileket !).
bead1/
A 66-os úton áll egy benzinkút. Szimuláld a működését. A kút egy védett
egységgel legyen megvalósítva. Egyszerre egy autó tud tankolni a kútnál.
A tankolás megkezdését az autó a védett egység egyik műveletének meghívásával
kérheti. A művelet akkor hajtódik végre, ha szabaddá válik a kút. A kút
másik művelete segítségével fizethetnek az autósok: a művelet hatására
szabaddá válik a kút. (A kút működjön úgy, mint egy szemafor.
Az általa őrzött kritikus szakasz a tankolás lesz.)
Az autókat egy taszk típussal valósítsd meg. Egy autó a következőképpen
működik. Tankolásra jelentkezik a kútnál. Amikor sorra kerül, három
másodperces várakozással szimulálja a tankolás folyamatát. Ezután 0.1
másodpercig tart a sofőrnek, amíg a pénztárhoz megy. Ott fizet, majd elhajt
(azaz végetér a taszk). Indíts el 10 autót. Az autók írják ki, hogy épp
mit csinálnak.
***************************
bead2/
Az út mellett, nem sokkal az eddig szimulált kút után felépült egy újabb kút.
Az autósok, ha nem kerülnek elég gyorsan sorra az első kútnál, tovább szoktak
hajtani, és a második kútnál tankolnak. Szimuláljuk most ezt!
A kút legyen védett típus, és egy tömbben hozz létre belőle kettőt.
Az autósok kapjanak egy diszkriminánst, amelyben megadható, hogy hány litert
kell tankolniuk. Egy liter betankolása 0.1 másodperc legyen. Az autók,
miután odaérnek az első kúthoz, várni kezdenek, hogy tankolhassanak. Ha
3.5 másodpercen belül sorra kerülnek, akkor tankolnak, fizetnek és távoznak.
Ha a megadott időkorláton belül nem kerülnek sorra (használj időhöz kötött
hívást!), akkor továbbmennek a második kúthoz. Ez 1.0 másodperc. Ott is
sorbaállnak, immár időkorlát nélkül. Amikor sorra kerülnek, fizetnek, majd
távoznak.
A főprogramban allokációval, mutató típuson keresztül indíts el autókat.
Az autók indítása között egy kis idő is eltelhet, hogy ne egyszerre érkezzenek
a kúthoz.
***************************
bead3/
Az autóknak ne csak azt adjuk át paraméterként, hogy hány litert tankoljanak.
Legyen paraméter az is, hogy mennyi ideig hajlandóak várakozni az első kútnál,
mennyi idő alatt érnek át a második kúthoz, és hogy mennyi ideig tart a
sofőrnek a pénztárhoz menni és fizetni. Használj egy rekord típust ezen
adatok összefogására, és egy erre mutató típus legyen a taszk típus
diszkriminánsának típusa.
A főprogram a szabványos bemenetről olvassa be az autók indításához szükséges
adatokat. Egy autó kapcsán öt adatra van szükség: a paraméterként átadandó
rekord négy mezőjére, illetve az autó elindítása előtti várakozás mértékére.
Az első adat egy pozitív egész szám, a többi pedig Duration
típusú. (A Duration
típushoz IO műveleteket a
Ada.Text_IO.Fixed_IO
csomagsablon példányosításával kaphatsz.)
Olvass be öt adatot, majd a megadott várakozási idő letelte után indíts el
egy megfelelően felparaméterezett autót. Ezután kezdheted a következő autó
adatainak beolvasását.
Feltételezzük, hogy a szabványos bemeneten helyes adatok találhatók.
Az adatok beolvasásának és az autók indításának végét a "fájl vége" jelzi.
***************************
bead4/
Az előző feladat óta sokat fejlődött az infrastruktúra. A két benzinkút
helyett már csak egy áll a 66-os úton, de az a benzinkút négy, egymással
párhuzamosan működő kútból áll.
Egészítsd ki a védett egységet egy olyan művelettel, amellyel a kútnál sorban
állók számát lehet lekérdezni. Ez a szám a védett egység belépési pontjának
várakozási sorában álló folyamatok számát ('Count
attribútum)
jelenti, illetve ennél eggyel nagyobat, ha a kút épp foglalt. Használj
négy védett egységet a benzinkúthoz.
Az autók paraméterezéséhez olyan rekordot használj, amelyben a tankolni
kívánt literek száma, egy várakozási érték és a pénztárhoz érés
ideje található. (Tehát csak három mező. Ennek megfelelően kell módosítani
a paraméterek beolvasását a szabványos bemenetről...)
Az autók a következőképen működjenek. Amikor odaérnek a benzinkúthoz,
kiválasztják, hogy melyik kútnál állnak a legkevesebben sorban. Ezen kútnál
kezdenek várakozni. Amennyiben letelt a várakozási idő, és nem kerültek
sorra, ismét végignézik a kutakat, és egy üres sort keresnek. Ha találnak
ilyet, és azonnal sorra kerülnek ott (használj nem blokkoló hívást), akkor
ott tankolnak meg. Ha nem sikerül tankolniuk, csalódottan távoznak. Ha
vagy a legelőször kiválasztott, vagy a másodszorra kiválasztott kútnál
sikerül tankolni, akkor persze távozás előtt fizetnek.
Jó munkát!