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