18.01.2015 Aufrufe

1 Aufbau von Termen

1 Aufbau von Termen

1 Aufbau von Termen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!