Kürzel: | asciishop-A10-PP |
Name: | AsciiShop, Runde#10 |
Kette: | Asciishop PP |
Kategorie: | Bldverarbeitung |
Mitgelieferte Datei(en): Metric.java
Abzugebende Datei(en): BinaryOperation.java, ClearFactory.java, LoadOperation.java, FactoryException.java, AsciiPoint.java, AsciiImage.java, AsciiShop.java, LoadFactory.java, SaveOperation.java, SaveFactory.java, SearchOperation.java, SearchFactory.java, BinaryFactory.java, AverageOperation.java, FilterFactory.java, OperationException.java, Factory.java, Operation.java, CreateFactory.java, CreateOperation.java, UniqueCharsMetric.java, PixelCountMetric.java, MetricSet.java, MedianOperation.java, FilterOperation.java, ClearOperation.java, ReplaceFactory.java, ReplaceOperation.java
Optional abzugebende Datei(en): FillFactory.java, TransposeFactory.java, FillOperation.java, GrowRegionFactory.java, CircularBlockGenerator.java, BlockGenerator.java, XBlockGenerator.java, ReplicateBlockGenerator.java, AsciiStackNode.java, AsciiStack.java, GrowRegionOperation.java, SymmetricBlockGenerator.java, LineFactory.java, TransposeOperation.java, LineOperation.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).
Zusätzlich zur den bisherigen Operationen des AsciiShop soll es nun auch möglich sein Bilder zur späteren Wiederverwendung in einer eigenen Collection zu sichern.
equals
und hashCode
Aufgabenstellung | Klassen und Methoden | Ein- und Ausgabedaten | Bewertung und Kriterien |
Hinweise | FAQ | Fehlerbehandlung | Testen |
In dieser letzten Übungsrunde nutzen wir die Interfaces Factory
und Operation
um dem AsciiShop weitere Operationen hinzuzufügen. Diese sollen die Speicherung eines Bildes und das Suchen unter den gespeicherten Bilder ermöglichen. Zur Verwaltung gespeicherter Bilder wird eine spezielle eigens definierte Collectionklasse MetricSet
benutzt.
Die Aufgabe besteht aus mehreren Schritten:
MetricSet
als einfache Erweiterung von LinkedHashSet
.
Metric
.
equals
und hashCode
in AsciiImage
.
MetricSet
und der Implementierungen von Metric
. Teilweise Refaktorisierung von AsciiShop
.
Die vordefinierte Klasse java.util.LinkedHashSet
ist eine Implementierung einer Menge (Interface Set
). Anders als bei Listen, haben Elemente eines Set
s keine fixe durch einen Index bestimmte Reihenfolge (es gibt spezielle Set
s deren Elemente geordnet sind, jedoch nicht über einen Index). Außerdem können nicht mehrere gleiche Elemente hinzugefügt werden. Genauer gesagt: ein Objekt kann nur hinzugefügt werden, wenn nicht bereits ein Objekt gibt, das diesem Objekt gleicht (die Gleichheit wird dabei mit der Methode equals
geprüft). Der Vorteil von Sets sind schnelle Mengenoperationen, Sortierung und Suche nach Elementen.
Die Klasse LinkedHashSet<E>
soll nun derart erweitert werden, dass die Suche nach ähnlichen Objekten im Set möglich wird. Dazu wird ein Distanzmaß, auch Metrik genannt, benötigt. Eine entsprechende Metrik wird durch das vorgegebene Interface Metric<E>
festgelegt. Unterschiedliche Implementierungen von Metric<E>
ermöglichen eine Suche anhand unterschiedlicher Bildmerkmale (siehe untenstehende Beschreibung).
Die folgenden Befehle sind zulässig, neue und veränderte Befehle sind farblich hervorgehoben, nicht mehr geforderte durchgestrichen:
binary
threshold
wandelt das Bild in ein Binärbild um, sodass alle Zeichen, die im Zeichensatz vor dem Zeichen threshold
stehen, auf das dunkelste Zeichen gesetzt werden und alle Zeichen ab und inklusive threshold
auf das hellste Zeichen des Zeichensatzes gesetzt werden.clear
löscht den gesamten Bildinhalt, alle Pixel des Bildes werden auf das letzte Zeichen des Zeichensatzes des Bildes gesetzt.filter
type
filtert das Bild mit dem im type
spezifizierten Filter. Als Typen sind ‘median
’ und ‘average
’ zulässig. Wird als Paramater (type) ein unbekannter Filter angegeben, soll keine Filterung durchgeführt und "INPUT MISMATCH
" ausgegeben werden.load
eof
liest ein Bild zeilenweise ein und speichert es in das zuletzt mit create
erzeugte Bild. Um das Ende der Eingabe zu erkennen, wird als Parameter eine Zeichenkette (eof
) angegeben, die das Ende der Bildeingabe kennzeichnet. Fehlt dieses so wird "INPUT MISMATCH
" ausgegeben. Entspricht die Höhe und Breite des eingelesenen Bildes nicht exakt jener des mit create
erzeugten Bildes, so soll "OPERATION FAILED
" ausgegeben werden.print
gibt das ASCII-Bild gefolgt von einer Leerzeile aus.replace
oldChar newChar
ersetzt alle Vorkommen eines bestimmten Zeichens (oldChar) im Bild durch ein anderes Zeichen (newChar).undo
macht einen Befehl rückgängig. Gibt es keinen weiteren Befehl, der rückgängig gemacht werden kann, soll "STACK EMPTY
" ausgegeben werden. Im Gegensatz zu vorherigen Runden, wird die Stack Belegung nun nicht mehr ausgegeben.
create
muss wie bisher der erste eingegebene Befehl sein. Er kann aber in weiterer Folge wiederholt aufgerufen werden, um neue Bilder zu erzeugen (siehe Beispiele unten).
save
speichert das Bild, d.h. fügt das Bild der Menge gespeicherter Bilder hinzu.
search
metric
sucht nach dem gespeicherten Bild, dass dem aktuell bearbeiteten Bild hinsichtlich einer angegebenen Metrik am ähnlichsten ist. Das Ergebnisbild ersetzt dabei das aktuell bearbeitete Bild (die Suche kann bei Bedarf mit dem obigen undo
Befehl rückgängig gemacht werden). Der Parameter metric
kann entweder ‘pixelcount
’ oder ‘uniquechars
’ sein. Im Fall von ‘pixelcount
’ wird jenes Bild geliefert, dass mit der Anzahl seiner Pixel (Breite mal Höhe) vom aktuellen Bild am wenigsten abweicht (oder gleich viele Pixel hat). Im Fall von ‘uniquechars
’ wird jenes Bild geliefert, dessen Anzahl an unterschiedlichen Zeichen (getUniqueChars()
aus Runde 4) am wenigsten vom aktuellen Bild abweicht. In beiden Fällen gilt: Wenn es mehrere Bilder mit minimalem Abstand gibt, wird eines davon zurück geliefert. Es ist nicht spezifiziert, welches Bild das sein muss. Wurden zuvor keine Bilder gespeichert, bricht das Programm mit der Ausgabe "OPERATION FAILED
" ab.
printsaved
gibt alle gespeicherten Bilder untereinander aus. Dies soll in der Reihenfolge erfolgen, in der die Bilder gespeichert wurden. Wurden zuvor keine Bilder gespeichert, soll "NO SAVED IMAGES
" ausgegeben werden. Beachten Sie auch die Hinweise zur Reihenfolge der Ausgabe.
Alle hier aufgeführten Befehle können in beliebiger Reihenfolge auftreten. So kann zum Beispiel nach dem ersten Befehl create
erst print
, danach load
und danach wieder create
folgen. Alle genannten Befehle haben entsprechende Klassen, die die Funktionalität implementieren.
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.
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)
public AsciiImage(int width, int height, String charset)
IllegalArgumentException
. Werfen Sie auch eine IllegalArgumentException
, falls das charset
ein Zeichen doppelt enthält oder gar keine Zeichen umfasst.public AsciiImage(AsciiImage img)
public String getCharset()
public int getHeight()
public char getPixel(int x, int y)
IndexOutOfBoundsException
.public char getPixel(AsciiPoint p)
IndexOutOfBoundsException
.public ArrayList<AsciiPoint> getPointList(char c)
public int getWidth()
public void setPixel(int x, int y, char c)
IndexOutOfBoundsException
, falls das Zeichen c
nicht dem Zeichensatz des Bildes entspricht (sprich nicht im charset enthalten ist).public void setPixel(AsciiPoint p, char c)
IndexOutOfBoundsException
, falls das Zeichen c
nicht dem Zeichensatz des Bildes entspricht (sprich nicht im charset enthalten ist).public String toString()
public boolean equals(Object o)
true
wenn Höhe und Breite übereinstimmen und der Pixelwert an jeder Position des angegebenen Bildes mit dem in diesem Bild übereinstimmt. Ansonsten wird false
geliefert.public int hashCode()
public int getUniqueChars()
public AsciiPoint(int x, int y)
public int getX()
public int getY()
public String toString()
(x,y)
zurück.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()
public boolean empty()
public AsciiImage pop()
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()
null
zurückgegeben werden.public void push(AsciiImage img)
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()
distance
berechnet die (halb-)metrische Distanz zwischen zwei Argumenten.
public int distance(T o1, T o2)
distance(x,y) >= 0
. Es sollte außerdem gelten: distance(x,y) == 0
, wenn x.equals(y)
. Zu beachten ist, dass distance(x,y) == 0
auch dann erfüllt sein kann, wenn !x.equals(y)
erfüllt ist (Halbmetrik).
distance(x,y) == distance(y,x)
distance(x,y) <= distance(x,z) + distance(z,y)
implements Metric<AsciiImage>
public int distance(AsciiImage i1, AsciiImage i2)
i1
und i2
. Mit Bildgröße ist das Produkt von Höhe mal Breite des Bildes gemeint.
implements Metric<AsciiImage>
public int distance(AsciiImage i1, AsciiImage i2)
getUniqueChars()
aus Runde 4 herangezogen werden.
extends LinkedHashSet<E>
Set
auf der Basis von LinkedHashSet
mit der Besonderheit, dass in dem MetricSet
mit Hilfe einer Metrik nach Objekten gesucht werden kann, die einem spezifizierten Objekt ähnlich sind. Beachten Sie dazu das Interface Metric
. Die Klasse soll als Erweiterung der Klasse LinkedHashSet<E>
definiert werden. Ein LinkedHashSet<E>
ist Untertyp von HashSet<E>
mit der Besonderheit, dass die Einfügereihenfolge der Elemente erhalten bleibt (siehe Hinweise).
Es gibt Methoden, die von der Klasse LinkedHashSet
bzw. deren direkten und indirekten Oberklassen geerbt werden und hier nicht explizit angegeben sind. Die für diese Aufgabe nützlichen geerbten Methoden sind im Folgenden angeführt (diese können genutzt werden, Überschreiben ist nicht gefragt). Für eine vollständige Auflistung der Methoden, siehe java.util.LinkedHashSet und Oberklasse java.util.HashSet.
public MetricSet()
public MetricSet(Collection<? extends E> c)
c
.public MetricSet<E> search(E e, Metric<? super E> m)
e
haben. Das kann auch nur ein Element sein. m
ist die Metrik, die als Distanzmaß benutzt werden soll.public boolean add(E e)
e
dem Set hinzu, wenn es in diesem kein Element e2
gibt, sodass (e==null ? e2==null : e.equals(e2))
. Liefert true
wenn es hinzugefügt wurde und false
wenn ein solches Element bereits vorhanden war.
public boolean addAll(Collection<? extends E> col)
col
dem Set hinzu. Liefert true
wenn das Set dadurch verändert wurde und false
, wenn alle Elemente bereits vorhanden waren.
public boolean contains(Object o)
o
in diesem Set enthalten ist, d.h., ob es in diesem Set ein Element e
gibt, sodass (o==null ? e==null : o.equals(e))
.
public Iterator<E> iterator()
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.
extends FilterOperation
public AverageOperation()
AverageOperation
.public AsciiImage execute(AsciiImage img)
FilterOperation
public int filter(int[] values)
implements Factory
BinaryOperations
.
public BinaryFactory()
BinaryFactory
.public Operation create(Scanner scanner) throws FactoryException
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.implements Operation
AsciiImage
in ein Binärbild um.
public BinaryOperation(char threshold)
BinaryOperation
mit dem entsprechenden Schwellwert.public AsciiImage execute(AsciiImage img) throws OperationException
AsciiImage
vorkommen, so wird eine OperationException geworfen.implements Factory
ClearOperations
.
public ClearFactory()
ClearFactory
.public Operation create(Scanner scanner)
ClearOperation
und gibt diese zurück.implements Operation
public ClearOperation()
ClearOperation
.public AsciiImage execute(AsciiImage img)
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.implements Factory
MedianOperations
und AverageOperations
.
public FilterFactory()
FilterFactory
.public Operation create(Scanner scanner) throws FactoryException
MedianOperation
(bei ‘median
’) oder eine neue AverageOperation
(bei ‘average
’) zurück. Ist der Typ unbekannt, so wird eine FactoryException
geworfen.implements Operation
filter
eine Schablone (Template) für die konkreten Filter Operationen.
public FilterOperation()
FilterOperation
.public AsciiImage execute(AsciiImage img)
public abstract int filter(int[] values)
implements Factory
LoadOperations
.
public LoadFactory()
LoadFactory
.public Operation create(Scanner scanner) throws FactoryException
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.implements Operation
AsciiImage
.
public LoadOperation(String data)
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
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.extends FilterOperation
public MedianOperation()
MedianOperation
.public AsciiImage execute(AsciiImage img)
FilterOperation
public int filter(int[] values)
implements Factory
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()
ReplaceFactory
.public Operation create(Scanner scanner) throws FactoryException
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.implements Operation
public ReplaceOperation(char oldChar, char newChar)
ReplaceOperation
die alle Zeichen oldChar
durch newChar
ersetzt.public AsciiImage execute(AsciiImage img) throws OperationException
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.implements Factory
CreateOperation
.
public CreateFactory()
CreateFactory
.public Operation create(Scanner scanner) throws FactoryException
Scanners
Breite und Höhe und einen String ein und gibt eine damit initialisierte neue CreateOperation
zurück. Tritt beim Einlesen ein Fehler (zu wenig Parameter, falsche Parameter), so wird eine FactoryException
geworfen.implements Operation
public CreateOperation(int width, int height, String charset)
CreateOperation
, die ein neues Bild mit angegebener Bildgöße und Zeichensatz erzeugt. Alle Pixel werden mit dem "hellsten" Zeichen, d.h. dem Zeichen mit größten Index in charset
initialisiert.public AsciiImage execute(AsciiImage img) throws OperationException
AsciiImage
zurück. Der Parameter wird ignoriert (beispielsweise kann auch null
übergeben werden).implements Factory
SaveOperation
.
public SaveFactory(MetricSet<AsciiImage> saved)
SaveFactory
. saved
ist eine Referenz auf ein MetricSet, dem durch eine SaveOperation
Bilder hinzugefügt werden sollen.public Operation create(Scanner scanner) throws FactoryException
SaveOperation
. .implements Operation
public SaveOperation(MetricSet<AsciiImage> saved)
SaveOperation
. saved
ist eine Referenz auf ein MetricSet, in dem die Bilder gespeichert werden sollen.public AsciiImage execute(AsciiImage img) throws OperationException
img2
, so dass img2.equals(img)
, oder ist img == null
wird kein neues Element hinzugefügt). Die Rückgabe der Methode ist eine Kopie des spezifizierten Bildes img
.public MetricSet<AsciiImage> getSaved()
implements Factory
SearchOperation
.
public SearchFactory(MetricSet<AsciiImage> saved)
SearchFactory
. saved
ist eine Referenz auf ein MetricSet, in dem sich die gespeicherten Bilder befinden.public Operation create(Scanner scanner) throws FactoryException
SearchOperation
. Dazu wird zunächst mit dem angegebenen Scanner ein String eingelesen, der angibt, welche Metrik benutzt werden soll ("pixelcount" oder "uniquechars"). Kann dieser String nicht eingelesen werden, oder ist der eingelesene String unbekannt, wird eine FactoryException
geworfen.implements Operation
public SearchOperation(MetricSet<AsciiImage> saved, Metric<AsciiImage> m)
SearchOperation
mit einer angegebenen Metrik. saved
ist eine Referenz auf ein MetricSet, in dem sich die gespeicherten Bilder befinden. m
ist die Metrik.public AsciiImage execute(AsciiImage img) throws OperationException
saved
leer, wird eine OperationException
geworfen.Interfaces und Exceptions.
extends Exception
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()
FactoryException
. Ruft den entsprechenden Super-Konstruktor in der Klasse Exception
auf.public FactoryException(String message)
FactoryException
mit der entsprechenden Fehlerbeschreibung. Ruft den entsprechenden Super-Konstruktor in der Klasse Exception
auf.public Operation create(Scanner scanner) throws FactoryException
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.extends Exception
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()
OperationException
. Ruft den entsprechenden Super-Konstruktor in der Klasse Exception
auf.public OperationException(String message)
OperationException
mit der entsprechenden Fehlerbeschreibung. Ruft den entsprechenden Super-Konstruktor in der Klasse Exception
auf.public AsciiImage execute(AsciiImage img) throws OperationException
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.
Beachten Sie die allgemeinen Hinweise zur Installation und zur Ein-/Ausgabe, sowie zur Abgabe und zur Beurteilung in den FAQ.
equals
und hashCode
In der Klasse AsciiImage
sollen die Methoden equals
und hashCode
redefiniert werden. Achten Sie auf korrektes Überschreiben (siehe Skriptum, Abschnitt 3.4.3).
printsaved
Es ist gefordert, dass die gespeicherten Bilder beim Befehl printsaved
in der Reihenfolge ausgegeben werden, in der sie gespeichert wurden. Im Allgemeinen haben die Elemente eines Set
keine Reihenfolge und es gibt keine Listen-Methoden wie first()
oder get(index)
. Weiters ist es nicht sichergestellt, dass der Iterator eines Sets die Elemente in der Einfügereihenfolge liefert. Wenn zur Speicherung der Bilder der Untertyp LinkedHashSet
benutzt wird, gibt es zwar auch keine Methode get(index)
, der Iterator liefert aber die Elemente in Einfügereihenfolge. Dies gilt natürlich auch für MetricSet
, da diese Klasse in diesem Beispiel von LinkedHashSet
abgeleitet wird und daher der Iterator der Oberklasse benutzt werden kann.
Die Elemente eines Set
sollten unveränderbar sein, da das Verhalten eines Set nicht definiert ist, wenn eingefügte Objekte nachträglich verändert werden. Beispielsweise kann ein verändertes Element doppelt vorkommen (widerspricht der Philosophie eines Set) oder nicht mehr gefunden werden. Im Fall von AsciiImage
sind die Elemente zwar veränderbar, jedoch gibt es in diesem Beispiel keine nachträglichen Änderungen am Bild, da jede Bildoperation ein neues Bild zurückliefert (Siehe Beschreibung des Interface Operation
). Daher ist die Verwendung eines Set in diesem Beispiel zulässig.
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 |
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. 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.
Bei jedem Aufruf von print
soll das aktuell bearbeitete Bild korrekt formatiert und von einer Leerzeile gefolgt, ausgegeben werden. Wird undo
eingegeben, so wird, falls der Stack leer ist, "STACK EMPTY
" ausgegeben.
Bei jedem Aufruf von printsaved
sollen untereinander alle gespeicherten Bilder in der Reihenfolge, in der sie gespeichert wurden, ausgegeben werden. Wurden zuvor keine Bilder gespeichert, soll "NO SAVED IMAGES
" ausgegeben werden.
Geben Sie "INPUT MISMATCH
" aus und brechen Sie die weitere Verarbeitung ab, falls einer der folgenden Fehler auftritt:
create
load
-Befehl fehlt das eof
Parameter oder das abschließende eof
filter
hat unzulässige Parameter (z.B. einen unbekannten Typ).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:
load
-Befehl und dem Endzeichen sind mehr oder weniger Zeilen als das Bild hatsearch
-Befehl wird aufgerufen, ohne dass zuvor mit save
ein Bild gespeichert wurde.
Geben Sie "UNKNOWN COMMAND
" aus und brechen Sie die weitere Verarbeitung ab, falls einer der folgenden Fehler auftritt:
create
folgt (später) ein unbekannter Befehl.
|
||||||
|