Eigentlich hätte ich gedacht, dass ich diese Aufgabe schon längst mal aufgenommen hatte, stimmte aber nicht. Dabei ist sie zu Beginn der Q11 super zum Glätten der Leistungsunterschiede bei den Schülern und um schon mal zu sehen, wer was kann und wie gut. Außerdem lässt sich prima die Warteschlange als einfach verkettete Liste motivieren, da die Aufgabe mit einem Array umgesetzt nicht sehr performant ist.
Aufgabe 78
Schreibe ein Programm zur Verwaltung der Taxiwarteschlange an einem beliebigen Bahnhof.
Benutze dabei ein Feld Taxi, wobei die Anzahl der Taxen vom jeweiligen Bahnhof abhängt.Die Klasse Taxi muss mindestens das Attribut fahrerName besitzen.
Implementiere für die Klasse TaxiWarteschlange mindestens folgende Methoden:
1.) pop() entfernt das vorderste Taxi
2.) push(neuesTaxi) hängt ein Taxi hinten an.
3.) aufruecken() rückt alle Taxen um 1 nach vorne und wird nach der Ausführung von pop() benötigt.
Die Überleitung bzw. Motivierung zur einfach verketteten Liste geschieht dann durch folgendes Szenario: Ein Taxifahrer hat eventuell einen Dauerkunden, der immer zu einer bestimmten Uhrzeit abgeholt werden muss (z.B. eine Dialysepatient). Daher kann ein Taxi auch mal aus der Mitte der Warteschlange herausfahren. Daraufhin müssen entsprechend alle Taxen aufrücken.
Die Lösung dieses Problems mag für einen erfahreren Programmierer einfach sein. Für viele Schüler ist es aber überhaupt nicht. Oft bekomme ich eine Lösung mit drei geschachtelten Schleifen, also O(n3), anstelle einer einfachen, linearen Lösung.
Während meine Schüler das im Moment mit Java umsetzen, versuche ich mich an Python. Was nicht ganz einfach ist, da die Syntax dann doch zunächst sehr anders ist. Hier ein kleiner Auszug vom Start:
class TaxiSchlange:
def __init__(self):
self.__schlange = []
def push(self, neuesTaxi):
self.__schlange.append(neuesTaxi)
def p(self):
for el in self.__schlange:
el.p()Als erstes gibt es kein private oder public, in Python geht das mit Unterstrichen. Es gibt statt Arrays, Tupel bzw. statt ArrayListen die Listen. Die habe ich oben bemüht. Wodurch aber manches anders wird. Auch das Attribute erst im Konstruktor, der hier __init__ heißt, definiert werden, fand ich ungewöhnlich. Aber mit der Zeit wird man sich wohl daran gewöhnen.
