Fortgeschrittene objektorientierte Programmierung
LVA 185.211, VL 2.0, 2005 S

1. Übungsaufgabe

Entwickeln Sie in Java oder C++ ein Programm zur Lösung folgender Problemstellung:

Benötigt wird eine einfache graphische Oberfläche für ein einfaches schwarz/weiß-ASCII-Terminal. Insbesondere sollen am Terminal Fenster darstellbar sein, deren Ränder in der Regel durch die Zeichen | (vertikal), - (horizontal) und + (an den Ecken) gezeichnet sind. Es sollen gleichzeitig mehrere Fenster (auch überlappend) darstellbar sein. Aktiv ist immer das vorderste Fenster unter der aktuellen Cursor-Position. Alle Tastatureingaben haben entweder globale Bedeutung, unabhängig davon, wo der Cursor steht, oder beziehen sich auf das aktive Fenster, falls es eines gibt. Tastatureingaben, die im aktuellen Zustand nicht erlaubt sind, sollen dazu fuehren, dass entweder das ganze Terminal (bei Tastatureingaben mit globaler Bedeutung bzw. wenn es kein aktives Fenster gibt) oder das aktive Fenster inklusive Rand für kurze Zeit (ca. eine halbe bis eine Sekunde) komplett mit #-Zeichen gefuellt ist. Folgende Tastatureingaben beziehen sich auf das Fenster selbst und haben globale Bedeutung, alle anderen Eingaben werden an die Applikation im aktiven Fenster weitergeleitet:

l, r, u und d:
Verschieben den Cursor um eine Position nach links, rechts, oben, bzw. unten, außer wenn der Cursor dadurch ganz aus dem Bildschirm verschwinden würde. Diese Tastatureingaben sind immer erlaubt, bewirken in letzterem Fall aber keine Zustandsänderungen.
L, R, U und D:
Verschieben den Cursor und das aktive Fenster um eine Position nach links, rechts, oben, bzw. unten. Diese Eingaben sind nicht erlaubt, wenn kein Fenster aktiv ist. Sie sind erlaubt, wenn der Cursor dadurch ganz aus dem Bildschirm verschwinden würde, bewirken in diesem Fall aber keine Zustandsänderungen.
b:
Verschiebt das aktive Fenster ganz nach hinten; das danach vorderste Fenster unter dem Cursor wird aktiv. Immer erlaubt, aber keine Zustandsänderungen, falls kein Fenster aktiv ist.
> und <:
Vergrößern bzw. Verkleinern des aktiven Fensters um eine Position in der Breite, wobei der linke Fensterrand unverändert bleibt. Die Mindestbreite des Fensterinhalts ist ein Zeichen (also drei Zeichen inklusive Fensterrand), die Maximalbreite hängt von der Applikation im aktiven Fenster ab. Immer erlaubt, wenn ein Fenster aktiv ist, aber keine Zustandsänderungen, falls dadurch die Mindestbreite unterschritten oder die Maximalbreite überschritten würde.
+ und -:
Vergrößern bzw. Verkleinern des aktiven Fensters um eine Position in der Höhe, wobei der untere Fensterrand unverändert bleibt. Die Mindesthöhe des Fensterinhalts ist ein Zeichen, die Maximalhöhe hängt von der Applikation im aktiven Fenster ab. Immer erlaubt, wenn ein Fenster aktiv ist, aber keine Zustandsänderungen, falls dadurch die Mindesthöhe unterschritten oder die Maximalhöhe überschritten würde.
0 bis 9:
Start der Applikation mit der entsprechenden Nummer. Was dabei genau passiert, hängt von der Applikation ab.

Jedem Fenster ist genau eine Applikation zugeordnet, und jede Applikation hat genau ein Fenster. Als Beispielapplikation soll ein kleines Zeichenprogramm (kann auch ein Programmteil sein) dienen: An jeder Position (= Cursor-Position) der Zeichnung steht entweder ein Leerzeichen oder *. Zeichnungen haben undefinierte Größe (bis zu einer Größe von mindestens 32000 Zeichen in jeder Dimension nach rechts und oben erweiterbar) und bestehen zu Beginn nur aus Leerzeichen. Den Applikationsnummern 0 bis 9 soll das Zeichenprogramm mit unterschiedlichen Zeichnungen zugeordnet sein. Jede der zehn Zeichnungen soll persistent gespeichert werden. Beim Start einer Applikation wird die Zeichnung mit der entsprechende Nummer geladen und in einem neuen, ganz vorne liegenden Fenster angezeigt. Größe und Position des Fensters sollen der Größe und Position des Fensters mit dieser Zeichnung beim letzten Abspeichern entsprechen. Zeichnungen sollen nicht nochmals geladen werden, wenn sie bereits geladen sind; statt dessen soll kurz ein nur aus #-Zeichen bestehendes Fenster entsprechender Größe und Position eingeblendet werden, das gleich wieder verschwindet. Folgende Tastatureingaben sollen von der Applikation verarbeitet werden:

s:
Speichert die Zeichnung im aktiven Fenster permanent.
q:
Speichert die Zeichnung im aktiven Fenster und beendet die Applikation, wobei das Fenster entfernt wird.
x:
Beendet die Applikation und entfernt das aktive Fenster, ohne die Zeichnung permanent zu speichern.
* und Leerzeichen:
Setzen den Fensterinhalt unter dem Cursor auf * bzw. Leerzeichen. Die Tastatureingabe ist nicht erlaubt, wenn der Cursor auf dem Fensterrand steht.

Es soll möglich sein, dass von mehreren Terminals aus gleichzeitig auf die persistenten Zeichnungen zugegriffen wird. Jedoch soll es nicht möglich sein, dass Zeichnungen mit derselben Nummer auf verschiedenen Terminals gleichzeitig offen sind. Daher soll eine Zeichnung nur dann geladen werden, wenn auf keinem anderen Terminal, das auf denselben persistenten Speicher zugreift, eine Zeichnung mit dieser Nummer existiert. Auch in diesem Fall soll beim Versuch, die Applikation zu starten, ein Fenster aus #-Zeichen kurz eingeblendet werden.

Gestalten Sie Ihre Lösung möglichst einfach und gut wartbar. Denken Sie daran, dass Fenster und Beispielapplikation möglichst unabhängig voneinander austauschbar sein sollen. Persistente Daten sollen auch in neueren Versionen des Zeichenprogramms verwendbar sein. Der Inhalt eines Fensters soll so spät wie möglich und nur so weit wie nötig aus dem persistenten Speicher geladen werden. Achten Sie auf den Speicherverbrauch, da Zeichnungen sehr groß werden können, obwohl sie meist nur klein sind. Überlegen Sie sich geeignete Möglichkeiten zur Synchronisation mehrerer Terminals mit gemeinsamem persistenten Speicher und bedenken Sie, dass der gewählte Synchronisationsmechanismus später vielleicht gegen einen anderen ausgetauscht werden muss. Verwenden Sie ganz bewusst Softwareentwurfsmuster, die Ihnen für diese Anwendung geeignet erscheinen, und vermeiden Sie ebenso bewusst Entwurfsmuster, deren Einsatz Ihnen hier nicht für gerechtfertigt erscheint.

Die eigentliche Bildschirmausgabe können Sie einfach gestalten. Beispielsweise können Sie einmal pro Sekunde (oder in kürzeren Intervallen) den aktuellen Bildschirminhalt neu ausgeben. Denken Sie aber bitte daran, dass Tastatureingaben (durch Umlenken der Standardeingabe) sehr schnell erfolgen können. Vermeiden Sie überlange Testzeiten, indem Sie nicht nach jeder Tastatureingabe sofort den gesamten Bildschirminhalt neu ausgeben.

Complang
Puntigam
   Kontakt
   Research
   Lehre
      OOP
      Typsysteme
      EP2
      FOOP
      Prog.spr.
      frühere Lehre
         LVAs 2017 W
         LVAs 2017 S
         LVAs 2016 W
         LVAs 2016 S
         LVAs 2015 W
         LVAs 2015 S
         LVAs 2014 W
         LVAs 2014 S
         LVAs 2013 W
         LVAs 2013 S
         LVAs 2012 W
         LVAs 2012 S
         LVAs 2011 W
         LVAs 2011 S
         LVAs 2010 W
         LVAs 2010 S
         LVAs 2009 W
         LVAs 2009 S
         LVAs 2008 W
         LVAs 2008 S
         LVAs 2007 W
         LVAs 2007 S
         LVAs 2006 W
         LVAs 2006 S
         LVAs 2005 W
         LVAs 2005 S
            Prog.spr.
            FOOP
               1. Aufgabe
               2. Aufgabe
               3. Aufgabe
         LVAs 2004 W
         LVAs 2004 S
         LVAs 2003 W
   Links
Sitemap
Kontakt
Schnellzugriff:
nächste Aufgabe
Fakultät für Informatik
Technische Universität Wien
Anfang | HTML 4.01 | Datenschutzerklärung | letzte Änderung: 2005-03-30 (Puntigam)