Praktikum
"Softwareentwicklung
und Programmierung
Teil 1"
Studiengang Interaktive Medien, 24.11.2008
Praktikum
"Softwareentwicklung und Programmierung, Teil 1" im
Studiengang Interaktive Medien
Aufgabe 7
A)
Stack Entwickeln Sie eine
Klasse
"Stapel" welche eine Datenstruktur "Stack" realisiert. Denken
Sie bei der Realisierung an die Metapher eines "Papierstapels". Neue
Elemente werden immer oben auf den Stapel gelegt. Soll ein Element vom
Stapel entfernt werden, so wird immer das oberste Element genommen. Auf
dem Stack sollen Interger-Werte abgelegt werden.
Ihre Klasse Stapel soll folgende Methoden unterstützten:
1) void push( int value)
Legt den
übergebenen Wert value auf dem Stack ab
2) int pop()
Liefert
als
Ergebnis das oberste Element des Stacks zurück. Gleichzeitig
wird dieses Element vom Stapel entfernt
3) boolean empty()
Liefert true zurück,
wenn
keine Element auf dem Stack gespeichert ist, andernfalls false.
4) int peek()
Liefert
als Ergebnis
das oberste Element des Stacks zurück. Das oberste Element
wird jedoch nicht vom Stapel entfernt
5) void init()
Initialisiert den
Stack.
Verwenden Sie für die Realisierung des Stacks ein globales
Integer-Array, welches initial mit der Größe 10
angelegt wird. Darüberhinaus benötigen Sie eine
Klassenvariable
size, welche angibt wieviel Werte tatsächlich auf dem Stack
abgelegt sind.
Berücksichtigen Sie, dass Ihr Stack
dynamisch wachsen soll, wenn mehr Elemente eingefügt
werden,
als Ihr internes Array Platz aufweist. Implementieren Sie
hierzu eine Methode "reSize" welche bei Bedarf die Größe des
Arrays verdoppelt und die vorhandenen Werte kopiert.
B)
Taschenrechner in UPN
Entwicklen Sie eine Klasse "UPNCalc", welche einen Taschenrechner
für die umgekehrt polnische Notation von arithmetischen
Ausdrücken realisiert ( Siehe
PostfixNotation.pdf ).
Greifen Sie für die Berechnung der einzelnen
Teilausdrücke auf dies Klasse "Stapel" zu, welche für
das
Abspeichern der Zwischenergebnisse verwendet werden soll.
Folgende arithmetische Operationen sollen von Ihrem Taschenrechner
unterstützt werden:
Addition,
Subtraktion, Multiplikation, Division
Die Eingabe in Ihr Programm
erfolgt zeilenorientiert,
wobei jede Aktion innerhalb Ihres Programmes durch eine entsprechende
Ausgabe kommentiert werden soll.
Das Programm wird beendet,
wenn der Benutzer eine leere Zeile
eingibt. Hierbei wird das Gesamtergebnis der Berechnung ausgegeben.
Im Falle einer falschen
Eingaben soll die Eingabe verworfen und
mit der nächsten Zeile fortgefahren werden. Informieren Sie
den
Benutzer über die Falscheingabe durch eine sinnvolle
Fehlermeldung.
Die Eingabe eines Literals (
Zahlenkonstanten) wird durch
die Zeichenkombination "#:" eingeleitet. (z.B.#:-245)
Die Eingabe eines Operanden
wird durch die Zeichenkombination
"op:" eingeleitet. (z.B.op:+)
Strukturieren Sie Ihr Programm sinnvoll durch die Verwendung von
Methoden
Nachfolgend ist eine möglicher Programmablauf
dargestellt: (
Eingaben sind Blaudargestellt,
Ausgaben in Grün)
#:52 >>>
Push 52, stacksize: 1 #:24 >>>
Push 24,
stacksize: 2 op:+ >>>
Pop 24,
stacksize: 1 >>>
Pop 52,
stacksize: 0 >>>
Adding 52 + 24 >>>
Push 75,
stacksize: 1 #:6 >>>
Push 6,
stacksize: 2 op:* >>>
Pop 6,
stacksize: 1 >>>
Pop 75,
stacksize: 0 >>>
Multiply 75 * 6
>>> Push 450,
stacksize: 1 (Lehre Zeile)
>>> Ergebnis: 450,
stacksize: 1 Zum
Test Ihres Programms berechnen
Sie bitte folgende Ausdrücke:
2
2 10 + * 2
2 + 10 *
Wie muss das korrekte Ergebnis lauten?
Wie lauten die Ausdrücke in der sogenannten Infix-Notation
(normale Schreibweise für arithmetische Ausdrücke)?
(Freiwillig):
Erweitern Sie Ihr Programm so, dass die Präfixe "#:" und "op:"
für die Eingabe entfallen können.