Beispiel #1114

"dekomp" : Das Runlength Verfahren (dekomprimieren)

Kategorie: String
Klasse: schwer
Eingabe: String
Ausgabe: String

Aufgabenstellung:
Ihr Programm soll einen String einlesen, der nach dem Runlength-Verfahren codiert 
ist, diesen decodieren und das Ergebnis dieser Dekomprimierung ausgeben. 
Diese Codierung funktioniert wie folgt: Zeichen, die im String wiederholt 
vorkommen, werden durch eine nachgestellte Ziffer "vervielfacht". Dazu wird 
zwischen zwei "Betriebsarten" unterschieden: Single-Modus
Multi-Modus
Im Singlemodus werden die Zeichen so übernommen, wie sie im Eingabestring 
stehen; im Multimodus hingegen durch das Nachstellen einer Ziffer, die die 
Häufigkeit angibt, vervielfacht. Der Übergang zwischen Single- und Multimodus 
wird durch das Trennzeichen ' (einfaches Hochkomma) markiert; wenn dieses 
Zeichen im Eingabestring vorkommt, so wird dies durch Verdoppelung '' (zwei 
einfache Hochkomma hintereinander) dargestellt. Am Anfang jedes Datensatzes ist das Programm im Singlemodus; der Multimodus 
wird nur verwendet, wenn tatsächlich mehrere gleiche Zeichen hintereinander
auftreten. Wenn mehrere Gruppen gleicher Zeichen unmittelbar aufeinanderfolgen,
 so wird nur einmal in den Multimodus umgeschalten und erst beim nächsten 
"Einzelgänger" zurückgeschalten. 
Die einzelnen Stringzeichen darf keine Ziffern enthalten, da diese dieses
einfache Verfahren der Kodierung stören. 
*****************************************************************
Lösung:

Meine Lösung besteht aus einer generischen State-Machine-Klasse,
die durch eine Ableitung in der Haupt-Programmklasse spezialisiert
wird, um die String-Dekomprimierung durchzuführen.

Diese State-Machine-Klasse enthält als Unterklasse die abstrakte
State-Klasse, welche einen Zustand des Automaten darstellt.
Jeder Zustand enthält die Information:

*) ob er verlassen werden kann (=ob er ein Stop-Zustand ist)
*) die Funktion processInput, die alle Zustandsübergänge aus diesem
   Zustand heraus verarbeitet
*) die Funktion enterState, die aufgerufen wird, wenn dieser Zustand
   aus einem anderen Zustand heraus betreten wird
*) die Funktion exitState, die aufgereufen wird, wenn dieser Zustand
   zu einem anderen hin verlassen wird

Beim Ableiten der State-Klasse muss mindestens die processInput-Funktion
überschrieben werden !

Das Array aller States der abgeleiteten State-Machine ist static, um
bei einer Verwendung mehrerer State-Machines mit den gleichen States
Speicher zu sparen. Bei der Initialisierung im Konstruktor muss darauf
allerdings Rücksicht genommen werden (siehe Kommentar)

Die Initialisierung der States der abgeleiteten State-Machine wird im
Konstruktor durch eine Array-Initialisierung mit anonym abgeleiteten
Klassen durchgeführt.

Die Eingaben für die Zustandsübergänge werden durch eine spezielle Klasse,
die in der Hauptklasse definiert wird, dargestellt (smInput).
Ebenso verhält es sich mit dem Datenspeicher der State-Machine (smOutput),
nämlich dem bisher dekomprimierten String und dem zuletzt gelesenen 
Character-Input.

Klassen-Dokumentation zu dem Projekt kann mittels dem Befehl
javadoc -use -package dekomp.java
erstellt werden.

Peter Schüller
e0125596@student.tuwien.ac.at