Klassen Lane
#
Vi låter en fil bestå av ett antal positioner som antingen kan innehålla
ett fordon eller vara tomma. Tomma platser representeras med värdet None
.
Fordon strömmar in i ena änden (högsta index) och ut ur andra änden (index 0).

Förenklingar av verkligheten: En fil består av ett antal diskreta positioner och alla fordon tar lika stor plats.
Vad händer i filen när tiden stegas?#





Observera att ett fordon flyttas högst en position per tidssteg!
Förenkling av verkligheten: Ett fordon står antingen stilla eller flyttar sig en plats per tidssteg.
Vad sker i ändarna på Lane
?#
Klassen Lane
vet inte vad som finns framför eller bakom. Det är alltså
”någon annan” som ser till att fordon kommer in i respektive lämnar
filen.
Lane
måste tillhandahålla en metod för att ta bort fordonet från första platsen
och returnera fordonet som fanns där:

Det måste också finnas en metod som sätter ett fordon på sista platsen:

Om man lägger ett fordon på sista platsen och den inte är ledig kommer man att tappa bort det som låg där:

Det måste alltså gå att undersöka om sista platsen är ledig eller ej.
Klassen ska ha följande:
En konstruktor
__init__(self, length)
som tar emot filens längd, dvs. antal fordon som kan finnas i filen. Från början finns inga fordon i filen.En instansvariabel som är en lista bestående av fordonen som just nu ligger i filen. Om platsen i filen är tom ska motsvarande element i listan vara
None
.En metod
get_first()
som returnerar fordonet som står på första plats utan att ta bort det. Om första platsen är tom returnerasNone
.En metod
remove_first()
som returnerar och tar bort fordonet på första plats. Om platsen är tom returnerasNone
. Metoden gör inga andra ändringar iLane
-objektet.En metod
step()
som flyttar alla fordon utom det som står först i filen (index 0) ett steg framåt. Ett fordon får bara flyttas om platsen framför är ledig. Flyttningen ska ske från vänster till höger, dvs. först fordonet på index 1, sedan fordonet på index 2, osv.En metod
last_free()
som returnerarTrue
om sista platsen är ledig, annarsFalse
.En metod
enter(self, v)
som lagrar fordonetv
sist i filen.En metod
number_in_lane()
som returnerar antalet fordon i filen.En
__str__
-metod som returnerar en lämplig strängrepresentation av objektet. Se nedan!
I programmet ska Lane
-objekten hanteras med dessa metoder och således
vara oberoende av den interna representationen.
Nedan följer kod med utskrifter som demonstrerar några av metoderna. Se till att din klass ger den förväntade utskriften innan du går vidare!
Obs! Demo-funktionen finns redan inlagd i modulen trafficComponents.py så du anropar den enklast genom att köra trafficComponents.py
.
Kod |
Utskrift |
---|---|
def demo_lane():
"""Demonstration of the class Lane"""
a_lane = Lane(10)
print(a_lane)
v = Vehicle('N', 34)
a_lane.enter(v)
print(a_lane)
a_lane.step()
print(a_lane)
for i in range(20):
if i % 2 == 0:
u = Vehicle('S', i)
a_lane.enter(u)
a_lane.step()
print(a_lane)
if i % 3 == 0:
print(' out: ',
a_lane.remove_first())
print('Number in lane:',
a_lane.number_in_lane())
|
[..........]
[.........N]
[........N.]
[.......NS.]
out: None
[......NS..]
[.....NS.S.]
[....NS.S..]
out: None
[...NS.S.S.]
[..NS.S.S..]
[.NS.S.S.S.]
out: None
[NS.S.S.S..]
[NSS.S.S.S.]
[NSSS.S.S..]
out: Vehicle(N, 34)
[SSS.S.S.S.]
[SSSS.S.S..]
[SSSSS.S.S.]
out: Vehicle(S, 0)
[SSSS.S.S..]
[SSSSS.S.S.]
[SSSSSS.S..]
out: Vehicle(S, 2)
[SSSSS.S.S.]
[SSSSSS.S..]
[SSSSSSS.S.]
out: Vehicle(S, 4)
[SSSSSS.S..]
Number in lane: 7
|