JAVA|JAVA面向对象编程|德国作业代写 外国作业代写

Prof. Dr.-Ing. Anne Koziolek

Architecture-driven Requirements Engineering (ARE)

https://sdqweb.ipd.kit.edu/wiki/Programmieren

programmieren-vorlesung@ipd.kit.edu

Programmieren – Wintersemester 2019/20

Abschlussaufgabe 1

Version 1.0

20 Punkte

Ausgabe: 10.02.2020, ca. 13:00 Uhr

Praktomat: 24.02.2020, 13:00 Uhr

Abgabefrist: 10.03.2020, 06:00 Uhr

Abgabehinweise

Bitte beachten Sie, dass das erfolgreiche Bestehen der öffentlichen Tests für eine erfolgreiche

Abgabe dieses Blattes notwendig ist. Der Praktomat wird Ihre Abgabe zurückweisen, falls eine

der nachfolgenden Regeln verletzt ist. Eine zurückgewiesene Abgabe wird automatisch mit null

Punkten bewertet. Planen Sie entsprechend Zeit für Ihren ersten Abgabeversuch ein.

• Achten Sie auf fehlerfrei kompilierenden Programmcode.

• Verwenden Sie keine Elemente der Java-Bibliotheken, ausgenommen Elemente der Pakete

java . lang, java . util, java . util . regex und java . util . function.

• Achten Sie darauf, nicht zu lange Zeilen, Methoden und Dateien zu erstellen. Sie müssen bei

Ihren Lösungen eine maximale Zeilenbreite von 120 Zeichen einhalten.

• Halten Sie alle Whitespace-Regeln ein.

• Halten Sie alle Regeln zu Variablen-, Methoden- und Paketbenennung ein.

• Wählen Sie geeignete Sichtbarkeiten für Ihre Klassen, Methoden und Attribute.

• Nutzen Sie nicht das default-Package.

• System . exit () und Runtime . exit () dürfen nicht verwendet werden.

• Halten Sie die Regeln zur Javadoc-Dokumentation ein.

• Halten Sie auch alle anderen Checkstyle-Regeln an.

Seite 1 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Bearbeitungshinweise

Diese Bearbeitungshinweise sind relevant für die Bewertung Ihrer Abgabe, jedoch wird der Praktomat

Ihre Abgabe nicht zurückweisen, falls eine der nachfolgenden Regeln verletzt ist.

• Beachten Sie, dass Ihre Abgaben sowohl in Bezug auf objektorientierte Modellierung als auch

Funktionalität bewertet werden. Halten Sie die Hinweise zur Modellierung im ILIAS-Wiki ein.

• Programmcode muss in englischer Sprache verfasst sein.

• Kommentieren Sie Ihren Code angemessen: So viel wie nötig, so wenig wie möglich.

• Die Kommentare sollen einheitlich in englischer oder deutscher Sprache verfasst werden.

• Wählen Sie aussagekräftige Namen für alle Ihre Bezeichner.

< Plagiat

Es werden nur selbstständig erarbeitete Lösungen akzeptiert. Das Einreichen fremder Lösungen,

seien es auch nur teilweise Lösungen von Dritten, aus Büchern, dem Internet oder

anderen Quellen wie beispielsweise der Lösungsvorschläge des Übungsbetriebes, ist ein Täuschungsversuch

und führt zur Bewertung „nicht bestanden“. Ausdrücklich ausgenommen

hiervon sind Quelltextschnipsel von den Vorlesungsfolien. Alle benutzten Hilfsmittel müssen

vollständig und genau angegeben werden und alles was aus Arbeiten anderer unverändert

oder mit Abänderungen entnommen wurde, muss deutlich kenntlich gemacht werden. Für

weitere Ausführungen sei auf die Einverständniserklärung (Disclaimer) verwiesen.

Í Checkstyle

Der Praktomat überprüft Ihre Quelltexte während der Abgabe automatisiert auf die Einhaltung

der Checkstyle-Regeln. Es gibt speziell markierte Regeln, bei denen der Praktomat die

Abgabe zurückweist, da diese Regel verpflichtend einzuhalten ist. Andere Regelverletzungen

können zu Punktabzug führen. Sie können und sollten Ihre Quelltexte bereits während

der Entwicklung auf die Regeleinhaltung überprüfen. Das Programmieren-Wiki (ILIAS)

beschreibt, wie das funktioniert.

& Terminal-Klasse

Laden Sie für diese Aufgabe die Terminal-Klasse herunter und platzieren Sie diese

unbedingt im Paket edu . kit . informatik. Die Methode Terminal . readLine ()

liest eine Benutzereingabe von der Konsole und ersetzt System .in. Die Methode

Terminal . printLine () schreibt eine Ausgabe auf die Konsole und ersetzt

System .out. Verwenden Sie für jegliche Konsoleneingabe oder Konsolenausgabe die

Terminal-Klasse. Verwenden Sie in keinem Fall System .in oder System .out. Fehlermeldungen

werden ausschließlich über die Terminal-Klasse ausgegeben und müssen aus

technischen Gründen unbedingt mit Error,  beginnen. Dies kann unter anderem bequem

über die Terminal.printError-Methode erfolgen. Laden Sie die Terminal-Klasse niemals

zusammen mit Ihrer Abgabe hoch.

Seite 2 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Modelleisenbahnsimulation (20 Punkte)

In dieser Abschlussaufgabe sollen Sie einen Modelleisenbahnsimulator entwickeln. Die Abschlussaufgabe

besteht aus zwei voneinander abhängenden Teilaufgaben. Die erste Teilaufgabe ist die

Modellierung des Streckennetzes und des Rollmaterials (Wagen, Lokomotiven, Triebzüge). Die

zweite Teilaufgabe ist die Fahrsimulation.

. Information

Die grafische Repräsentation von dem Rollmaterial basiert teilweise auf dem sl-Programm a.

Für die Dateien gilt das Copyright von Toyoda Masashi. Zur einfacheren Verwendung stellen

wir zusätzlich die Textdatei mit den einzelnen Elementen zur Verfügung (representation.txt).

ahttps://github.com/mtoyoda/sl

Gleismaterial

Das Gleisnetz wird über Gleise dargestellt. Vereinfacht werden Gleise durch zwei bzw. drei Punkte

im zweidimensionalen Raum dargestellt. Ein Punkt ist ein Tupel aus zwei 32-Bit-Ganzzahlen und

repräsentiert eine Koordinate. Alle Gleise besitzen einen eindeutigen Identifikator beginnend bei 1.

Dieser Identifikator ist nur eindeutig für Gleise (siehe Beispielablauf). Der Identifikator ist eine

32-bit-Ganzzahl und wird aufsteigend vergeben.

Eine Strecke besteht aus mehreren Gleisen. Dabei gibt es zwei Gleistypen: normale Gleise und

Gleisweichen (Weichen). Normale Gleise werden durch zwei Punkte im Raum beschrieben, den

Start- und Endpunkt. Die Koordinaten können beliebig im Raum liegen, mit der Einschränkung,

dass Gleisteile immer waagerecht oder senkrecht sind. Dabei ist nur eine Veränderung in x-Richtung

waagerecht und eine Veränderung nur in y-Richtung senkrecht. Außerdem muss mit Ausnahme vom

ersten Gleis ein Start- oder Endpunk immer an einem Start- bzw. Endpunkt eines vorhanden Gleis

anliegen. An einem Punkt an einem Gleis kann immer nur ein anderes Gleis (normales Gleis oder

Gleisweiche) angeschlossen werden. Jedes Gleis besitzt eine Länge1, welche Abhängig von ihrer

Start- und Endkoordinate ist. Zur Vereinfachung wird die Länge immer als abgerundete positive

Ganzzahl2 angegeben.

Gleisweichen dienen dazu eine Strecke in zwei Teilstrecken aufzuspalten. Sie werden durch drei

Koordinaten beschrieben, einen Startpunkt und zwei Endpunkten. Gleisweichen besitzen zusätzlich

die Eigenschaft, die aktuelle Gleisweichenstellung zu speichern. Die aktuelle Gleisweichenstellung

entscheidet die Befahrbarkeit einer Gleisweiche. Die Länge einer Gleisweiche ergibt sich in

Abhängigkeit ihrer aktuellen Gleisweichenstellung.

Abbildung 0.1 illustriert ein mögliches Streckennetz. Die schwarzen Punkte zeigen jeweilige Startund

Endpunkte für Gleismaterial. Gleiseweichen sind durch das Label „Weiche X“ markiert, wobei

X ein Platzhalter für eine ganze positive Zahl ist. Die aktuelle Gleiseweichenstellung wird durch

die schwarze Linie angezeigt. Die rote Linie zeigt die alternative Auswahlmöglichkeit an. Ein Zug

1Hinweis: Betrag eines Vektors

2Wählen Sie hier einen passenden Datentyp, achten Sie dabei insbesondere auf die Abhängigkeit zu Koordinaten

Seite 3 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

(1,1)

(5,1) (8,1)

(5,3)

(10,1)

(10,3) (12,3)

(1,-3) (10,-3) (12,-3)

(14,3)

(14,-1)

Gleis 1

Weiche 1

Weiche 1 Gleis 2

Gleis 5 Gleis 6

Weiche 3

Weiche 3

Weiche 2

Weiche 2

Gleis 7

Gleis 3

Gleis 4

Abbildung 0.1: Beispiel einer einfachen Strecke mit Gleisweichen und Gleisen

kann nur auf der schwarzen Linie die Strecke befahren. Dies ist auch das Streckennetz, welches im

Beispielablauf verwendet wird.

Gleise können sich nicht kreuzen, d.h. wenn Gleise als Geraden gesehen werden, dürfen sie sich

nicht schneiden. Abbildung 0.2 zeigt eine verbotene Gleiskreuzung. Auch ist es nicht erlaubt Gleise

außerhalb von Start- und Endpunkten zu verbinden. Dies wäre in dieser Aufgabe auch ein Kreuzen

von Gleisen. Zudem kann einem Start- oder Endpunkt nur genau ein anderes Gleis anliegen.

(1,1) (5,1)

(3,0)

(3,2)

Abbildung 0.2: Nicht erlaubtes Kreuzen von Gleisen

Rollmaterial

Das Rollmaterial beschreibt im Allgemeinen alle auf Schienen fahrenden Gegenstände, z.B. einen

Eisenbahnwagen. Aus Gründen der Einfachheit nehmen wir an, dass es nur folgende Typen gibt:

Wagen, Lokomotiven, Triebzüge. Allen Typen gemeinsam ist, dass sie einen Namen und eine Länge

besitzen, z.B. könnte eine Lokomotive den Namen Emma und die Länge 1 haben.

Seite 4 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

____________________

| ___ ___ ___ ___ |

| |_| |_| |_| |_| |

|__________________|

|__________________|

(O) (O)

(a) Personenwagen

| |

| |

| |

|__________________|

(O) (O)

(b) Güterwagen

____

/————–| |

\————–| |

| | | |

_|_|__________| |

|_________________|

(O) (O)

(c) Spezialwagen

Abbildung 0.3: Grafische Repräsentation von Wagen

Wagen

Zur Vereinfachung gibt es hier nur die Personen-, Güter-, Spezialwagen als Wagentyp. Der Personenwagen

dient zum Transport von Personen, der Güterwagen zum Transport von Gütern und

Spezialwagen sind z.B. ein Kranwagen oder ein Feuerwehrwagen. Die verschiedenen Wagentypen

werden wie in Abbildung 0.3 grafisch repräsentiert.

Alle Wagen besitzen einen eindeutigen 32-bit-ganzzahligen aufsteigenden Identifikator beginnend

bei 1. Dieser Identifikator ist nur eindeutig für Wagen (siehe Beispielablauf).

Jeder Wagen besitzt mindestens eine, aber maximal zwei Kupplungen. Diese befinden sich immer am

Anfang und Ende eines Wagens. Auch darf es auf einer Seite (Anfang, Ende) maximal eine Kupplung

geben. Diese Kupplungen ermöglichen die Komposition von Rollmaterial (siehe Komposition von

Rollmaterial)

Lokomotive

Es gibt drei verschiedene Untertypen von Lokomotiven: Elektrolokomotiven, Diesellokomotiven

und Dampflokomotiven. Alle Lokomotiven besitzen eine eindeutige ID. Diese ID setzt sich aus

der Baureihe und dem Namen der Lokomotive zusammen. Diese werden durch einen Bindestrich

getrennt, beispielsweise ergeben die Baureihe „103“ und der Name „118“ die ID „103-118“. Sowohl

der Name als auch die Baureihe können Buchstaben und Zahlen enthalten. Wobei die Baureihe

nicht die Zeichenkette „W“ sein darf. Jede Lokomotive besitzt mindestens eine, aber maximal zwei

Kupplungen. Diese befinden sich immer am Anfang und Ende einer Lokomotive. Auch darf es

auf einer Seite (Anfang, Ende) maximal eine Kupplung geben. Diese Kupplungen ermöglichen

die Komposition von Rollmaterial (siehe Komposition von Rollmaterial). Abbildung 0.4 zeigt die

grafische Repräsentation von Lokomotiven.

Triebzug

Alle Triebzüge besitzen eine Baureihe. Die Triebzug-ID setzt sich nach den gleichen Regeln, wie bei

den Lokomotiven zusammen. Aus diesem Grund teilen sich Lokomotiven und Triebzüge den gleichen

ID-Raum. Ein Triebzug besitzt eine spezielle Art von Kupplung und kann damit nur mit der gleichen

Baureihe von Triebzügen komponiert werden (siehe Komposition von Rollmaterial). Ansonsten

Seite 5 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

++ +——

|| |+-+ |

/———|| | |

+ ======== +-+ |

_|–/~\——/~\-+

//// \_/ \_/

(a) Dampflokomotive

___

\

_______________/__

/_| ____________ |_\

/ |____________| \

\ /

\__________________/

(O)(O) (O)(O)

(b) Elektrolokomotive

_____________|____

/_| ____________ |_\

/ |____________| \

\ /

\__________________/

(O)(O) (O)(O)

(c) Diesellokomotive

Abbildung 0.4: Grafische Repräsentation von Lokomotiven

++

||

_________||_________

| ___ ___ ___ ___ |

| |_| |_| |_| |_| |

|__________________|

|__________________|

(O) (O)

Abbildung 0.5: Grafische Repräsentation von Triebzügen

gelten die gleichen Regeln wie bei Lokomotiven. Abbildung 0.5 zeigt die grafische Repräsentation

von Triebzügen.

Komposition von Rollmaterial

Rollmaterial kann zu einem Zug komponiert werden. Bei der Komposition gilt es folgende Einschränkungen

zu beachten:

• Am Anfang oder Ende eines validen Zug muss immer mindestens eine Lokomotive/Triebzug

sein.

• Bei der Komposition muss immer beachtet werden, ob das Rollmaterial an der gewünschten

Kompositionsstelle eine passende Kupplung besitzt.

• Das Rollmaterial, welches komponiert wird, ist noch nicht in einem anderen Zug eingesetzt.

Alle Züge besitzen eine eindeutige ID beginnend bei 1. Die ID ist eine 32-Bit-Ganzzahl und wird

aufsteigend vergeben. Diese ID ist nur eindeutig für Züge (siehe Beispielablauf). Ein Zug kann

auch grafisch auf der Konsole ausgegeben werden. Dabei werden die einzelnen Repräsentationen

des Rollmaterial entsprechen ihrer Position im Zug konkateniert. Die einzelnen Repräsentation

sind durch ein Leerzeichen getrennt. Abbildung 0.6 zeigt eine Ausgabe für einen Zug mit einer

Dampflokomotive und zwei Personenwagen. Abbildung 0.7 zeigt ein weiteres Zug-Beispiel mit einer

Elektrolokomotive und einem Personenwagen.

Seite 6 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

++ +—— ____________________ ____________________

|| |+-+ | | ___ ___ ___ ___ | | ___ ___ ___ ___ |

/———|| | | | |_| |_| |_| |_| | | |_| |_| |_| |_| |

+ ======== +-+ | |__________________| |__________________|

_|–/~\——/~\-+ |__________________| |__________________|

//// \_/ \_/ (O) (O) (O) (O)

Abbildung 0.6: Beispielrepräsentation von einem Zug mit Dampflokomotive

___

\

_______________/__ ____________________

/_| ____________ |_\ | ___ ___ ___ ___ |

/ |____________| \ | |_| |_| |_| |_| |

\ / |__________________|

\__________________/ |__________________|

(O)(O) (O)(O) (O) (O)

Abbildung 0.7: Beispielrepräsentation von einem Zug mit Elektrolokomotive

Fahrbetrieb

Um den Fahrbetrieb einer Modelleisenbahn zu simulieren, muss als erstes ein Zug auf ein Gleis

gesetzt werden. Dabei wird immer der ganze Zug komplett auf das Gleis gesetzt. Beim Aufsetzen

muss ein Richtungsvektor angegeben werden. Dieser gibt die initiale Fahrrichtung des Zuges an.

Der Richtungsvektor entspricht dem Richtungsvektor des Gleises oder ist genau der entgegensetze

Vektor. Beim Aufgleisen muss beachtet werden, dass die benutzten Gleise noch frei sind, d.h. kein

anderer Zug dort steht und es dort überhaupt ein Gleis gibt. Dabei spielt natürlich auch die Länge

eines Zuges eine Rolle. Züge können auf Strecken mit Gleiseweichen erst aufgesetzt werden, wenn

die Gleiseweichenstellung gesetzt wurde. Außerdem können Züge nur auf den Abschnitt gesetzt

werden, der die aktuelle Gleisweichenstellung ist. Falls Gleiseweichen auf denen ein Zug bereits

steht, geschaltet werden, entgleist der daraufstehende Zug.

Wenn Züge auf dem Gleis stehen können sie sich immer nur auf dem Gleis fortbewegen. Dabei

bewegen sie sich initial in Richtung des Richtungsvektors fort und folgen dem Schienenverlauf.

Bevor sich ein Zug bewegen kann, muss für alle Gleisweichen eine Gleisweichenstellung gesetzt

werden.

Wie auch bei kleinen Modelleisenbahnanlagen üblich fahren hier alle Züge, die auf der Anlage stehen.

Die Geschwindigkeit ist für alle Züge gleich. Im Allgemeinen gilt, dass der Zug bei waagerechten

Gleisen sich um n x-Einheiten bewegt und bei vertikalen Gleisen um n y-Einheiten bewegt. Die

Simulation hier wird in Schritten berechnet, dazu wird bei jedem Schritt n 2 Z16􀀀Bit übergeben. Zur

Verdeutlichung hier ein Beispiel in Abbildung 0.8. Die Punkte sind durch ein Tupel aus Ganzzahlen

angegeben. Der Kopf eines Zuges (roter Punkt) steht auf (2,0) auf dem Gleis von (1,0) nach (4,0)

und bewegt sich Richtung Punkt (4,0). Bei Punkt (4,0) ist eine Gleisweiche mit den Endpunkten

(4,2) und (6,0) angeschlossen. Die aktuelle Gleisweichenstellung ist auf (6,0). Nach einem Schritt

mit n = 1 würde der Zugkopf (blauer Punkt) bei (3,0) stehen (siehe Abbildung 0.8a). Nach einem

weiteren Schritt mit n = 2 würde der Zugkopf (gelber Punkt) bei (5,0) stehen. Im zweiten Beispiel

(siehe Abbildung 0.8b) steht der Kopf des Zuges (roter Punkt) auf (0,0) auf dem Gleis von (0,3)

Seite 7 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

nach (0,-1) und bewegt sich in Richtung Punkt (0,3). Nach einem Schritt mit n = 2 würde der

Zugkopf (blauer Punkt) bei (0,2) stehen. In einem weiteren Schritt mit n = 2 würde der Zugkopf

(gelber Punkt) bei (1,3) stehen.

(1,0)

(4,0)

(6,0)

(4,2)

(2,0) (3,0) (5,0)

(a) Fahrtsimulation mit Weiche

(0,-1)

(0,3) (3,3)

(0,0)

(0,2)

(1,3)

(b) Fahrtsimulation mit Kurve

Abbildung 0.8: Bewegungsrichtung Züge

Während der Simulation kann es zu Zusammenstößen von verschieden Zügen kommen. Ein Zusammenstoß

tritt hierbei auf, wenn zwei Züge auf dem gleichen Gleis oder Position stehen. Bei der

.berprüfung gehören die Start-/Endpunkte immer zu dem Gleis auf dem der der Rest des Zuges

steht. Zum Beispiel Gleis 1 (G1) von (10,1) nach (20,1) und Gleis 2 (G2) von (20,1) nach (30,1).

Wenn nun ein Zug mit Länge 4 auf (20,1) steht und Richtung (30,1) fährt, dann wäre G1 belegt

und G2 noch frei. Kommt es zu einem Zusammenstoß entgleisen die involvierten Züge.

Züge können über das Gleis hinaus fahren, d.h falls das Gleis endet und es kein Anschlussgleis gibt,

z.b. wie bei Abbildung 0.1 (Gleis 7) entgleist der Zug.

Wenn Züge entgleisen, werden Sie vom Gleis genommen. Sie bleiben jedoch in der Zugdatenbank

bestehen. Sie können danach wieder aufgesetzt werden.

Interaktive Benutzerschnittstelle

Nach dem Start nimmt Ihr Programm über die Konsole mittels Terminal.readLine() verschiedene

Arten von Befehlen entgegen, die im Folgenden näher spezifiziert werden. Nach Abarbeitung

eines Befehls wartet Ihr Programm auf weitere Befehle, bis das Programm irgendwann durch den

exit-Befehl beendet wird.

Achten Sie darauf, dass durch Ausführung der folgenden Befehle die zuvor definierten Grundlagen

und Bedingungen nicht verletzt werden und geben Sie in diesen Fällen immer eine aussagekräftige

Fehlermeldung aus. Entspricht eine Eingabe nicht dem vorgegebenen Format, dann ist immer

eine Fehlermeldung auszugeben. Danach soll das Programm auf die nächste Eingabe warten. Bei

Fehlermeldungen dürfen Sie den Text frei wählen, er sollte jedoch sinnvoll sein. Jede Fehlermeldung

muss aber mit Error, beginnen und darf keine Zeilenumbrüche enthalten.

Da wir automatische Tests Ihrer interaktiven Benutzerschnittstelle durchführen, müssen die Ausgaben

exakt den Vorgaben entsprechen. Insbesondere sollen sowohl Klein- und Großbuchstaben als

Seite 8 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

auch die Leerzeichen und Zeilenumbrüche genau übereinstimmen. Geben Sie auch keine zusätzlichen

Informationen aus. Beginnen Sie frühzeitig mit dem Einreichen, um Ihre Lösung dahingehend zu

testen, und verwenden Sie das Forum, um eventuelle Unklarheiten zu klären.

Beachten Sie, dass bei der Beschreibung der Eingabe- und Ausgabeformate die Wörter zwischen

spitzen Klammen ( < und > ) für Platzhalter stehen, welche bei der konkreten Ein- und Ausgabe

durch Werte ersetzt werden. Diese eigentlichen Werte enthalten bei der Ein- und Ausgabe keine

Klammern. Vergleichen Sie hierzu auch die jeweiligen Beispielabläufe.

Beachten Sie auch, dass bei den folgenden Beispielabläufen die Eingabezeilen mit dem > -Zeichen

gefolgt von einem Leerzeichen eingeleitet werden. Diese beiden Zeichen sind ausdrücklich kein

Bestandteil des eingegebenen Befehls, sondern dienen nur der Unterscheidung zwischen Ein- und

Ausgabezeilen.

Wenn Listen ausgegeben werden sollen, werden diese immer Zeilenweise ausgegeben, es sei den ein

Befehl schreibt dies explizit anders fest. Für eindeutige Identifikatoren und IDs, welche aus genau

einer 32-Bit-Ganzzahl bestehen gilt, dass sie immer aufsteigend beginnend bei 1 vergeben werden.

D.h. die erste ID wäre 1 und die zweite 2. Außerdem gilt, dass immer die nächste freie ID gewählt

wird. Als Beispiel, wenn z.B. die IDs 1,3,4,5 vergeben sind, wird als nächste ID 2 gewählt.

Hinweis: Kreuzen von Gleisen

Sie können davon ausgehen, dass der Benutzer keine Invalide-Eingaben bezüglich dem Kreuzen

von Gleisen tätig, d.h. Sie müssen nicht auf kreuzende Gleise prüfen.

Punkteingabe

Ein Punkt ist ein Tupel aus zwei 32-Bit-Ganzzahlen und beschreibt eine Koordinate in einem

2D-Raum. Das Tupel ist von „runden“ Klammern umschlossen. Die beiden Ganzzahlen werden

durch ein Komma getrennt. Die erste 32-Bit-Ganzzahl gibt die x-Koordinate ein und die zweite

32-Bit-Ganzzahl die y-Koordinate.

Eingabeformat

(<x-Koordinate>,<y-Koordinate>)

Der add track-Befehl

Fügt ein normales Gleis hinzu. Dabei wird ein Startpunkt <startpoint> und ein Endpunkt

<endpoint> gewählt. Wenn das Gleis nicht das erste Gleis ist muss immer einer der beiden Punkte

auf einem Start- oder Endpunkt eines anderen Gleis liegen. Gleise können nur waagerecht oder

senkrecht sein.

Seite 9 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Eingabeformat

add track <startpoint> -> <endpoint>

Ausgabeformat

Im Erfolgsfall wird die eindeutige ID des Gleises ausgegeben. Im Fehlerfall (z.B., kein Anschluss an ein

bisheriges Gleis) wird eine aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

Der add switch-Befehl

Fügt eine Gleisweiche hinzu. Dabei werden ein Startpunkt und zwei Endpunkte gewählt. Die

einzelnen Gleiseweichenstrecken müssen immer waagerecht oder senkrecht sein. Wenn das Gleis

nicht das erste Gleis ist, muss immer einer der drei Punkte auf einem Start- oder Endpunkt eines

anderen Gleise liegen.

Eingabeformat

add switch <startpoint> -> <endpoint1>,<endpoint2>

Ausgabeformat

Im Erfolgsfall wird die eindeutige ID des Gleises ausgegeben. Im Fehlerfall (z.B., kein Anschluss an ein

bisheriges Gleis) wird eine aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

Der delete track-Befehl

Löscht ein beliebiges Gleis (normales Gleis, Gleisweiche). Das zu löschende Gleis wird über die

<trackID> ausgewählt. Beim Löschen muss geprüft werden, dass nach dem Entfernen keine zwei

unabhängigen Strecken existieren, d.h. dass alle Gleise verbunden sind und es keine Gleisstücke

gibt, die nicht verbunden sind3. Außerdem darf kein Zug auf dem Gleis stehen.

Eingabeformat

delete track <trackID>

Ausgabeformat

Im Erfolgsfall wird OK ausgegeben. Im Fehlerfall (z.B., <trackID> nicht gefunden) wird eine

aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

3Hinweis: Lösbar z.B. mit Tiefensuche über Start- und Endknoten

Seite 10 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Der list tracks-Befehl

Gibt zeilenweise eine Liste mit allen Gleisen (Gleiseweichen und normale Gleise) aus. Die Ausgabe

beinhaltet den Typ, die eindeutige Gleis-ID <trackID> , den Startpunkt, den Endpunkt und die

Länge. Bei Gleisweichen wird die Länge nur ausgegeben, falls die Gleiseweichenstellung schon

gesetzt wurde. In diesem Fall ist die Länge, dann die Länge des Vektors vom Startpunkt zum

passenden Endpunkt der aktuellen Gleiseweichenstellung. Die Liste ist nach der Gleis-ID aufsteigend

sortiert.

Eingabeformat

list tracks

Ausgabeformat

Für normale Gleise: t <trackID> <startpoint> -> <endpoint> <length>

Für Gleisweichen: s <trackID> <startpoint> -> <endpoint1>,<endpoint2> <length>

s oder t beschreiben den Gleistyp. <trackID> ist eine 32-Bit-ganzzahlige ID. Falls noch kein

Gleis existiert wird No track exists ausgegeben. Im Fehlerfall (z.B., zusätzliche Parameter)

wird eine aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

Beispiel: list tracks-Befehl

> list tracks

t 1 (1,1) -> (5,1) 5

s 2 (5,1) -> (8,1),(5,3)

Der set switch-Befehl

Wählt für eine Gleisweiche mit der <trackID> die Gleisweichenstellung die den Startpunkt der

Gleiseweiche mit dem gewählten Endpunkt ( <point> ) verbindet.

Eingabeformat

set switch <trackID> position <point>

Ausgabeformat

Im Erfolgsfall wird OK ausgegeben. Im Fehlerfall (z.B., Punkt nicht vorhanden oder Gleis-ID nicht

gefunden) wird eine aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

Seite 11 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Der create engine-Befehl

Erstellt eine Lokomotive. <engineType> beschreibt den Typ der Lokomotive ( electrical ,

steam , diesel ). Die Baureihe wird über den Platzhalter <class> gesetzt. <name> ist der

Name der Lokomotive. <length> gibt die Länge einer Lokomotive als 32-Bit-Ganzzahl an.

<couplingFront> und <couplingBack> sind Wahrheitswerte, die angeben ob eine Kupplung

vorne und oder hinten vorhanden ist. Als Wahrheitswert kann true oder false gesetzt werden.

Dabei gibt true an, dass eine Kupplung vorhanden ist. Eine Lokomotive kann nur hinzugefügt

werden, falls noch keine Lokomotive oder Triebzug mit der gleichen ID existiert.

Eingabeformat

create engine <engineType> <class> <name> <length> <couplingFront> <couplingBack>

Ausgabeformat

Im Erfolgsfall wird die eindeutige ID der Lokomotive ausgegeben. Im Fehlerfall (z.B., falsches

Eingabeformat oder ID schon vorhanden) wird eine aussagekräftige Fehlermeldung beginnend mit

Error, ausgegeben.

Der list engines-Befehl

Gibt zeilenweise eine Liste mit allen Lokomotiven aus. Die Liste ist lexikografisch nach der der

Lok-ID sortiert.

Eingabeformat

list engines

Ausgabeformat

<trainID> <engineType> <class> <name> <length> <couplingFront> <couplingBack>

<trainID> ist die ID des Zugs zu dem die Lokomotive gehört. Falls noch keine gesetzt ist wird

none ausgegeben. <engineType> identifiziert den Type der Lokomotive. Dabei steht e für

elektrisch s für Dampf und d für Diesel. Alle anderen Platzhalter haben die selbe Bedeutung

wie beim create engine -Befehl. Falls noch keine Lokomotive existiert wird No engine exists

ausgegeben.

Seite 12 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Beispiel: list engines-Befehl

> list engines

none s T3 Emma 1 false true

1 e 103 118 1 true true

Der create coach-Befehl

Erstellt einen Wagen. <coachType> beschreibt den Typ des Wagens. Es gibt folgende Typen:

passenger , freight , special . Die drei letzten Parameter sind analog zum create engine –

Befehl.

Eingabeformat

create coach <coachType> <length> <couplingFront> <couplingBack>

Ausgabeformat

Im Erfolgsfall wird die eindeutige Wagen-ID ausgegeben. Im Fehlerfall (z.B., falsches Eingabeformat)

wird eine aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

Der list coaches-Befehl

Gibt zeilenweise eine Liste mit allen Wagen aus. Die List ist aufsteigend nach der Wagen-ID

sortiert.

Eingabeformat

list coaches

Ausgabeformat

<coachID> <trainID> <coachType> <length> <couplingFront> <couplingBack>

<coachID> ist die ID des Wagens. <trainID> ist die ID des Zuges zu dem der Wagen gehört.

Falls noch keine gesetzt ist wird none ausgegeben. <coachType> identifiziert den Type des Wagen.

Dabei steht p für Personenwagen f für Güterwagen und s für Spezialwagen. Alle anderen

Platzhalter haben die selbe Bedeutung wie beim list engine -Befehl. Falls noch kein Wagen

existiert wird No coach exists ausgegeben.

Seite 13 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Beispiel: list coaches-Befehl

> list coaches

1 none c 1 true true

2 none p 1 true false

Der create train-set-Befehl

Erstellt einen Triebzug. Die weiteren Parameter und Fehlerfälle sind beim create engine -Befehl

beschrieben

Eingabeformat

create train-set <class> <name> <length> <couplingFront> <couplingBack>

Ausgabeformat

Im Erfolgsfall wird OK ausgegeben. Im Fehlerfall (z.B., falsches Eingabeformat) wird eine aussagekräftige

Fehlermeldung beginnend mit Error, ausgegeben.

Der list train-sets-Befehl

Gibt zeilenweise eine Liste mit allen Triebzügen aus. Die Liste ist lexikografisch nach der Triebzug

ID geordnet.

Eingabeformat

list train-sets

Ausgabeformat

<trainID> <class> <name> <length> <couplingFront> <couplingBack>

Alle Platzhalter haben die selbe Bedeutung wie beim list engines -Befehl. Falls noch kein

Triebzug existiert wird No train-set exists ausgegeben.

Der delete rolling stock-Befehl

Löscht ein Rollmaterial. Das Rollmaterial wird anhand seiner eindeutigen ID identifiziert. Für einen

Wagen wird der ID ein W vorgestellt. Rollmaterial kann nur gelöscht werden, falls es in keinem

Zug verwendet wird.

Seite 14 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Eingabeformat

delete rolling stock <id>

Ausgabeformat

Im Erfolgsfall wird OK ausgegeben. Im Fehlerfall (z.B., falsches Eingabeformat) wird eine aussagekräftige

Fehlermeldung beginnend mit Error, ausgegeben.

Der add train-Befehl

Fügt dem Zug mit der 32-bit-ganzzahligen <trainID> Rollmaterial hinzu. Falls der Zug mit der

ID noch nicht existiert wird er automatisch angelegt. Die <rollingStockID> ist entweder die ID

eines Triebzugs, Lokomotive oder eines Wagens. Bei Wagens wird ein W der ID vorausgestellt. Der

Zug muss valide bezüglich der Kupplung sein, aber nicht valide bezüglich der Lokomotiven. Das

Rollmaterial wird der Reihe nach hinzugefügt, d.h. das erste einem Zug hinzugefügt Rollmaterial

ist der Kopf des Zuges (vorne) und das letzte hinzugefügte Rollmaterial stellt den Schluss des Zuges

da.

Eingabeformat

add train <trainID> <rollingStockID>

Ausgabeformat

Im Erfolgsfall wird <type> <stockID> added to <trainID> ausgegeben. <type> ist der Typ.

Folgende Werte können angenommen werden electrical engine, steam engine, diesel engine,

train-set, passenger coach, freight coach, special coach. <stockID> ist die ID des Rollmaterials,

wobei beiWagons einWdavorgestellt wird. <trainID> ist die ID des Zuges. Im Fehlerfall

(z.B., falsche Kupplung) wird eine aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

Der delete train-Befehl

Löscht den Zug mit der <ID> . Falls der Zug sich auf der Strecke befindet, wird er auch von der

Strecke entfernt.

Eingabeformat

delete train <ID>

Seite 15 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Ausgabeformat

Im Erfolgsfall wird OK ausgegeben. Im Fehlerfall (z.B., falsches Eingabeformat) wird eine aussagekräftige

Fehlermeldung beginnend mit Error, ausgegeben.

Der list trains-Befehl

Gibt zeilenweise eine Liste mit allen Zügen aus. Die Liste ist aufsteigend nach der Zug-ID sortiert.

Eingabeformat

list trains

Ausgabeformat

<trainID> <members>

Die <trainID> ist die aktuelle ID des Zuges und Members ist eine Liste der IDs des verwendeten

Rollmaterials. Wobei die einzelnen IDs durch Leerzeichen getrennt ausgegeben werden. Der ID

eines Wagens wird ein W vorausgestellt um zu kennzeichnen, dass es sich um einen Wagen handelt.

z.B. 1 103-118 W1 für den Zug 1 mit der Lokomotive 103-118 und dem Wagen 1.

Der show train-Befehl

Der Befehl gibt die grafische Repräsentation des Zuges aus. trainID ist dabei die ID des Zuges.

Eingabeformat

show train <trainID>

Ausgabeformat

Im Erfolgsfall wird die grafische Repräsentation für jedes Rollmaterial ausgegeben. Im Fehlerfall

(z.B., Zug nicht vorhanden) wird eine aussagekräftige Fehlermeldung beginnend mit Error,

ausgegeben. (siehe Beispielablauf)

Seite 16 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Der put train-Befehl

Stellt einen validen (siehe Komposition von Rollmaterial) Zug auf ein Gleis an der Position

<point> . Die initiale Bewegungsrichtung wird über die Ganzzahlen4 <x>,<y> bestimmt, die

als Richtungsvektoren dienen. Beim Aufgleisen ist zu beachten, dass der Zug valide ist und

das noch kein anderer Zug auf den benötigten Gleisen steht (Länge des Zuges beachten) und

das der Richtungsvektor zu der Richtung des Gleises beim Aufgleispunkt entspricht (oder dem

entgegengesetzten).

Eingabeformat

put train <trainID> at <point> in direction <x>,<y>

Ausgabeformat

Im Erfolgsfall wird OK ausgegeben. Im Fehlerfall (z.B., falsches Eingabeformat, oder invalider Zug)

wird eine aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

Der step-Befehl

Lässt alle Züge um <speed> -Einheiten fahren. <speed> ist eine 16-Bit-Ganzzahl. Anschließend

wird zeilenweise die Position von allen Zugköpfen ( <headPoint> ), die auf einem Gleis stehen

ausgegeben. Dies erfolgt aufsteigend sortiert nach der Zug-ID. Falls es während des Fahrbetriebs

zu einem Zusammenstoß kam werden die involvierten Züge ausgegeben. Für die Beschreibung der

Fahrt und des Zusammenstoß-Verhalten siehe Fahrbetrieb. Züge die nicht von dem Zusammenstoß

betroffen sind fahren normal weiter.

Eingabeformat

step <speed>

Ausgabeformat

Train <trainID> at <headPoint>

Zeilenweise Ausgabe von Zügen. Falls noch kein Zug auf der Strecke steht, wird OK ausgegeben. Im

Fall eines Zusammenstoßes wird Crash of train <trains> ausgegeben. Wobei <trains> eine

Liste der Zug-IDs ist, die mit Kommata getrennt sind (aufsteigend sortiert). Falls es zu mehreren

zusammenstoßen kommt, wird dies zeilenweise ausgegeben. Dabei ist zu beachten, dass die Züge sich

nicht überschneiden dürfen, d.h. wenn Zug 1 einen Zusammenstoß mit Zug 3 hat und Zug 3 einen mit

Zug 4 würde dies als ein Zusammenstoß gelten und die Ausgabe würde Crash of train 1,3,4

lauten. Falls es mehrere unabhängige Zusammenstöße gibt, wird die Ausgabe sortiert nach der

4Wählen Sie hier einen passenden Datentyp, achten Sie dabei insbesondere auf die Abhängigkeit zu Koordinaten

Seite 17 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

kleinsten Zug-ID von jedem Zusammenstoß ausgeben. Das gleiche gilt falls es zu einer Mischung

von Zusammenstößen und normaler Ausgabe kommt. Zum Beispiel Zug 11 und Zug 12 haben einen

Unfall und Zug 9 und Zug 22 auch. Jedoch Zug 10 und 8 nicht, dann würde die Ausgabe ohne

Berücksichtigung der Position lauten:

Beispiel: Zusammenstoß von mehreren Zügen

> step 2

Train 8 at (0,0)

Crash of train 9,22

Train 10 at (20,3)

Crash of train 11,12

Der exit-Befehl

Der parameterlose Befehl ermöglicht es, das laufende Programm vollständig zu beenden. Beachten

Sie, dass hierfür keine Methoden wie System.exit() oder Runtime.exit() verwendet werden

dürfen.

Eingabeformat

exit

Ausgabeformat

Im Erfolgsfall findet keine Ausgabe statt. Im Fehlerfall (z.B. bei einem falsch spezifizierten Eingabeformat)

wird eine aussagekräftige Fehlermeldung beginnend mit Error, ausgegeben.

Seite 18 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Beispielablauf

Beispielablauf: Teil 1 von 3

> add track (1,1) -> (5,1)

1>

add track (10,10) -> (10,11)

Error, track not connected to other track

> list tracks

t 1 (1,1) -> (5,1) 4

> add switch (5,1) -> (8,1),(5,3)

2>

add track (5,3) -> (8,1)

Error, creation not possible wrong position

> add track (10,1) -> (8,1)

3>

add switch (10,-3) -> (10,1),(12,-3)

4>

add track (10,-3) -> (1,-3)

5>

add track (1,-3) -> (1,1)

6

> add track (5,3) -> (10,3)

7>

add track (10,3) -> (12,3)

8>

add switch (12,3) -> (12,-3),(14,3)

9

> add track (14,-1) -> (14,3)

10

> create engine steam T3 Emma 1 false true

T3-Emma

> list engines

none s T3 Emma 1 false true

> create engine electrical 103 118 3 true true

103-118

Seite 19 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Beispielablauf: Teil 2 von 3

> list engines

none e 103 118 3 true true

none s T3 Emma 1 false true

> delete rolling stock 3

Error, rolling stock with ID 03 not found

> delete rolling stock 103-118

OK

> create coach passenger 1 true true

1>

create coach passenger 1 true true

2>

list coaches

1 none p 1 true true

2 none p 1 true true

> add train 1 W1

passenger coach W1 added to train 1

> list trains

1 W1

> show train 01

____________________

| ___ ___ ___ ___ |

| |_| |_| |_| |_| |

|__________________|

|__________________|

(O) (O)

> delete train 1

OK

> list trains

No train exits

> add train 1 T3-Emma

steam engine T3-Emma added to train 1

> add train 1 W1

passenger coach W1 added to train 1

> add train 1 W2

passenger coach W2 added to train 1

> list trains

1 T3-Emma W1 W2

Seite 20 von 21

Programmieren – Abschlussaufgabe 1 Abgabefrist: 10.03.2020, 06:00 Uhr

Beispielablauf: Teil 3 von 3

> show train 01

++ +—— ____________________ ____________________

|| |+-+ | | ___ ___ ___ ___ | | ___ ___ ___ ___ |

/———|| | | | |_| |_| |_| |_| | | |_| |_| |_| |_| |

+ ======== +-+ | |__________________| |__________________|

_|–/~\——/~\-+ |__________________| |__________________|

//// \_/ \_/ (O) (O) (O) (O)

> list engines

1 s T3 Emma 1 false true

> create train-set 403 145 4 true true

403-145

> add train 2 403-145

train-set 403-145 added to train 2

> set switch 4 position (10,1)

OK

> step 1

Error, position of switches not set

> set switch 2 position (8,1)

OK

> set switch 9 position (12,-3)

OK

> step 1

OK

> put train 1 at (1,1) in direction 1,0

OK

> put train 2 at (10,-2) in direction 0,1

OK

> step 2

Train 1 at (3,1)

Train 2 at (10,0)

> step -2

Train 1 at (1,1)

Train 2 at (10,-2)

> step 2

Train 1 at (3,1)

Train 2 at (10,0)

> step 3

Train 1 at (6,1)

Train 2 at (8,1)

> step 1

Crash of train 1,2

> put train 1 at (1,1) in direction 0,-1

OK

> exit

Seite 21 von 21

Leave a Reply

Your email address will not be published. Required fields are marked *