Ausdrücke • bezeichnen Elemente eines Datentyps • induktive Definition: 1. eine Konstante k vom Typ D ist ein Ausdruck vom Typ D 2. eine Variable v vom Typ D ist ist ein Ausdruck vom Typ D 3. sind t1, ..., tn Ausdrücke der Typen D1, ..., Dn und ist f:D1 x ... x Dn -> D eine Nicht-Infix-Operation, so ist f(t1,...,tn) ein Ausdruck vom Typ D 4. sind t1, t2 Ausdrücke der Typen D1, D2 und ist o:D1 x D2 -> D eine Infix-Operation, so ist (t1) o (t2) ein Ausdruck vom Typ D • Wert eines Ausdrucks: 1. für eine Konstante k ist Wert(k) das durch k bezeichnete Element von D 2. für eine Variable v ist Wert(v) der in der Variablen gespeicherte Wert 3. Wert(f(t1,...,tn)) = f(Wert(t1), ..., Wert(tn)) 4. Wert((t1) o (t2)) = Wert(t1) o Wert(t2) G.Heyer 1 Digitale Informationsverarbeitung Klammerung Vollständige Klammerung oft unnötig durch Festlegung der Bindungsstärke stärker schwächer 1. einstellige Operatoren wie not, sin, cos, ... 2. multiplikative Operatoren wie *, /, div, mod, ... 3. additive Operatoren wie +, -, or, ... 4. vergleichende Operatoren wie =, <>, <, ... Bei Operatoren gleicher Bindungsstärke wird Linksklammerung angenommen x div y * y + x mod y steht für ((x div y) * y) + (x mod y) + * mod div x y y x y Auswertungsbaum G.Heyer 2 Digitale Informationsverarbeitung Typkonversion bei zweistelligen Operatoren Operanden in der Regel vom selben Typ Ausnahmen: • Aufzählungstypen (Typverträglichkeit reicht, später) • REAL-INTEGER-Verträglichkeit: überall, wo REAL erlaubt ist, ist auch INTEGER erlaubt Bei gemischten Argumenten (etwa für div, mult) wird Konversion durchgeführt, Ergebnis stets REAL Beispiel: Wert: 17.0 + 2 2*8.0 1.0 <> 1 19.0 16.0 TRUE Bemerkung: in allen Teilausdrücken nur ausführbare Operationen verwenden! Der Ausdruck (A = 0) or (B/A > 0) kann zu Laufzeitfehler führen, falls A=0. G.Heyer 3 Digitale Informationsverarbeitung Pascal Anweisungen strukturierte Anweisung einfache Anweisung VerbundAnweisung Zuweisung Prozeduranweisung bedingte Anweisung GotoAnweisung wiederholdene Anweisung WhileAnweisung IfAnweisung CaseAnweisung G.Heyer WithAnweisung 4 RepeatAnweisung ForAnweisung Digitale Informationsverarbeitung Wertzuweisung Bezeichner := muß als Variable deklariert sein Ausdruck Typ muß Variablentyp entsprechen zu beachten: • Wertzuweisung bewirkt Änderung des Zustands im Speicher • Symbol “:=“ hat völlig andere Bedeutung als “=“ X := X + 1 bedeutet: nach Ausführung der Zuweisung ist Wert(X) = Wert alt (X) + 1, dabei ist Wert alt (X) der Wert von X vor Ausführung der Zuweisung X = X + 1 ist ein Ausdruck vom Typ BOOLEAN, der immer FALSE ist • “:=“ wird gesprochen "ergibt sich aus" oder "wird zu" G.Heyer 5 Digitale Informationsverarbeitung Bedingte Anweisungen IF Boolescher Ausdr. THEN Anweisung ELSE Anweisung Soll Folge von Anweisungen ausgeführt werden, so ist Verwendung einer Verbundanweisung (BEGIN ... END Klammerung) erforderlich Mehrdeutigkeiten: IF B1 THEN IF B2 THEN A1 ELSE A2 1) IF B1 THEN [ IF B2 THEN A1 ELSE A2 ] oder 2) IF B1 THEN [ IF B2 THEN A1 ] ELSE A2 ? B1 True True False False B2 True False True False 1 A1 A2 - 2 A1 A2 A2 Pascal folgt Lesart 1: ELSE ergänzt immer letztes unergänztes IF Lesart 2 besser: IF B1 THEN BEGIN IF B2 THEN A1 END ELSE A2 G.Heyer 6 Digitale Informationsverarbeitung Case-Anweisung CASE Ausdruck OF Fall ELSE Anweisung END jeder Fall besteht aus Liste von Konstanten und Anweisung Semantik: CASE A OF k11, ..., k1j: S1; k21, ..., k2n: S2; ... km1, ..., kmi: Sm ELSE S END bedeutet dasselbe wie: IF A = k11 or ... or A = k1j THEN S1 ELSE IF A = k21 or ... or A = k2n THEN S2 ... ELSE IF A = km1 or ... or A = kmi THEN Sm ELSE S G.Heyer 7 Digitale Informationsverarbeitung Ein Programm mit Fallunterscheidungen PROGRAM Case1; VAR Monat, Jahr, Tage: Integer; Schalt: Boolean; BEGIN Read(Monat, Jahr); IF Jahr mod 4 = 0 THEN IF Jahr mod 100 = 0 THEN IF Jahr mod 400 = 0 THEN Schalt := True ELSE Schalt := False ELSE Schalt := True ELSE Schalt:= False; CASE Monat OF 4, 6, 9, 11: Tage := 30; 2: IF Schalt THEN Tage := 29 ELSE Tage := 28 ELSE Tage := 31 END; WriteLn( Monat, ' . ', Jahr, ' ------> ', Tage ) END. G.Heyer 8 Digitale Informationsverarbeitung Schleifen boolescher Ausdruck WHILE DO Anweisung WHILE B DO A bedeutet dasselbe wie: IF B THEN BEGIN A; WHILE B DO A END ; REPEAT Anweisung UNTIL boolescher Ausdruck REPEAT C UNTIL B entspricht: C; WHILE not B DO BEGIN C END G.Heyer 9 Digitale Informationsverarbeitung FOR-Schleife TO FOR Bezeichner := Ausdruck DOWNTO Ausdruck DO Anweisung • Bezeichner ist deklarierte Variable, so daß succ und pred definiert sind • Anzahl der Schleifendurchläufe zu Beginn festgelegt: für jeden Wert zwischen dem ersten und dem zweiten Ausdruck einmal • TO, DOWNTO geben an, ob inkrementiert oder dekrementiert wird • Auf Laufvariable in der Schleife nur lesend zugreifen! • Keine Annahmen über den Wert der Laufvariable nach Beendigung der Schleife machen! Beispiel: FOR Zeichen := 'a' TO 'z' DO WriteLn(Zeichen, ' ', Ord(Zeichen)) G.Heyer 10 Digitale Informationsverarbeitung Bemerkungen FOR-Schleifen terminieren, da die Anzahl der Schleifendurchläufe feststeht WHILE und REPEAT können nichtterminierende Programme produzieren Terminierung oft schwierig zu beweisen: Beispiel Syrakusfunktion: WHILE n <> 1 DO IF odd(n) THEN n := 3*n+1 ELSE n := n div 2 Es ist unbewiesen, ob diese Schleife für alle n verlassen wird Strategie für Terminierungsbeweise: finde positiven Ausdruck, der bei jedem Schleifendurchlauf kleiner, aber nie negativ wird: bei ggT etwa: Wert von x + y nach jedem Schleifendurchlauf kleiner, aber nie negativ G.Heyer 11 Digitale Informationsverarbeitung 11. Unterprogrammtechnik Unterprogramme sind in sich geschlossene Programmeinheiten, deren Ausführung durch ihren Namen veranlaßt wird Sie dienen insbesondere der Strukturierung größerer Programme 2 Arten: • Prozeduren: abstrahieren Anweisungsfolge zu neuer Anweisung • Funktionen: berechnen einen Wert eines bestimmten Typs Vorteile der Verwendung von Unterprogrammen: • größere Lesbarkeit und Überschaubarkeit von Programmen • geringerer Schreibaufwand bei wiederkehrenden Aktionsfolgen • geringere Fehleranfälligkeit • einfachere Änderungsmöglichkeit G.Heyer 12 Digitale Informationsverarbeitung Lokale und globale Variable Unterprogramme können selbst Unterprogrammdeklarationen enthalten HP UP1 UP11 UP2 UP12 UP21 UP3 UP31 UP32 UP311 Schachtelungsbaum Sichtbarkeitsregel: Für ein Unterprogramm UP gelten alle Deklarationen aus allen Programmen (einschließlich UP und HP) auf dem Weg zu UP im Schachtelungsbaum Deklarationen in UP heißen lokal, solche in übergeordneten Programmen global für UP Bei Bezeichnungskollisionen gilt Deklaration des nächsten Unterprogramms G.Heyer 13 Digitale Informationsverarbeitung Prozeduren • Der Aufruf einer Prozedur in einem Programm ist eine Anweisung • Die in der Prozedur deklarierte Folge von Anweisungen wird abgearbeitet, anschließend wird ins aufrufende Programm zurückgesprungen Haupt programm Unterprogramm UP1 BEGIN • • • END; • • • UP1; • • • G.Heyer 14 Digitale Informationsverarbeitung Gültigkeitsbereich und Lebensdauer Gültigkeitsbereich eines Bezeichners: der statische Teil des Programms, in dem dieser Bezeichner in exakt gleicher Bedeutung verwendet werden darf. Lebensdauer: bezeichnet die dynamische Existenz eines Objekts während des Programmablaufs. Der Gültigkeitsbereich bezieht sich auf den Bezeichner (durch Übersetzer kontrolliert), die Lebensdauer auf den zur Laufzeit belegten Speicherplatz. Durch Ausführung eines Unterprogramms P entsteht eine Inkarnation. Zur Inkarnation gehören dynamisch (bis Ende der Ausführung von P): • ein Ausführungspunkt (Zeiger auf gerade auszuführenden Befehl) • Speicherplätze für alle Bezeichner von Variablen und Wertparameter • Bezüge auf die konkreten Referenzparameter. Nur in der jüngsten Inkarnation wandert der Ausführungspunkt weiter. Die Lebensdauer einer Variablen ist identisch mit der Existenz der zugehörigen Prozedur-Inkarnation. Zu Beginn der Lebensdauer ist der Wert einer Variablen undefiniert. G.Heyer 15 Digitale Informationsverarbeitung Prozedurparameter formale Parameter: in der Deklaration eines Unterprogramms verwendet (Platzhalter für Werte) aktuelle Parameter: beim Prozeduraufruf verwendete Argumente Typen: • Eingabeparameter: Übermittlung von Werten an die Prozedur, call by value • Ausgabeparameter: Übermittlung von Resultaten an aufrufendes Programm, call by reference • Ein/Ausgabeparameter: Mischform, call by reference G.Heyer formale Par. aktuelle Par. Referenzparameter Kennzeichnung durch VAR Variable entsprechenden Typs Werteparameter ohne VAR Ausdrücke entsprechenden Typs 16 Digitale Informationsverarbeitung Beispiel PROCEDURE Beispiel (V, W: REAL; VAR X: REAL); BEGIN ... END; Deklaration in aufrufendem Programm: VAR A, B, C, D: REAL; korrekte Aufrufe: Beispiel(A, D, B); Beispiel(A-1, A - 2*B, D); inkorrekt: Beispiel(A, B, 1.0) Angabe des Typs formaler Parameter erforderlich, nur Typnamen, nicht Typdeklarationen erlaubt PROCEDURE xyz(A: 1..Maxint) verboten, da Typdefinition vorkommt korrekt: TYPE Pos = 1..Maxint; ... PROCEDURE xyz(A: Pos) G.Heyer 17 Digitale Informationsverarbeitung Methoden der Parameterübergabe a) Call by value - Werte der aktuellen Parameter bei Unterprogrammaufruf an formale Parameter gebunden - formale Parameter lokal im aufgerufenen Programm - keine Information geht an das aufrufende Programm zurück b) Call by reference - Unterprogramm erhält bei Aufruf Zeiger auf Adresse des aktuellen Parameters - Alle Operationen werden im Speicherbereich des aufrufenden Programms ausgeführt - Veränderungen bleiben nach Beendigung des Unterprogramms sichtbar G.Heyer 18 Digitale Informationsverarbeitung c) Call by value-result - Werte der aktuellen Parameter werden an formale Parameter gebunden - Berechnung verwendet formale Parameter lokal - Nach Prozedurende werden Werte der lokalen Parameter an aktuelle Parameter gebunden procedure p (x,y: integer); begin x := x + 1; y := y + 1; end begin a := 1; p (a,a); end Call by reference: Call by value-result: G.Heyer a=3 a = 2 (falls x y, abhängig von der Reihenfolge des Rückkopierens) 19 Digitale Informationsverarbeitung d) Call by name - Bei Unterprogrammaufruf werden formale Parameter durch aktuelle Parameter textuell ersetzt - Bindung des formalen Parameters an Speicherplatz wird jeweils neu ermittelt - Zuweisungen an einen formalen Parameter können verschiedene Speicherplätze betreffen Beispiel: procedure swap(a, b: integer) var temp: integer; begin temp := a; a := b; b := temp; end. für a, b sei call by name vereinbart. G.Heyer 20 Digitale Informationsverarbeitung Aufruf: Swap (i, a[i]) bewirkt Ausführung von temp := i; i := a[i]; a[i] := temp; Seien vor dem Aufruf i = 3 und a[3] = 4, nach dem Aufruf gilt: i = 4 und a[4] =3 (a[3] bleibt unverändert) Bei call by refence dagegen passiert das Erwartete (i=4 und a[3] = 3). G.Heyer 21 Digitale Informationsverarbeitung