Aufgabe 1. Die nicht gelistete Fälle sind korrekt.
si = ORD(CHR(71))
i := 1 + ENTIER(r)
si := SHORT(ENTIER(3.14))
b := 3 < MAX(REAL) OR li > i + 4
ch := "this is true"
i := 4 + CHR("a")
Aufgabe 2.
(a.) X * Y
(b.) x := x-1
Aufgabe 3.
M.i ist in M, C sichtbar
M.j ist in M, A, C sichtbar
M.A ist in M, A, B, C sichtbar
M.A.i ist in A sichbar
M.A.B ist in A, B sichtbar
M.A.B.i ist in B sichtbar
M.A.B.j ist in B sichtbar
M.A.B.k ist in B sichtbar
M.C ist in C, M sichtbar
Fehler: [ B* ] eine lokale Prozedur darf nicht exportiert werden.
i = 4; j = 2;
Aufgabe 4. Die zweite und die letzte Prozedursignaturen sind legal
Aufgabe 5. Die nicht gelistete Fälle sind korrekt.
Root(1, 3, 4, x1, x2, x3, x4)
Sin(3.14159)
i := Min(x, x1)
Root(a, b, c, 3, 4, 5, 6)
Aufgabe 6. Sonst wird die übergebene Variable nicht modifiziert
Aufgabe 7.
COPY(src, dst)
Aufgabe 8.
(a.)
PROCEDURE Length(x: ARRAY OF CHAR): INTEGER; VAR i: INTEGER; BEGIN i := 0; WHILE x[i] # 0X DO INC(i) END; RETURN i END Length;(b.)
6 7 5 32
Aufgabe 9.
Proc2: 0
Proc4: 1
Proc5: 0
Die Variable global in Proc5 is local definiert, während Proc3 die globale Variable ändert
Aufgabe 10.
5 25 25
Aufgabe 11.
PROCEDURE Min(a: ARRAY OF REAL): REAL; VAR m: REAL; i: INTEGER; BEGIN m := a[0]; FOR i := 1 TO LEN(a)-1 DO IF a[i] < m THEN m := a[i] END END; RETURN m END Min; PROCEDURE Max(a: ARRAY OF REAL): REAL; VAR m: REAL; i: INTEGER; BEGIN m := a[0]; FOR i := 1 TO LEN(a)-1 DO IF a[i] > m THEN m := a[i] END END; RETURN m END Max; PROCEDURE Average(a: ARRAY OF REAL): REAL; VAR s: REAL; i: INTEGER; BEGIN s := a[0]; FOR i := 1 TO LEN(a)-1 DO s := s + a[i] END; RETURN s / LEN(a) END Average;
Aufgabe 12.
3 2 1 1 2 3
Aufgabe 13.
PROCEDURE Concat(a, b: Node): Node; VAR c: Node; BEGIN IF a = NIL THEN RETURN b ELSIF b = NIL THEN RETURN a ELSE c := a; WHILE c.next # NIL DO c := c.next END; c.next := b; RETURN a END END Concat; PROCEDURE Mix(a, b: Node): Node; VAR r, na, nb: Node; BEGIN IF a = NIL THEN r := b ELSIF b = NIL THEN r := a ELSE r := a; LOOP na := a.next; a.next := b; IF na = NIL THEN EXIT END; nb := b.next; b.next := na; IF nb = NIL THEN EXIT END; a := na; b := nb END END; RETURN r END Mix;
Aufgabe 14.
PROCEDURE Height(tree: Node): INTEGER; VAR n: INTEGER; PROCEDURE Max(a, b): INTEGER; BEGIN IF a > b THEN RETURN a ELSE RETURN b END END Max; BEGIN IF tree = NIL THEN RETURN 0 ELSE RETURN Max(Height(tree.left), Height(tree.right))+1 END END Height;
Aufgabe 15. Falls diese Funktionen Seiteneffekte haben (d.h. sie lesen/schreiben globale Variablen)
Aufgabe 16.
(a)
FOR i := 0 TO LEN(A) DO c[i] := 0; FOR j := 0 TO LEN(A,1) DO c[i] := c[i] + a[i, j]*b[j] END END
(b) Katastrophe! Jede Änderung von c wirkt auf b!
(c) b soll kein VAR-Parameter sein
Aufgabe 17. Lösung fehlt (noch).
Aufgabe 18. Lösung fehlt (noch).
Aufgabe 19. Lösung fehlt (noch).
Aufgabe 20.
PROCEDURE Merge (VAR dst : Element; src1, src2 : Element); VAR tmp : Element; BEGIN /* First check for special cases: is one or both of the input lists empty? */ IF (src1 = NIL) & (src2 = NIL) THEN dst := NIL; ELSE IF src1 = NIL THEN dst := src2; src2 := src2.next; ELSE IF src2 = NIL THEN dst := src1; src1 := src1.next; ELSE IF src1.val < src2.val THEN dst := src1; src1 := src1.next; ELSE dst := src2; src2 := src2.next; END; END; END; /* Main loop: append the smallest element of src1/src2 to list. */ tmp := dst; /* tmp always points to the last element of list. */ WHILE (src1 # NIL) & (src2 # NIL) DO IF src1.val < src2.val THEN tmp.next := src1; src1 := src1.next; ELSE tmp.next := src2; src2 := src2.next; END; tmp := tmp.next; END; /* Append the rest of the non-empty list. */ IF src1 # NIL THEN tmp.next := src1; ELSE tmp.next := src2; END; END; END Merge;