Beispiel Angabe

Kürzel:asciishop-A09-PP
Name:AsciiShop, Runde#9
Kette:Asciishop PP
Kategorie:Bildverarbeitung

Mitgelieferte Datei(en): asciishop-A09-bonus1.o2, asciishop-A09-bonus1.o1, asciishop-A09-bonus1.i2, asciishop-A09-bonus1.i1
Abzugebende Datei(en): ClearFactory.java, BinaryOperation.java, FactoryException.java, LoadOperation.java, AsciiImage.java, AsciiPoint.java, LoadFactory.java, AsciiShop.java, FilterOperation.java, ReplaceOperation.java, ClearOperation.java, Operation.java, Factory.java, FilterFactory.java, OperationException.java, BinaryFactory.java, AverageOperation.java, ReplaceFactory.java, MedianOperation.java
Optional abzugebende Datei(en): AsciiStack.java, AsciiStackNode.java, ReplicateBlockGenerator.java, XBlockGenerator.java, BlockGenerator.java, CircularBlockGenerator.java, GrowRegionFactory.java, LineOperation.java, LineFactory.java, TransposeOperation.java, SymmetricBlockGenerator.java, GrowRegionOperation.java, TransposeFactory.java, FillFactory.java, FillOperation.java
Ausführbar: AsciiShop

Die Klasse AsciiShop ist zu erstellen und soll eine ausführbare Klasse sein und muss daher die public static void main(String[] args) Methode beinhalten. Ihr Programm wird automatisch auf Korrektheit überprüft. Die Überprüfung erfolgt durch die Ausführung der als ausführbar bezeichneten Klasse (AsciiShop).

Kurzbeschreibung:

Das Programm erstellt im ersten Schritt ein leeres Bild, auf dem dann unterschiedliche Operationen ausgeführt werden können. Neben den in der Vorrunde implementierten Operationen, steht noch ein weiterer Filter zur Verfügung.

Lernziele:

Aufgabenstellung Klassen und Methoden Ein- und Ausgabedaten Bewertung und Kriterien
Hinweise FAQ Fehlerbehandlung Testen

 

Aufgabenstellung:

In den beiden vorhergehenden Übungsrunden wurde Schritt für Schritt der Code besser strukturiert und so übersichtlicher und leichter wartbar gemacht. In dieser Runde soll daraus Nutzen gezogen und neue Operationen hinzugefügt werden. Bei dem neuen Filter steht wiederum Coderefaktorisierung durch Vererbung im Mittelpunkt.

Erzeugen des Bildes

Das Erzeugen eines neuen Bildes erfolgt, wie in Runde 7 spezifiziert, mit Hilfe des Befehls create, der neben den beiden Parametern Breite und Höhe des zu erzeugenden Bildes auch den Zeichensatz des Bildes erwartet. Dies ist ein String, der alle im Bild erlaubten Zeichen beinhaltet. Der Zeichensatz gibt außerdem eine Ordnung der Zeichen vor, so ist das erste Zeichen das dunkelste und das letzte das hellste. Jedes Zeichen stellt somit eine Farbe dar. Das hellste Zeichen wird außerdem als Farbe für ein neu erzeugtes Bild sowie beim Löschen des Bildinhaltes bei Eingabe des Befehls clear verwendet.

Der create Befehl muss der erste eingegebene Befehl sein. Sie dürfen davon ausgehen, dass sowohl die eingegebene Breite und Höhe als auch der Zeichensatz gültig sind und müssen daher diesen Fehlerfall nicht behandeln.

Das leere Bild kann mit Daten gefüllt werden. Dazu stehen verschiedene Befehle zur Verfügung, darunter der Befehl load. Dieser Befehl (und damit das Einlesen von Bildern von der Standardeingabe) ist für ein gültiges Bild nicht zwingend erforderlich.

Befehle und Operationen am Bild

Die folgenden Befehle sind zulässig, neue und veränderte Befehle sind farblich hervorgehoben, nicht mehr geforderte durchgestrichen:

Alle hier aufgeführten Befehle können in beliebiger Reihenfolge auftreten. So kann zum Beispiel nach create erst print und danach load folgen. Die genannten Befehle binary, clear, filter, load und replace haben entsprechende Klassen, die die Funktionalität implementieren.

Filter

Neben dem bestehenden Medianfilter soll als weiterer Filter der Mittelwertfilter implementiert werden. Beiden gemeinsam ist das Arbeiten auf einem Block einer bestimmten Größe. Diese Charakteristik erfordert, dass in beiden Operationen mit entsprechenden Schleifen über das Bild iteriert wird, dann für jeden Pixel der entsprechende jeweilige Block bestimmt und daraus das Ergebnis berechnet wird. Bis auf die Berechnung des Ergebnisses sind beide Filter gleich. Naheliegend ist hier diese gemeinsame Funktionalität in eine abstrakte Basisklasse zusammenzufassen.

Die Aufteilung erfolgt so: Diese Basisklasse durchläuft das Bild und erstellt für jeden Pixel den Block der umgebenden Pixel. Die konkrete Implementierung der Filterung wird in den konkreten Klassen durchgeführt, in diesem Fall die Berechnung des Mittelwerts oder des Medians, jeweils ausgehend vom vorher erstellten Block.

Übungsmöglichkeiten

Sie können zu Übungszwecken, nach dem Muster der anderen Operationen, Klassen für die Befehle grow, line, transpose, sowie fill entsprechend der Spezifikationen der Vorrunden implementieren. Sie können diesen Klassen auch die entsprechenden Befehle zuordnen, dies wird jedoch nicht getestet.

 

Bonusaufgaben

Bonusaufgaben werden nicht im Online-System getestet, die Beurteilung erfolgt erst während des Abgabegesprächs.

Erweiterte Filteroptionen (+1.5 Punkte)

Aufbauend auf dem geforderten Median- und dem Average-Filter sollen mehr Variationen ermöglicht werden. So soll als weiteres Parameter zuerst die Größe des Filter angegeben werden können und als zweites die Randbehandlung. Als Größenangabe sind ungerade Zahlen größer 1 zugelassen. Wird keine Größe angegeben, so soll 3 angenommen werden. Wird eine unzulässige Größe angegeben, so liegt ein Fehlerfall vor.

Als Randbehandlungen sind neben dem bereits implementierten ‘x’ auch noch ‘circular’, ‘replicate’ und ‘symmetric’ zulässig. Wird keine Randbehandlung angegeben, so soll das Standardverfahren (‘x’) angewandt werden. Wird eine unbekannte Randbehandlungsmethode angegeben, so liegt ein Fehlerfall vor. Um die entsprechenden Parameter einzulesen, dürfen Sie davon ausgehen, dass der gesamte filter-Befehl alleine und vollständig in einer Zeile steht. Es können sowohl Größe als auch Randbehandlung angegebenen werden, jedoch auch einer oder beide Parameter fehlen.
Randbehandlung: X Randbehandlung (X)
Für die hier dreizehn Blockpunkte in dem über das Bild hinausragenden Bereich Bereich (farbig hinterlegt) wird explizit die Hintergrundfarbe, in diesem Fall ‘.’, verwendet.
Randbehandlung: Replicate Randbehandlung (Replicate)
Hierbei werden die am Rand befindlichen Pixel über den Bildrand hinweg fortgesetzt. Einige korrespondierende Pixel sind farbig hervorgehoben.
Randbehandlung: Circular Randbehandlung (Circular)
Hierbei wird quasi das Bild mehrfach nebeneinander gelegt, direkt an die letzte Spalte schließt die erste Spalte an und analog für die Zeilen. Einige korrespondierende Pixel sind farbig hervorgehoben.
Randbehandlung: Symmetric Randbehandlung (Symmetric)
Bei dieser Randbehandlung wird das Bild entlang der Kanten gespiegelt. Einige korrespondierende Pixel sind wiederum farbig hervorgehoben.


Erstellen Sie für jede der vier Randbehandlungsmethoden eine eigene Klasse (XBlockGenerator, CicularBlockGenerator, ReplicateBlockGenerator und SymmetricBlockGenerator). Alle diese Klassen sollen eine Methode public int[] getBlock(AsciiImage img, int x, int y) zur Verfügung stellen, die den Block für die Stelle (x,y) in Form eines eindimensionalen int-Arrays zurückgibt. Dieses Array umfasst die Helligkeitswerte der Pixel des Blocks Zeile für Zeile. Jede dieser Klassen soll auch einen Konstruktor haben, dem die Größe des quadratischen Blocks übergeben werden kann.

Erzeugen Sie außerdem ein Interface oder eine abstrakte Basisklasse BlockGenerator, von der die drei oben genannten Klassen abgeleitet sind. Passen Sie die Filter-Operationen entsprechend an, sodass im Konstruktor eine konkrete BlockGenerator Instanz übergeben werden kann. Implementieren Sie die Block Generatoren so, dass Sie doppelten Code vermeiden. Dafür kann es sinnvoll sein BlockGenerator als abstrakte Basisklasse auszuführen und weitere Methoden einzuführen.

Die Klasse FilterFactory ist für das Einlesen der Parameter und für das Erzeugen der konkreten BlockGenerator Instanzen, sowie der konkreten FilterOperation Instanzen zuständig. Überprüfen Sie hier auch die spezifizierten Fehlerfälle und geben Sie im Fehlerfall "INPUT MISMATCH" aus und brechen Sie die weitere Verarbeitung ab.

 

Klassen und Methoden:

Die folgende Aufzählung umfasst geforderte Methoden, neue, veränderte und geerbte Methoden sind farblich hervorgehoben, gegenüber der Vorrunde nicht mehr geforderte durchgestrichen. Sie können nach Bedarf Hilfsmethoden und Methoden für freiwillige Aufgaben (Bonusaufgaben, Übungsaufgaben) hinzufügen. Achten Sie auf die korrekte Datenkapselung. Insbesondere sollen Sie sinnvolle Zugriffsmodifikatoren für Variablen (und Methoden) verwenden.

AsciiShop
Diese Klasse ist ausführbar und beinhaltet daher die main-Methode. Sie verarbeitet die Eingaben, erzeugt das AsciiImage und gibt das Ergebnis aus. Methoden dieser Klasse lesen direkt von System.in ein und geben direkt auf System.out aus.
public static void main(String[] args)
liest die Daten und Befehle ein und gibt das Ergebnis aus.
AsciiImage
Diese Klasse repräsentiert ein ASCII-Bild, es speichert die Zeichen des Bildes und bietet entsprechende Methoden zur Modifikation und zur Abfrage von Eigenschaften, wie beispielsweise Höhe und Breite.
public AsciiImage(int width, int height, String charset)
erzeugt ein ASCII-Bild der spezifizierten Größe und mit dem angegebenen Zeichensatz. Anfangs sind alle Pixel auf den Wert hellsten Wert des Zeichensatzes (also dem letzten Zeichen des Strings) gesetzt. Überprüfen Sie an diese Stelle ob Breite und Höhe beide größer 0 sind und werfen Sie andernfalls eine IllegalArgumentException. Werfen Sie auch eine IllegalArgumentException, falls das charset ein Zeichen doppelt enthält oder gar keine Zeichen umfasst.
public AsciiImage(AsciiImage img)
ist ein Kopierkonstruktor. Er erzeugt ein neues AsciiImage mit dem gleichen Inhalt, wie das übergebene Bild.
public String getCharset()
gibt den Zeichensatz des Bildes als String zurück.
public int getHeight()
gibt die Höhe des Bildes (die Anzahl der Zeilen) zurück.
public char getPixel(int x, int y)
gibt das an den übergebenen Koordinaten/Indizes gespeicherte Zeichen zurück. Überprüfen Sie an dieser Stelle, ob die Indizies gültig sind und werfen Sie andernfalls eine IndexOutOfBoundsException.
public char getPixel(AsciiPoint p)
gibt, analog zur Methode public char getPixel(int x, int y), das Zeichen, an der durch p spezifizierten Stelle, zurück. Überprüfen Sie an dieser Stelle, ob die Indizies gültig sind und werfen Sie andernfalls eine IndexOutOfBoundsException.
public ArrayList<AsciiPoint> getPointList(char c)
gibt eine ArrayList aller Pixel eines bestimmten Zeichens zurück. In dieser ArrayList sind Objekte vom Typ AsciiPoint, sollte es keine Punkte mit dem angegebenen Zeichen geben, so soll eine leere Liste zurückgegeben werden. Verwenden Sie diese Methode überall dort, wo sie alle Pixel mit einem bestimmten Zeichen benötigen.
public int getWidth()
gibt die Breite des Bildes (die Länge der Zeilen) zurück.
public void setPixel(int x, int y, char c)
speichert an den übergebenen Koordinaten/Indizes das übergebene Zeichen. Überprüfen Sie an dieser Stelle, ob die Indizies gültig sind und werfen Sie andernfalls eine IndexOutOfBoundsException. Werfen Sie eine IndexOutOfBoundsException, falls das Zeichen c nicht dem Zeichensatz des Bildes entspricht (sprich nicht im charset enthalten ist).
public void setPixel(AsciiPoint p, char c)
speichert, analog zur Methode public char setPixel(int x, int y, char c), das übergebene Zeichen an der durch den p spezifizierten Stelle. Überprüfen Sie an dieser Stelle, ob die Indizies gültig sind und werfen Sie andernfalls eine IndexOutOfBoundsException. Werfen Sie eine IndexOutOfBoundsException, falls das Zeichen c nicht dem Zeichensatz des Bildes entspricht (sprich nicht im charset enthalten ist).
public String toString()
gibt eine lesbare Darstellung des ASCII-Bildes zurück. Die einzelnen Zeilen sollen dabei durch Zeilenumbrüche ‘\n’ getrennt werden.
AsciiPoint
Diese Klasse repräsentiert einen Punkt, spezifiziert durch zwei ganzzahlige Koordinaten. Diese Klasse ist unveränderlich (immutable), sprich die Koordinaten sollen nachträglich nicht mehr veränderbar sein. Stellen Sie dies durch den Einsatz geeigneter Modifier sicher.
public AsciiPoint(int x, int y)
erzeugt einen Punkt mit den angegebenen Koordinaten.
public int getX()
gibt die x-Koordinate des Punktes zurück.
public int getY()
gibt die y-Koordinate des Punktes zurück.
public String toString()
gibt eine lesbare Darstellung des Punktes in der Form (x,y) zurück.
AsciiStack
Diese Klasse implementiert einen Stack (vgl. Stapelspeicher), der seine Größe dynamisch anpasst. Er kann eine beliebige Anzahl an AsciiImage-Objekten speichern, wobei der Zugriff immer nur auf das oberste Element möglich ist. Sie können eine ihrer Implementierung dieser Klasse (ggfs. zusammen mit AsciiStackNode) aus den Vorrunden nutzen oder die vorgefertigte Klasse java.util.Stack verwenden.
public AsciiStack()
initialisiert den leeren Stack.
public boolean empty()
überprüft, ob zumindest ein Element am Stack liegt.
public AsciiImage pop()
gibt das oberste Element am Stack zurück und entfernt dieses. Liegt kein Element am Stack, so soll null zurückgegeben werden. Sind nach dem Entfernen mehr als increment Plätze leer, so soll der Stack um increment verkleinert werden. Jedoch soll der Stack nie kleiner als increment sein, sprich wenn alle Elemente entfernt wurden, soll die Kapazität des Stacks gleich increment sein.
public AsciiImage peek()
gibt das oberste Element am Stack zurück ohne es zu entfernen. Liegt nichts am Stack, so soll null zurückgegeben werden.
public void push(AsciiImage img)
legt ein AsciiImage oben auf den Stack. Ist der Stack zu diesem Zeitpunkt voll, so soll der Stack um increment vergrößert werden um so das Bild speichern zu können.
public int size()
gibt die Anzahl der im Stack belegten Plätze zurück.

Die folgenden Klassen dienen zur Umsetzung bestimmter Bildoperationen bzw. der Erzeugen dieser. Die Bildoperationen implementieren das Interface Operation, die erzeugenden Klassen das Interface Factory, entsprechend der weiter unten beschriebenen Interfaces.

AverageOperation extends FilterOperation
Diese Klasse glättet ein Bild mit einem 3x3-Mittelwertfilter.
public AverageOperation()
erzeugt eine neue AverageOperation.
public AsciiImage execute(AsciiImage img)
geerbt von FilterOperation
public int filter(int[] values)
führt mit dem übergebenen Block den Mittelwertfilter aus. Dafür wird das arithmetische Mittel (vgl. Arithmetisches_Mittel) der Helligkeitswerte bestimmt. Das Ergebnis wird mathematisch gerundet und als Ergebnis für diesen Block zurückgegeben.
BinaryFactory implements Factory
Diese Factory erzeugt BinaryOperations.
public BinaryFactory()
erzeugt eine neue BinaryFactory.
public Operation create(Scanner scanner) throws FactoryException
liest mit dem Scanner das Schwellwert Zeichen ein, erzeugt damit eine neue BinaryOperation und gibt diese zurück. Tritt beim Einlesen des Zeichens ein Fehler auf, so wird eine FactoryException geworfen.
BinaryOperation implements Operation
Diese Klasse wandelt ein AsciiImage in ein Binärbild um.
public BinaryOperation(char threshold)
erzeugt eine neue BinaryOperation mit dem entsprechenden Schwellwert.
public AsciiImage execute(AsciiImage img) throws OperationException
gibt ein neues AsciiImage zurück, das das Binärbild des übergebenen AsciiImage ist. Zur Umwandlung in ein Binärbild werden alle Zeichen, die im Zeichensatz des Bildes vor dem Schwellwert kommen, auf das dunkelste Zeichen gesetzt, alle Zeichen ab dem Schwellwert werden auf das hellste Zeichen gesetzt. Sollte das Schwellwertzeichen nicht im Zeichensatz des AsciiImage vorkommen, so wird eine OperationException geworfen.
ClearFactory implements Factory
Diese Factory erzeugt ClearOperations.
public ClearFactory()
erzeugt eine neue ClearFactory.
public Operation create(Scanner scanner)
erzeugt eine neue ClearOperation und gibt diese zurück.
ClearOperation implements Operation
Diese Klasse setzt alle Pixel des Bildes auf das hellste Zeichen.
public ClearOperation()
erzeugt eine neue ClearOperation.
public AsciiImage execute(AsciiImage img)
gibt ein neues AsciiImage zurück, das dem übergebenen AsciiImage entspricht, wobei alle Zeichen auf das hellste Zeichen, sprich dem letzten Zeichen im Zeichensatz des Bildes, gesetzt sind.
FilterFactory implements Factory
Diese Factory erzeugt MedianOperations und AverageOperations.
public FilterFactory()
erzeugt eine neue FilterFactory.
public Operation create(Scanner scanner) throws FactoryException
liest den nächsten String ein und gibt, je nach Parameter, eine neue MedianOperation (bei ‘median’) oder eine neue AverageOperation (bei ‘average’) zurück. Ist der Typ unbekannt, so wird eine FactoryException geworfen.
FilterOperation implements Operation
Diese abstrakte Klasse beinhaltet die Funktionalität, um das Bild zu durchlaufen und für jeden Pixel den benötigten Block an Nachbarpixeln zu bestimmen. Sie bietet mit der Methode filter eine Schablone (Template) für die konkreten Filter Operationen.
public FilterOperation()
Konstruktor der FilterOperation.
public AsciiImage execute(AsciiImage img)
führt den Blockfilter aus. Diese Methode muss von abgeleiteten Klassen nicht überschrieben werden. Die Methode durchläuft das Bild, bestimmt für jeden Pixel den Block an Nachbarpixeln und ruft damit dann die Methode filter auf. Das Ergebnis dieser Methode wird dann als neuer Pixel an der aktuellen Stelle gesetzt.
public abstract int filter(int[] values)
muss von den abgeleiteten Klassen implementiert werden. Sie führt die eigentliche Logik des Filters durch. Das übergebene Array umfasst die Helligkeitswerte der Pixel im Block Zeile für Zeile. Diese Methode gibt den berechneten Helligkeitswert für den neuen Pixel zurück.
LoadFactory implements Factory
Diese Factory erzeugt LoadOperations.
public LoadFactory()
erzeugt eine neue LoadFactory.
public Operation create(Scanner scanner) throws FactoryException
liest den eof-String ein und übergibt in einem String alle Zeilen bis zum abschließenden eof-String durch Zeilenumbrüche getrennt an den Konstruktor der LoadOperation. Tritt beim Einlesen ein Fehler auf (eof fehlt), so wird eine FactoryException geworfen.
LoadOperation implements Operation
Lädt zeilenweise vorliegende Bilddaten in ein AsciiImage.
public LoadOperation(String data)
erzeugt eine neue LoadOperation mit den entsprechenden Bilddaten. Diese Bilddaten liegen als String vor, wobei die Bildzeilen durch Zeilenumbrüche (‘\n’) getrennt sind.
public AsciiImage execute(AsciiImage img) throws OperationException
gibt ein neues AsciiImage zurück, das von Größe und Zeichensatz dem übergebenen AsciiImage entspricht und in das die Daten geladen wurden. Tritt beim Laden ein Fehler auf (zu wenige oder zu viele Daten bzw. ungültige Zeichen), so wird eine OperationException mit einer entsprechenden Fehlermeldung geworfen.
MedianOperation extends FilterOperation
Diese Klasse glättet ein Bild mit einem 3x3-Medianfilter (vgl. Rangordnungsfilter#Medianfilter).
public MedianOperation()
erzeugt eine neue MedianOperation.
public AsciiImage execute(AsciiImage img)
geerbt von FilterOperation
public int filter(int[] values)
führt mit dem übergebenen Block den Medianfilter aus. Die Pixel des Blocks werden nach ihrem Helligkeitswert sortiert. Der Median (also das in der sortierten Liste in der Mitte stehende Zeichen) für diesen Block wird als Ergebnis zurückgegeben.
ReplaceFactory implements Factory
Diese Factory erzeugt ReplaceOperations. Diese Klasse wurde zu Anschauungszwecken vollständig implementiert in Runde 8 zur Verfügung gestellt, sie können diese Klasse jedoch auch selber implementieren.
public ReplaceFactory()
erzeugt eine neue ReplaceFactory.
public Operation create(Scanner scanner) throws FactoryException
liest mit Hilfe des Scanners zwei Zeichen ein und gibt eine damit initialisierte neue ReplaceOperation zurück. Tritt beim Einlesen ein Fehler (zu wenig Parameter), so wird eine FactoryException geworfen.
ReplaceOperation implements Operation
Diese Klasse ersetzt alle Vorkommnisse eines Zeichens in einem Bild durch ein anderes Zeichen. Diese Klasse wurde zu Anschauungszwecken vollständig implementiert in Runde 7 zur Verfügung gestellt, sie können diese Klasse jedoch auch selber implementieren.
public ReplaceOperation(char oldChar, char newChar)
erzeugt eine neue ReplaceOperation die alle Zeichen oldChar durch newChar ersetzt.
public AsciiImage execute(AsciiImage img) throws OperationException
gibt ein neues AsciiImage zurück, in dem alle Vorkommnisse des Zeichen oldChar durch das Zeichen newChar ersetzt worden sind. Falls das neue Zeichen nicht im Zeichensatz des AsciiImage enthalten ist, soll eine neue OperationException mit entsprechender Fehlermeldung geworfen werden.

Interfaces und Exceptions.

FactoryException extends Exception
Diese Klasse erweitert Exception und wird zum Behandeln aller Fehlerfälle, die in einer Factory, also beim Einlesen von Parametern oder dem Erzeugen eines Befehls, auftreten, eingesetzt. Sie können bei Bedarf auch noch weitere Konstruktoren definieren.
public FactoryException()
erzeugt eine leere FactoryException. Ruft den entsprechenden Super-Konstruktor in der Klasse Exception auf.
public FactoryException(String message)
erzeugt eine FactoryException mit der entsprechenden Fehlerbeschreibung. Ruft den entsprechenden Super-Konstruktor in der Klasse Exception auf.
Factory
Dieses Interface wird von allen Factories implementiert und definiert die Schnittstelle über die eine Operation bezogen werden kann. Bei Bedarf können Sie dies statt als Interface auch als abstrakte Klasse gestalten. Die Aufgabe der Factory ist es bei Bedarf Eingaben einzulesen und dann eine neue Operation zu erzeugen.
public Operation create(Scanner scanner) throws FactoryException
erzeugt ein neues Objekt vom Typ Operation. Welche konkrete Operation erzeugt wird, hängt von der implementierenden Factory ab. Bei Bedarf liest diese Methode vom übergebenen Scanner Parameter ein. Sollten Parameter fehlen oder von einem falschen Typ sein, so soll eine FactoryException geworfen werden.
OperationException extends Exception
Diese Klasse erweitert Exception und wird zum Behandeln aller Fehlerfälle, die beim Ausführen von Operationen auftreten, eingesetzt. Sie dürfen bei Bedarf auch noch weitere Konstruktoren definieren.
public OperationException()
erzeugt eine leere OperationException. Ruft den entsprechenden Super-Konstruktor in der Klasse Exception auf.
public OperationException(String message)
erzeugt eine OperatiOperationException mit der entsprechenden Fehlerbeschreibung. Ruft den entsprechenden Super-Konstruktor in der Klasse Exception auf.
Operation
Dieses Interface wird von allen Operationen implementiert und definiert eine Methode, die zum Ausführen der Operation dient. Dieses Interface wird zur Verfügung gestellt.
public AsciiImage execute(AsciiImage img) throws OperationException
führt die Operation aus und gibt das Ergebnis als neues AsciiImage zurück. Das übergebene AsciiImage wird von der Methode nicht verändert. Mögliche Parameter der Operation müssen im Konstruktor übergeben werden. Sollte beim Ausführen der Operation ein Fehler auftreten, so soll eine OperationException geworfen werden.

 

Hinweise:

Beachten Sie die allgemeinen Hinweise zur Installation und zur Ein-/Ausgabe, sowie zur Abgabe und zur Beurteilung in den FAQ.

Wenn Sie Fragen zur Implementierung oder auch zu Java haben, können Sie das Informatik-Forum nutzen. Im Rahmen der wöchentlichen Laborien stehen Tutoren für Fragen zur Verfügung.
Informatik-Forum Laborien

 

Eingabedaten:

Der erste Befehl muss create, gefolgt von Breite und Höhe sowie dem Zeichensatz des Bildes sein. Danach können in beliebiger Reihenfolge beliebige viele der oben definierten Befehle folgen. Beachten Sie jedoch, dass der create Befehl nur einmal (nämlich als erster Befehl) auftreten darf. Sie dürfen davon ausgehen, dass die mittels load eingelesenen Bilddaten keine Leerzeichen enthalten. Sie können weiters davon ausgehen, dass die gesamte Eingabe nicht leer ist.

Ausgabedaten:

Bei jedem Aufruf von print soll das Bild korrekt formatiert und von einer Leerzeile gefolgt, ausgegeben werden. Wird undo eingegeben, so wird, falls der Stack leer ist, "STACK EMPTY" ausgegeben. Im Gegensatz zur vorherigen Runde, wird die Stack Belegung nun nicht mehr ausgegeben.

Fehlerbehandlung:

Geben Sie "INPUT MISMATCH" aus und brechen Sie die weitere Verarbeitung ab, falls einer der folgenden Fehler auftritt:

Geben Sie auch "INPUT MISMATCH" aus, falls bei der Erzeugung eines Befehls eine FactoryException auftritt. Geben Sie bei allen Fehlern, die in einer Operation Klasse ausgelöst werden (also bei denen eine OperationException geworfen wird), "OPERATION FAILED" aus und brechen Sie die weitere Verarbeitung ab. Dies sind insbesondere folgende Fälle:

Geben Sie "UNKNOWN COMMAND" aus und brechen Sie die weitere Verarbeitung ab, falls einer der folgenden Fehler auftritt:

Testen:


In
create 10 4 #W*+.
replace . #
filter average
print
Out
*WWWWWWWW*
W########W
W########W
*WWWWWWWW*
Beschreibung Auf ein Bild mit einheitlicher Farbe wird der Mittelwertfilter angewandt. In den Ecken und am Rand wird der Einfluss der Randbehandlung sichtbar.


In
create 30 27 #WMBRXVYIti+=;:,.
load end
============,.V+.;============
===========;.X##..;===========
===========..####..===========
==========,.##M###.:==========
=========;.R##WW##=.;=========
=========..##MWMW##,.=========
========:.I##WWMWW#W.,========
=======;.:##WWWWWW##I.;=======
=======:.W########M##..=======
=======.:############V.;======
=======.####...,.,M###,.======
======,.###:..+++;,B..#.;=====
=====;.#;.#i+YXVVY:#V.#..:====
====:..#..##.RYYIt##...#=.,===
==;..+#;...#######W....##W..:=
:..t###......iVV=....,.+#iM#..
.B#i,#..,,..........,,..#,..#I
V#...#..,,,,,.,,,,:,,,..R#..V#
;#+.i#..,,,,,,,,,.,,,,,.iX.X#,
.i#=MV..,,,,.,,,,,,.,,,..###..
,.t##..,,,,,,,,,,,,,,:,..V##.;
..M#M..,,,,.,.,,,,,,,:,,.=##..
i###M..,...........,,:,,..###.
.####........=II;.....,,.;##R.
,...#....X####MW###B.....Wi..:
==;,##,###;........##i...#;,==
===,.IVi..,;======:..B#B#t.;==
end
binary =
print
filter average
print
Out
..............##..............
.............###..............
.............####.............
............######............
...........#######............
...........########...........
..........##########..........
..........###########.........
.........############.........
.........#############........
........####......####........
........###...###..#..#.......
.......#..########.##.#.......
.......#..##.#######...#......
.....##....########....###....
...####......###.......#####..
.###.#..................#...##
##...#..................##..##
.##.##..................##.##.
.##.##...................###..
..###....................###..
..###.....................##..
#####.....................###.
.####.........##..........###.
....#....###########.....##...
....##.###.........###...#....
.....###.............#####....

............:+Yt=.............
............=YMRt:............
...........:tR#MX+:...........
..........:+XM##MY=...........
..........=YM####Rt:..........
.........:tR#####MX+:.........
.........=YM######MX+:........
........:tR########MY=........
........=YM#########Rt:.......
.......:tR#MRXXXXRM#MY=.......
.......=YMMXttYXYYXRRY+:......
......:+YRRXttYXYtYXXY+=......
......=+tYXXYXM#MXXYt+++:.....
....:=t+==YRMM###MRY+=+tt=:...
..:=tYY+::+tXR#MRXY+:.+YRYt=:.
:=ttXXY=..:=tYXYt+=:..=YRXt++=
+tYtXYt:....:=+=:.....:tXXttYt
tXXtYt+................+YY+tXY
tXYtYY+................=YXXYY+
=YXRXY=................:tXMXt:
:tXMXt:.................=YMX+.
=YR#X+..................:tRRt:
+XM#X+.......:==:........+XMY=
+YXRY+..:=+++tYYt++=:...:tXRt=
:=+YYt==ttt++tYYt+ttt=:.=tYt=:
...=tYYtYtt+++++++ttYtt+YYt:..
...:+tYtt=:.......:=ttt+t+=...
Beschreibung Das eingelesene Bild wird in ein Binärbild umgewandelt und dieses mit einem Mittelwertfilter geglättet.


Bemerkung: Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:
java AsciiShop < asciishop-A09-PP.i1 > asciishop-A09-PP.out1

Das erzeugte File asciishop-A09-PP.out1 können Sie dann mit dem mitgelieferten Outputfile asciishop-A09-PP.o1 vergleichen.