Klassen Lane
Vi låter en fil bestå av ett antal positioner som antingen kan innehålla ett fordon eller vara tom (d.v.s. 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 på filen när tiden stegas?
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 på respektive lämnar filen.
Lane
måste tillhandahålla
en metod för att ta ut från första platsen och returnerar 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__(length)
som tar emot längden dvs antalet fordon som kan finnas på filen. Från början finns inga fordon på filen. -
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 tom returnerasNone
. Metoden gör inga andra ändringar iLane
-objektet. -
En metod
step()
som flyttar alla fordon utom det som står först på 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 fordon på index 1, sedan fordon på index 2 etc. -
En metod
is_last_free()
som returnerarTrue
om sista platsen är ledig, annarsFalse
. -
En metod
enter(v)
som lagrar fordonetv
sist på filen. -
Metoden
number_in_lane()
som returnerar antalet fordon på filen. -
Metoden
__str__()
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 de olika metoderna.
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 |