1 Aufbau von Termen
1 Aufbau von Termen
1 Aufbau von Termen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Übungen zu Algorithmik I<br />
Wintersemester 2004/05<br />
Prof. Dr. Herbert Stoyan, Dr.-Ing. Bernd Ludwig<br />
Aufgabenblatt 4 (Anmerkungen) vom 8.11.2004<br />
Anmerkungen zur Auswertung <strong>von</strong> arithmetischen Ausdrücken<br />
1 <strong>Aufbau</strong> <strong>von</strong> <strong>Termen</strong><br />
Untersucht man den syntaktischen <strong>Aufbau</strong> <strong>von</strong> arithmetischen Ausdrücken, dann stellt man<br />
fest, dass es grundsätzlich drei verschiedene Typen gibt:<br />
• Zahl: z.B. 2, −3.45<br />
• geklammerte Terme: z.B: (7.65 + 9.096)<br />
• Terme mit binären Rechenoperatoren: z.B. 4.5 + 6.987, −56.6/7<br />
Alle anderen denkbaren Terme lassen sich einem der drei Typen zuordnen. Der Grund dafür,<br />
dass dies möglich ist, wird vom Assoziativgesetz geliefert, wenn es sich bei dem Term um eine<br />
Summe oder ein Produkt handelt:<br />
• 3 + 4 + 5 lässt sich auch als (3 + 4) + 5 oder 3 + (4 + 5) schreiben, ohn dass sich der<br />
Wert der Summe ändern würde.<br />
• 3 · 4 · 5 kann umgeformt werden zu (3 · 4) · 5 oder zu 3 · (4 · 5).<br />
Bei Differenzen und Quotienten gilt das Assoziativgesetz bekanntlich auch, da es sich um die<br />
zu Addition und Multiplikation inversen Rechenoperationen in einer (algebraischen) Gruppe<br />
handelt:<br />
• 3 − 4 − 5 = (3 − 4) − 5 = 3 − (4 − 5)<br />
• 3/4/5 = (3/4)/5 = 3/(4/5)<br />
Wenn in einem Term die Strich-Operatoren + und − mit den Punkt-Operatoren · und / gemischt<br />
vorkommen, gilt die Regel Punkt vor Strich. Wie das Assoziativgesetz gibt sie eine<br />
Regel für die Reihenfolge an, in der Operatoren in einem Term ausgewertet werden dürfen:<br />
Summanden können erst dann zu anderen Summanden addiert werden, wenn sie keine Produkte<br />
mehr enthalten. Im Term<br />
3 · 4 + 5<br />
muss also zuerst 3 · 4 ausgewertet werden, bevor der Wert der Summe berechnet werden kann.<br />
Die Punkt-vor-Strich-Regel kann auch so umformuliert werden: Wenn in einem Ausdruck<br />
Punkt- und Strich-Operatoren gemischt vorkommen, dann setze um jedes Produkt Klammern!<br />
Für das Beispiel oben hieße das:<br />
3 · 4 + 5 = (3 · 4) + 5<br />
Damit haben wir wieder einen Term mit einer binären Rechenoperation.<br />
Fazit: Wir müssen also nur genügend viele Klammerpaare setzen, dann erhalten wir immer<br />
einen Term, der zu einem der drei eingangs aufgeführten Typen gehört. Ein Klammerpaar zu<br />
setzen, bedeutet also, die Berechnung des Werts des Terms solange hinauszuschieben, bis der<br />
Wert des eingeklammerten Terms ermittelt ist.<br />
1
2 Auswertung<br />
Bei der Implementierung <strong>von</strong> arithmetischen Ausdrücken in der Programmiersprache ALGO<br />
wird den dargestellten Tatsachen zunächst dadurch Rechnung getragen, dass Klassen für die<br />
drei Typen <strong>von</strong> <strong>Termen</strong> vorgesehen sind:<br />
• Zahl: ALGOFloatConstantExpression<br />
• geklammerter Term: ALGONestedExpression<br />
• binäre Operatoren: ALGOPlusExpression, ALGOMinusExpression, ALGOTimesExpression,<br />
ALGODivExpression<br />
In jeder Klasse wird die Methode evaluate implementiert, die die Auswertung eines Terms<br />
durchführen soll.<br />
Im Fall <strong>von</strong> ALGOFloatConstantExpression ist die Auswertung die Instanz selbst;<br />
denn der Wert einer Zahl ist die Zahl selbst.<br />
ALGONestedExpression muss in evaluate die Klammerregel umsetzen, d.h. der<br />
Wert des Terms ist identisch zu dem Wert des eingeklammerten Terms; dementsprechend wertet<br />
evaluate sein Argument aus und gibt den berechneten Wert zurück.<br />
evaluate in den anderen Klassen muss erst beide Argumente untersuchen, ob sie erfordern,<br />
die Auswertung zu verschieben, bis die Argumente ausgewertet sind, oder ob der Rechenoperator<br />
sofort auf beide (ausgewerteten) Argumente angewandt werden kann:<br />
(3 · 4 + 5) · 2 + 1 = linkes Argument: Punkt-vor-Strich! (1)<br />
((3 · 4 + 5) · 2) + 1 erst Klammer auswerten! (2)<br />
(3 · 4 + 5) · 2 linkes Argument geklammert: erst auswerten! (3)<br />
3 · 4 + 5 linkes Argument: Punkt-vor-Strich! (4)<br />
(3 · 4) + 5 = erst Klammer auswerten! (5)<br />
3 · 4 = Produkt auswerten! (6)<br />
12 in Zeile (5) einsetzen! (7)<br />
12 + 5 = 17 Summe in Zeile 4 auswerten! (8)<br />
17 in Zeile (3) einsetzen! (9)<br />
17 · 2 Produkt auswerten! (10)<br />
34 in Zeile (2) einsetzen! (11)<br />
34 + 1 = 35 Zeile (1) auswerten und fertig! (12)<br />
Da jeder Teilausdruck, der im Verlauf der Berechnung auszuwerten ist, Instanz einer Unterklasse<br />
<strong>von</strong> ALGOExpression ist, kann man die Auswertung implementieren, indem evaluate<br />
für binäre Operatoren erst evaluate für seine Argumente aufruft und dann die Rechenoperation<br />
durchführt.<br />
Bis einschließlich der Zeile 5 verschiebt evaluate also die Berechnung eines Ergebnisses,<br />
erst ab dem Zeitpunkt, zu dem in Zeile (6) das Produkt 3· ausgewertet worden ist, wird nicht<br />
nochmals evaluate aufgerufen, sondern die bisher aufgerufenen evaluate-Methoden geben<br />
in umgekehrter Reihenfolge ihres Aufrufs ihre Ergebnisse zurück. Ein Ergebnis wird jeweils<br />
<strong>von</strong> der aufrufenden Methode zur Berechnung ihres eigenen Teilergebnisses, das sie dann<br />
zurückgibt, eingesetzt.<br />
2